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

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

Last change on this file since 9562 was 9562, checked in by ShogoKawahara, 12 years ago

#3119:added some actions for the OpenSocial application configuration

File size: 8.2 KB
Line 
1<?php
2
3/**
4 * opJsonDbOpensocialService
5 *
6 */
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          $fieldNames = explode("_",$fieldName);
70          $fieldNames[0] = strtolower($fieldNames[0]);
71          for ($i = 1;$i < count($fieldNames);$i++)
72          {
73            $fieldNames[$i] = ucfirst(strtolower($fieldNames[$i]));
74          }
75          $fieldName = implode("",$fieldNames);
76          switch ($memberProfile->getProfile()->getFormType())
77          {
78            case "date":
79              $p[$fieldName] = date("Y/m/d",strtotime($memberProfile->getValue()));
80              break;
81            default:
82              $p[$fieldName] = $memberProfile->getValue();
83          }
84        }
85      }
86      $people[] = $p;
87    }
88    $collection = new RestfulCollection($people, $options->getStartIndex(), $totalSize);
89    $collection->setItemsPerPage($options->getCount());
90    return $collection;
91  }
92
93  public function getActivities($userIds, $groupId, $appId, $sortBy, $filterBy, $startIndex, $count, $fields, $token)
94  {
95    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
96  }
97
98  public function getActivity($userId, $groupId, $appdId, $fields, $activityId, SecurityToken $token)
99  {
100    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
101  }
102
103  public function deleteActivities($userId, $groupId, $appId, $activityIds, SecurityToken $token)
104  {
105    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
106  }
107
108  public function createActivity($userId, $groupId, $appId, $fields, $activity, SecurityToken $token)
109  {
110    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
111  }
112
113  public function getPersonData($userId, GroupId $groupId, $appId, $fields, SecurityToken $token)
114  {
115    $ids = $this->getIdSet($userId, $groupId, $token);
116    $criteria = new Criteria();
117    $criteria->addJoin(ApplicationSettingPeer::MEMBER_APPLICATION_ID, MemberApplicationPeer::ID);
118    $criteria->add(MemberApplicationPeer::APPLICATION_ID, $appId);
119    $criteria->add(MemberApplicationPeer::MEMBER_ID, $ids, Criteria::IN);
120    $app_settings = ApplicationSettingPeer::doSelect($criteria);
121    if (!count($app_settings))
122    {
123      throw new SocialSpiException("UnKnown person app data key(s): ".implode(', ', $fields));
124    }
125    $data = array();
126    foreach($app_settings as $app_setting)
127    {
128      $data[$app_setting->getMemberApplication()->getMemberId()][$app_setting->getName()] = $app_setting->getValue();
129    }
130    return new DataCollection($data);
131  }
132
133  public function deletePersonData($userId, GroupId $groupId, $appId, $fields, SecurityToken $token)
134  {
135    foreach ($fields as $key)
136    {
137      if (!preg_match('/[\w\-\.]+/',$key))
138      {
139        throw new SocialSpiException("The person app data key had in valid characters", ResponseError::$BAD_REQUEST);
140      }
141    }
142    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
143  }
144
145  public function updatePersonData(UserId $userId, GroupId $groupId, $appId, $fields, $values, SecurityToken $token)
146  {
147    if ($userId->getUserId($token) == null)
148    {
149      throw new SocialSpiException("Unknown person id.", ResponseError::$NOT_FOUND);
150    }
151
152    foreach ($fields as $key)
153    {
154      if (!preg_match('/[\w\-\.]+/',$key))
155      {
156        throw new SocialSpiException("The person app data key had invalid characters", ResponseError::$BAD_REQUEST);
157      }
158    }
159    switch ($groupId->getType())
160    {
161      case 'self':
162        foreach ($fields as $key)
163        {
164          $value = isset($values[$key]) ? $values[$key] : null;
165          $criteria = new Criteria();
166          $criteria->add(ApplicationSettingPeer::MEMBER_APPLICATION_ID, $token->getModuleId());
167          $criteria->add(ApplicationSettingPeer::NAME, $key);
168          $app_setting = ApplicationSettingPeer::doSelectOne($criteria);
169          if (!$app_setting)
170          {
171            $app_setting = new ApplicationSetting();
172            $app_setting->setMemberApplicationId($token->getModuleId());
173            $app_setting->setName($key);
174          }
175          $app_setting->setValue($value);
176          $app_setting->save();
177        }
178        break;
179      default:
180        throw new SocialSpiException("We don't support updating data in batches yet", ResponseError::$NOT_IMPLEMENTED);
181    }
182  }
183
184  public function createMessage($userId, $appId, $message, $optionalMessageId, SecurityToken $token)
185  {
186    throw new SocialSpiException("Not implemented", ResponseError::$NOT_IMPLEMENTED);
187  }
188
189  private function getIdSet($user, GroupId $group, SecurityToken $token)
190  {
191    $ids = array();
192    if ($user instanceof UserId)
193    {
194      $userId = $user->getUserId($token);
195      if ($group == null)
196      {
197        return array($userId);
198      }
199      switch ($group->getType())
200      {
201        case 'all':
202        case 'friends':
203        case 'groupId':
204
205          $criteria = new Criteria();
206          $criteria->add(MemberRelationshipPeer::MEMBER_ID_FROM,$userId);
207          $criteria->add(MemberRelationshipPeer::IS_FRIEND, true);
208          $friends = MemberRelationshipPeer::doSelect($criteria);
209         
210          $friendIds = array();
211          foreach ($friends as $friend)
212          {
213            $friendIds[] = $friend->getMemberIdTo();
214          }
215          if (count($friendIds))
216          {
217            $ids = $friendIds;
218          }
219          break;
220        case 'self':
221          $ids[] = $userId;
222          break;
223      }
224    }
225    elseif (is_array($user))
226    {
227      $ids = array();
228      foreach ($user as $id)
229      {
230        $ids = array_merge($ids, $this->getIdSet($id, $group, $token));
231      }
232    }
233    return $ids;
234  }
235}
Note: See TracBrowser for help on using the repository browser.