checkService(); $requestItem->applyUrlTemplate(self::$APP_DATA_PATH); $userIds = $requestItem->getUsers(); if (count($userIds) < 1) { throw new InvalidArgumentException("No userId specified"); } elseif (count($userIds) > 1) { throw new InvalidArgumentException("Multiple userIds not supported"); } return $this->service->deletePersonData($userIds[0], $requestItem->getGroup(), $requestItem->getAppId(), $requestItem->getFields(), $requestItem->getToken()); } /** * /appdata/{userId}/{groupId}/{appId} * - fields={field1, field2} * * examples: * /appdata/john.doe/@friends/app?fields=count * /appdata/john.doe/@self/app */ public function handleGet(RequestItem $requestItem) { $this->checkService(); $requestItem->applyUrlTemplate(self::$APP_DATA_PATH); $userIds = $requestItem->getUsers(); if (count($userIds) < 1) { throw new InvalidArgumentException("No userId(s) specified"); } return $this->service->getPersonData($userIds[0], $requestItem->getGroup(), $requestItem->getAppId(), $requestItem->getFields(), $requestItem->getToken()); } /** * /appdata/{userId}/{groupId}/{appId} * - fields={field1, field2} * * examples: * /appdata/john.doe/@friends/app?fields=count * /appdata/john.doe/@self/app * * The post data should be a regular json object. All of the fields vars will * be pulled from the values and set on the person object. If there are no * fields vars then all of the data will be overridden. */ public function handlePost(RequestItem $requestItem) { $this->checkService(); $requestItem->applyUrlTemplate(self::$APP_DATA_PATH); $userIds = $requestItem->getUsers(); if (count($userIds) < 1) { throw new InvalidArgumentException("No userId specified"); } elseif (count($userIds) > 1) { throw new InvalidArgumentException("Multiple userIds not supported"); } $values = $requestItem->getParameter("data"); // this used to be $requestItem->getFields() instead of using the fields, but that makes no sense to me // better to detect the fields depending on input right? $fields = array(); foreach (array_keys($values) as $key) { $fields[] = $key; if (! $this->isValidKey($key)) { throw new SocialSpiException("One or more of the app data keys are invalid: " . $key, ResponseError::$BAD_REQUEST); } } $this->service->updatePersonData($userIds[0], $requestItem->getGroup(), $requestItem->getAppId(), $fields, $values, $requestItem->getToken()); } /** * /appdata/{userId}/{groupId}/{appId} * - fields={field1, field2} * * examples: * /appdata/john.doe/@friends/app?fields=count * /appdata/john.doe/@self/app * * The post data should be a regular json object. All of the fields vars will * be pulled from the values and set on the person object. If there are no * fields vars then all of the data will be overridden. */ public function handlePut(RequestItem $requestItem) { return $this->handlePost($requestItem); } /** * Determines whether the input is a valid key. * * @param key the key to validate. * @return true if the key is a valid appdata key, false otherwise. */ public static function isValidKey($key) { if (empty($key)) { return false; } for ($i = 0; $i < strlen($key); ++ $i) { $c = substr($key, $i, 1); if (($c >= 'a' && $c <= 'z') || ($c >= 'A' && $c <= 'Z') || ($c >= '0' && $c <= '9') || ($c == '-') || ($c == '_') || ($c == '.')) { continue; } return false; } return true; } }