Beispiel #1
0
 /**
  * {@inheritDoc}
  */
 public function hydrate(Request $request, EntityInterface $entity, ErrorStore $errorStore)
 {
     $data = $request->getContent();
     if (Request::CREATE === $request->getOperation()) {
         // Accept the passed ingester only on CREATE to prevent overwriting
         // on subsequent UPDATE requests.
         $ingesterName = $request->getValue('o:ingester');
     } else {
         $ingesterName = $entity->getIngester();
     }
     $ingester = $this->getServiceLocator()->get('Omeka\\MediaIngesterManager')->get($ingesterName);
     if (Request::CREATE === $request->getOperation()) {
         if ($ingester instanceof Fallback) {
             $errorStore->addError('o:ingester', 'Media must set a valid ingester.');
             return;
         }
         $entity->setIngester($ingesterName);
         $entity->setRenderer($ingester->getRenderer());
         if (isset($data['o:item']['o:id'])) {
             $item = $this->getAdapter('items')->findEntity($data['o:item']['o:id']);
             $entity->setItem($item);
         }
         if (isset($data['data'])) {
             $entity->setData($data['data']);
         }
         if (isset($data['o:source'])) {
             $entity->setSource($data['o:source']);
         }
     }
     parent::hydrate($request, $entity, $errorStore);
     if ($this->shouldHydrate($request, 'o:lang')) {
         $entity->setLang($request->getValue('o:lang', null));
     }
     if (Request::CREATE === $request->getOperation()) {
         $ingester->ingest($entity, $request, $errorStore);
     } elseif ($ingester instanceof MutableIngesterInterface) {
         $ingester->update($entity, $request, $errorStore);
     }
 }
Beispiel #2
0
 /**
  * {@inheritDoc}
  */
 public function hydrate(Request $request, EntityInterface $entity, ErrorStore $errorStore)
 {
     $data = $request->getContent();
     if (Request::CREATE === $request->getOperation() && isset($data['o:site']['o:id'])) {
         $site = $this->getAdapter('sites')->findEntity($data['o:site']['o:id']);
         $this->authorize($site, 'add-page');
         $entity->setSite($site);
     }
     if ($this->shouldHydrate($request, 'o:slug')) {
         $entity->setSlug($request->getValue('o:slug'));
     }
     if ($this->shouldHydrate($request, 'o:title')) {
         $entity->setTitle($request->getValue('o:title'));
     }
     $appendBlocks = $request->getOperation() === Request::UPDATE && $request->isPartial();
     $this->hydrateBlocks($request->getValue('o:block', []), $entity, $errorStore, $appendBlocks);
 }
Beispiel #3
0
 /**
  * Execute an API request.
  * 
  * @param Request $request
  * @return Response
  */
 public function execute(Request $request)
 {
     try {
         $t = $this->getTranslator();
         // Validate the request.
         if (!$request->isValidOperation($request->getOperation())) {
             throw new Exception\BadRequestException(sprintf($t->translate('The API does not support the "%1$s" request operation.'), $request->getOperation()));
         }
         if (!is_array($request->getContent())) {
             throw new Exception\BadRequestException(sprintf($t->translate('The API request content must be a JSON object (for HTTP) or PHP array. "%1$s" given.'), gettype($request->getContent())));
         }
         // Get the adapter.
         try {
             $adapter = $this->getServiceLocator()->get('Omeka\\ApiAdapterManager')->get($request->getResource());
         } catch (ServiceNotFoundException $e) {
             throw new Exception\BadRequestException(sprintf($t->translate('The API does not support the "%1$s" resource.'), $request->getResource()));
         }
         // Verify that the current user has general access to this resource.
         $acl = $this->getServiceLocator()->get('Omeka\\Acl');
         if (!$acl->userIsAllowed($adapter, $request->getOperation())) {
             throw new Exception\PermissionDeniedException(sprintf($t->translate('Permission denied for the current user to %1$s the %2$s resource.'), $request->getOperation(), $adapter->getResourceId()));
         }
         // Trigger the api.execute.pre event.
         $event = new Event(Event::API_EXECUTE_PRE, $adapter, ['services' => $this->getServiceLocator(), 'request' => $request]);
         $adapter->getEventManager()->trigger($event);
         // Trigger the api.{operation}.pre event.
         $event = new Event('api.' . $request->getOperation() . '.pre', $adapter, ['services' => $this->getServiceLocator(), 'request' => $request]);
         $adapter->getEventManager()->trigger($event);
         switch ($request->getOperation()) {
             case Request::SEARCH:
                 $response = $adapter->search($request);
                 break;
             case Request::CREATE:
                 $response = $adapter->create($request);
                 break;
             case Request::BATCH_CREATE:
                 $response = $this->executeBatchCreate($request, $adapter);
                 break;
             case Request::READ:
                 $response = $adapter->read($request);
                 break;
             case Request::UPDATE:
                 $response = $adapter->update($request);
                 break;
             case Request::DELETE:
                 $response = $adapter->delete($request);
                 break;
             default:
                 throw new Exception\BadRequestException(sprintf($t->translate('The API does not support the "%1$s" request operation.'), $request->getOperation()));
         }
         // Validate the response.
         if (!$response instanceof Response) {
             throw new Exception\BadResponseException(sprintf($t->translate('The "%1$s" operation for the "%2$s" adapter did not return a valid response.'), $request->getOperation(), $request->getResource()));
         }
         if (!$response->isValidStatus($response->getStatus())) {
             throw new Exception\BadResponseException(sprintf($t->translate('The "%1$s" operation for the "%2$s" adapter did not return a valid response status.'), $request->getOperation(), $request->getResource()));
         }
         if (!$this->isValidResponseContent($response)) {
             throw new Exception\BadResponseException(sprintf($t->translate('The "%1$s" operation for the "%2$s" adapter did not return valid response content.'), $request->getOperation(), $request->getResource()));
         }
         // Trigger the api.{operation}.post event.
         $event = new Event('api.' . $request->getOperation() . '.post', $adapter, ['services' => $this->getServiceLocator(), 'request' => $request, 'response' => $response]);
         $adapter->getEventManager()->trigger($event);
         // Trigger the api.execute.post event.
         $event = new Event(Event::API_EXECUTE_POST, $adapter, ['services' => $this->getServiceLocator(), 'request' => $request, 'response' => $response]);
         $adapter->getEventManager()->trigger($event);
     } catch (Exception\ValidationException $e) {
         $this->getServiceLocator()->get('Omeka\\Logger')->err((string) $e);
         $response = new Response();
         $response->setStatus(Response::ERROR_VALIDATION);
         $response->mergeErrors($e->getErrorStore());
     }
     $response->setRequest($request);
     return $response;
 }
Beispiel #4
0
 public function testConstructorSetsProperties()
 {
     $request = new Request('search', 'foo');
     $this->assertEquals('search', $request->getOperation());
     $this->assertEquals('foo', $request->getResource());
 }
 /**
  * Check whether to hydrate on a key.
  *
  * @param Request $request
  * @param string $key
  * @return bool
  */
 public function shouldHydrate(Request $request, $key)
 {
     if ($request->getOperation() === Request::UPDATE && $request->isPartial()) {
         // Conditionally hydrate on partial_update operation.
         return array_key_exists($key, $request->getContent());
     }
     // Always hydrate on create and update operations.
     return true;
 }