ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE3/plugins/opOpenSocialPlugin/trunk/lib/user/opJsonDbOpensocialService.class.php @ 10546

Last change on this file since 10546 was 10546, checked in by ShogoKawahara, 13 years ago

#3500:added some classes to encrypt token without mcrypt of php module

File size: 8.8 KB
Line 
1<?php
2
3/**
4 * opJsonDbOpensocialService
5 *
6 * @author Shogo Kawahara <kawahara@tejimaya.net>
7 */
8class opJsonDbOpensocialService implements ActivityService, PersonService, AppDataService, MessagesService
9{
10  public function getPerson($userId, $groupId, $fields, SecurityToken $token)
11  {
12    if (!is_object($userId))
13    {
14      $userId  = new UserId('userId', $userId);
15      $groupId = new GroupId('self', 'all'); 
16    }
17    $person = $this->getPeople($userId, $groupId, new CollectionOptions(), $fields, $token);
18    if (is_array($person->getEntry()))
19    {
20      $person = $person->getEntry();
21      if (is_array($person) && count($person) == 1)
22      {
23        return array_pop($person);
24      }
25    }
26    throw new SocialSpiException("Person not found", ResponseError::$BAD_REQUEST);
27  }
28
29  public function getPeople($userId, $groupId, CollectionOptions $options, $fields, SecurityToken $token)
30  {
31    sfLoader::loadHelpers("Asset");
32    sfLoader::loadHelpers("sfImage");
33    $ids = $this->getIdSet($userId, $groupId, $token);
34    $first = $options->getStartIndex();
35    $max   = $options->getCount();
36    $ret = array();
37    $criteria = new Criteria();
38    $criteria->add(MemberPeer::ID, $ids, Criteria::IN);
39    $totalSize = MemberPeer::doCount($criteria);
40    $criteria->addAscendingOrderByColumn(MemberPeer::ID);
41    if ($first !== false && $max !== false && is_numeric($first) && is_numeric($max) && $first >= 0 && $max > 0)
42    {
43      $criteria->setOffset($first);
44      $criteria->setLimit($max);
45    }
46    $members = MemberPeer::doSelect($criteria);
47    $people = array();
48    foreach ($members as $member)
49    {
50      $p = array();
51      $p['isOwner']  =  (!$token->isAnonymous() && $member->getId() == $token->getOwnerId()) ? true : false;
52      $p['isViewer'] =  (!$token->isAnonymous() && $member->getId() == $token->getViewerId()) ? true : false;
53      $p['id']           = $member->getId();
54      $p['displayName']  = $member->getName();
55      $p['thumbnailUrl'] = "";
56      if ($member->getImage())
57      {
58        $p['thumbnailUrl'] = sf_image_path($member->getImage()->getFile()->getName(),
59          array('size' => '180x180'), true);
60      }
61      $p['profileUrl']   = sfContext::getInstance()->getController()->genUrl("@member_profile?id=".$member->getId(),true);
62      $memberProfiles = MemberProfilePeer::getProfileListByMemberId($member->getId());
63      foreach ($memberProfiles as $memberProfile)
64      {
65        $osPersonField = $memberProfile->getProfile()->getOpensocialPersonField();
66        if ($osPersonField)
67        {
68          $fieldName = $osPersonField->getFieldName();
69          switch ($memberProfile->getProfile()->getFormType())
70          {
71            case "date":
72              $p[$fieldName] = date("Y/m/d",strtotime($memberProfile->getValue()));
73              break;
74            default:
75              $p[$fieldName] = $memberProfile->getValue();
76          }
77        }
78      }
79      $people[] = $p;
80    }
81    $collection = new RestfulCollection($people, $options->getStartIndex(), $totalSize);
82    $collection->setItemsPerPage($options->getCount());
83    return $collection;
84  }
85
86  public function getActivities($userIds, $groupId, $appId, $sortBy, $filterBy, $filterOp, $filterValue, $startIndex, $count, $fields, $activityIds ,$token)
87  {
88    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
89  }
90
91  public function getActivity($userId, $groupId, $appdId, $fields, $activityId, SecurityToken $token)
92  {
93    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
94  }
95
96  public function deleteActivities($userId, $groupId, $appId, $activityIds, SecurityToken $token)
97  {
98    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
99  }
100
101  public function createActivity($userId, $groupId, $appId, $fields, $activity, SecurityToken $token)
102  {
103    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
104  }
105
106  public function getPersonData($userId, GroupId $groupId, $appId, $fields, SecurityToken $token)
107  {
108    $ids = $this->getIdSet($userId, $groupId, $token);
109    $criteria = new Criteria();
110    $criteria->addJoin(ApplicationPersistentDataPeer::MEMBER_APPLICATION_ID, MemberApplicationPeer::ID);
111    $criteria->add(MemberApplicationPeer::APPLICATION_ID, $appId);
112    $criteria->add(MemberApplicationPeer::MEMBER_ID, $ids, Criteria::IN);
113    if (count($fields))
114    {
115      $criteria->add(ApplicationPersistentDataPeer::KEY, $fields, Criteria::IN);
116    } 
117    $persistentDatas = ApplicationPersistentDataPeer::doSelect($criteria);
118    if (!count($persistentDatas))
119    {
120      throw new SocialSpiException("UnKnown person app data key(s): ".implode(', ', $fields));
121    }
122    $data = array();
123    foreach($persistentDatas as $persistentData)
124    {
125      $data[$persistentData->getMemberApplication()->getMemberId()][$persistentData->getKey()] = $persistentData->getValue();
126    }
127    return new DataCollection($data);
128  }
129
130  public function deletePersonData($userId, GroupId $groupId, $appId, $fields, SecurityToken $token)
131  {
132    foreach ($fields as $key)
133    {
134      if (!preg_match('/[\w\-\.]+/',$key))
135      {
136        throw new SocialSpiException("The person app data key had in valid characters", ResponseError::$BAD_REQUEST);
137      }
138    }
139    $ids = $this->getIdSet($userId, $groupId, $token);
140    if (count($ids) < 1)
141    {
142      throw new InvalidArgumentException("No userId specified");
143    }
144    else if (count($ids) > 1)
145    {
146      throw new InvalidArgumentException("Multiple userIds not supported");
147    }
148    $userId = $ids[0];
149    $appId = $token->getAppId();
150    foreach ($fields as $key)
151    {
152      $criteria = new Criteria();
153      $criteria->addJoin(ApplicationPersistentDataPeer::MEMBER_APPLICATION_ID, MemberApplicationPeer::ID);
154      $criteria->add(MemberApplicationPeer::APPLICATION_ID, $appId);
155      $criteria->add(MemberApplicationPeer::MEMBER_ID, $userId);
156      $criteria->add(ApplicationPersistentDataPeer::KEY, $key);
157      $persistentData = ApplicationPersistentDataPeer::doSelectOne($criteria);
158      if (!$persistentData)
159      {
160        throw new SocialSpiException("Internal server error", ResponseError::$INTERNAL_ERROR);
161      }
162      $persistentData->delete();
163    }
164  }
165
166  public function updatePersonData(UserId $userId, GroupId $groupId, $appId, $fields, $values, SecurityToken $token)
167  {
168    if ($userId->getUserId($token) == null)
169    {
170      throw new SocialSpiException("Unknown person id.", ResponseError::$NOT_FOUND);
171    }
172
173    foreach ($fields as $key)
174    {
175      if (!preg_match('/[\w\-\.]+/',$key))
176      {
177        throw new SocialSpiException("The person app data key had invalid characters", ResponseError::$BAD_REQUEST);
178      }
179    }
180    switch ($groupId->getType())
181    {
182      case 'self':
183        foreach ($fields as $key)
184        {
185          $value = isset($values[$key]) ? $values[$key] : null;
186          $criteria = new Criteria();
187
188          $criteria->add(ApplicationPersistentDataPeer::MEMBER_APPLICATION_ID, $token->getModuleId());
189          $criteria->add(ApplicationPersistentDataPeer::KEY, $key);
190          $persistentData = ApplicationPersistentDataPeer::doSelectOne($criteria);
191          if (!$persistentData)
192          {
193            $persistentData = new ApplicationPersistentData();
194            $persistentData->setMemberApplicationId($token->getModuleId());
195            $persistentData->setKey($key);
196          }
197          $persistentData->setValue($value);
198          $persistentData->save();
199        }
200        break;
201      default:
202        throw new SocialSpiException("We don't support updating data in batches yet", ResponseError::$NOT_IMPLEMENTED);
203    }
204  }
205
206  public function createMessage($userId, $appId, $message, $optionalMessageId, SecurityToken $token)
207  {
208    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
209  }
210
211  private function getIdSet($user, GroupId $group, SecurityToken $token)
212  {
213    $ids = array();
214    if ($user instanceof UserId)
215    {
216      $userId = $user->getUserId($token);
217      if ($group == null)
218      {
219        return array($userId);
220      }
221      switch ($group->getType())
222      {
223        case 'all':
224        case 'friends':
225        case 'groupId':
226
227          $criteria = new Criteria();
228          $criteria->add(MemberRelationshipPeer::MEMBER_ID_FROM,$userId);
229          $criteria->add(MemberRelationshipPeer::IS_FRIEND, true);
230          $friends = MemberRelationshipPeer::doSelect($criteria);
231         
232          $friendIds = array();
233          foreach ($friends as $friend)
234          {
235            $friendIds[] = $friend->getMemberIdTo();
236          }
237          if (count($friendIds))
238          {
239            $ids = $friendIds;
240          }
241          break;
242        case 'self':
243          $ids[] = $userId;
244          break;
245      }
246    }
247    elseif (is_array($user))
248    {
249      $ids = array();
250      foreach ($user as $id)
251      {
252        $ids = array_merge($ids, $this->getIdSet($id, $group, $token));
253      }
254    }
255    return $ids;
256  }
257}
Note: See TracBrowser for help on using the repository browser.