em = $entityManager; } public function getName() { return 'skobkin_point_tools_api_user'; } /** * Get user subscribers by user login * * @param string $login * @return User[] */ public function getUserSubscribersByLogin($login) { $usersList = $this->getGetRequestData('/api/user/' . $login . '/subscribers', [], true); $users = $this->getUsersFromList($usersList); return $users; } /** * Get user subscribers by user id * * @param int $id * @return User[] */ public function getUserSubscribersById($id) { if (!is_numeric($id)) { throw new \InvalidArgumentException('$id must be an integer'); } $usersList = $this->getGetRequestData('/api/user/id/' . (int) $id . '/subscribers', [], true); $users = $this->getUsersFromList($usersList); return $users; } /** * Get user subscriptions by user login * * @param string $login * @return User[] */ public function getUserSubscriptionsByLogin($login) { $usersList = $this->getGetRequestData('/api/user/' . $login . '/subscriptions', [], true); $users = $this->getUsersFromList($usersList); return $users; } /** * Get user subscriptions by user id * * @param int $id * @return User[] */ public function getUserSubscriptionsById($id) { if (!is_numeric($id)) { throw new \InvalidArgumentException('$id must be an integer'); } $usersList = $this->getGetRequestData('/api/user/id/' . (int) $id . '/subscriptions', [], true); $users = $this->getUsersFromList($usersList); return $users; } /** * @return User[] */ private function getUsersFromList(array $users = []) { if (!is_array($users)) { throw new \InvalidArgumentException('$users must be an array'); } /** @var EntityRepository $userRepo */ $userRepo = $this->em->getRepository('SkobkinPointToolsBundle:User'); $resultUsers = []; foreach ($users as $userData) { if (array_key_exists('id', $userData) && array_key_exists('login', $userData) && array_key_exists('name', $userData) && is_numeric($userData['id'])) { // @todo Optimize with prehashed id's list $user = $userRepo->findOneBy(['id' => $userData['id']]); if (!$user) { $user = new User(); $user->setId((int) $userData['id']); $this->em->persist($user); try { $this->em->flush(); } catch (\Exception $e) { throw new ApiException(sprintf('Error while flushing new user [%d] %s', $user->getId(), $user->getLogin()), 0, $e); } } // Updating data if ($user->getLogin() !== $userData['login']) { $user->setLogin($userData['login']); } if ($user->getName() !== $userData['name']) { $user->setName($userData['name']); } try { $this->em->flush(); } catch (\Exception $e) { throw new ApiException(sprintf('Error while flushing changes for [%d] %s', $user->getId(), $user->getLogin()), 0, $e); } $resultUsers[] = $user; } } return $resultUsers; } /** * @param $login */ public function getAvatarUrl(User $user, $size) { return ($this->useHttps ? 'https://' : 'http://') . $this->avatarsBaseUrl . $user->getLogin() . '/' . $size; } }