/** * Hydrate a new object from an array of data extracted from a returned json * * @param array $data JSON interpreted data returned by the calendar's api * * @throws InvalidArgumentException The data is not valid * @return static Calendar instance */ public static function hydrate(array $data, User $user = null) { if (!isset($data['id'], $data['summary'], $data['timeZone'])) { throw new InvalidArgumentException(sprintf('Missing at least one of the mandatory properties "id", "summary" or "timeZone" ; got ["%s"]', implode('", "', array_keys($data)))); } $calendar = new static($data['id'], $data['summary'], new DateTimeZone($data['timeZone'])); if (isset($data['description'])) { $calendar->description = $data['description']; } if (null !== $user && isset($data['accessRole'])) { $calendar->addPermission(UserPermission::hydrate($calendar, $user, $data['accessRole'])); } $calendar->raw = $data; return $calendar; }
/** {@inheritDoc} */ public function getPermissions(AbstractCalendar $calendar, AbstractCriterion $criterion = null) { $query = new Collection([new Collection([new Field('items', [new Field('id'), new Field('scope'), new Field('role')])], 'fields')]); if (null !== $criterion) { $query = $query->merge($criterion); } $response = $this->guzzle->get(sprintf('calendars/%s/acl', $calendar->getId()), ['query' => $query->build()]); if (200 > $response->getStatusCode() || 300 <= $response->getStatusCode()) { throw new ApiErrorException($response); } $result = $response->json(); $list = new ArrayCollection(); foreach ($result['items'] as $item) { // only user scope are supported if ('user' !== $item['scope']['type']) { continue; } $user = in_array($item['scope']['value'], $this->adapter->getUser()->getEmail(true)) ? $this->adapter->getUser() : User::hydrate(['email' => $item['scope']['value']]); $list[$item['id']] = UserPermission::hydrate($calendar, $user, $item['role']); } $calendar->setPermissions($list); return $list; }