/** * * Process HTTP PUT request on collections * * collections/{collection} | Update {collection} * collections/{collection}/{feature} | Update {feature} * * @param array $segments * @param array $data */ private function PUT_collections($segments, $data) { /* * {collection} is mandatory and no modifier is allowed */ if (!isset($segments[1]) || isset($segments[3])) { RestoLogUtil::httpError(404); } $collection = new RestoCollection($segments[1], $this->context, $this->user, array('autoload' => true)); $featureIdentifier = isset($segments[2]) ? $segments[2] : null; if (isset($featureIdentifier)) { $feature = new RestoFeature($this->context, $this->user, array('featureIdentifier' => $featureIdentifier, 'collection' => $collection)); if (!$feature->isValid()) { RestoLogUtil::httpError(404); } } /* * Only owner of the collection can update it */ if (!$this->user->hasRightsTo(RestoUser::UPDATE, array('collection' => $collection))) { RestoLogUtil::httpError(403); } /* * collections/{collection} */ if (!isset($feature)) { $collection->loadFromJSON($data, true); if ($this->context->storeQuery === true) { $this->user->storeQuery($this->context->method, 'update', $collection->name, null, $this->context->query, $this->context->getUrl()); } return RestoLogUtil::success('Collection ' . $collection->name . ' updated'); } else { RestoLogUtil::httpError(501); } }
/** * * Process HTTP GET request on collections * * @param array $segments */ private function GET_collections($segments) { if (isset($segments[1])) { $collection = new RestoCollection($segments[1], $this->context, $this->user, array('autoload' => true)); } if (isset($segments[2])) { $feature = new RestoFeature($this->context, $this->user, array('featureIdentifier' => $segments[2], 'collection' => $collection)); if (!$feature->isValid()) { RestoLogUtil::httpError(404); } } /** * Collection descriptions * * @SWG\Get( * tags={"collections"}, * path="/collections.{format}", * summary="Describe", * description="Returns a list of all collection descriptions including license information and collection content statistics (i.e. number of products, etc.)", * produces={"application/json"}, * @SWG\Parameter( * name="format", * in="path", * description="Output format", * required=true, * type="string", * @SWG\Items(type="string"), * enum={"json"} * ), * @SWG\Response( * response="200", * description="List of all collection descriptions" * ) * ) * */ if (!isset($collection)) { return new RestoCollections($this->context, $this->user, array('autoload' => true)); } else { if (!isset($feature->identifier)) { return $collection; } else { if (!isset($segments[3])) { if ($this->context->storeQuery === true) { $this->user->storeQuery($this->context->method, 'resource', $collection->name, $feature->identifier, $this->context->query, $this->context->getUrl()); } return $feature; } else { if ($segments[3] === 'download') { return $this->downloadFeature($collection, $feature, isset($this->context->query['_tk']) ? $this->context->query['_tk'] : null); } else { if ($segments[3] === 'wms') { return $this->viewFeature($collection, $feature, isset($this->context->query['_tk']) ? $this->context->query['_tk'] : null); } else { RestoLogUtil::httpError(404); } } } } } }
/** * @depends testInsertResource */ public function testResource() { $this->initContext(); $data = file_get_contents(dirname(__FILE__) . "/../data/Landsat.json"); $data = json_decode($data, true); $collection = new RestoCollection($data['name'], $this->context, $this->admin, array('autoload' => true)); $feature = new RestoFeature($this->context, $this->admin, array('featureIdentifier' => 'c5dc1f32-002d-5ee9-bd4a-c690461eb734', 'collection' => $collection)); $this->assertEquals(true, $feature->isValid()); $license = $feature->getLicense(); $this->assertEquals('Example', $license->licenseId); $json = json_decode($feature->toJSON(false)); $this->assertEquals('c5dc1f32-002d-5ee9-bd4a-c690461eb734', $json->id); $arr_feature = $feature->toArray(); $this->assertEquals('c5dc1f32-002d-5ee9-bd4a-c690461eb734', $arr_feature['id']); try { $feature->download(); $this->fail('An expected exception has not been raised.'); } catch (Exception $ex) { } }
/** * * Process collections * * collections/{collection} | Delete {collection} * collections/{collection}/{feature} | Delete {feature} * * @param array $segments */ private function DELETE_collections($segments) { /* * {collection} is mandatory and no modifier is allowed */ if (!isset($segments[1]) || isset($segments[3])) { RestoLogUtil::httpError(404); } $collection = new RestoCollection($segments[1], $this->context, $this->user, array('autoload' => true)); if (isset($segments[2])) { $feature = new RestoFeature($this->context, $this->user, array('featureIdentifier' => $segments[2], 'collection' => $collection)); if (!$feature->isValid()) { RestoLogUtil::httpError(404); } } /* * Only owner of a collection can delete it */ if (!$this->user->hasRightsTo(RestoUser::UPDATE, array('collection' => $collection))) { RestoLogUtil::httpError(403); } /** * collections/{collection} * * @SWG\Delete( * tags={"collection"}, * path="/collections/{collectionId}", * summary="Delete collection", * description="Delete collection {collectionId} if collection is not empty", * operationId="deleteCollection", * produces={"application/json"}, * @SWG\Parameter( * name="collectionId", * in="path", * description="Collection identifier", * required=true, * type="string", * @SWG\Items(type="string") * ), * @SWG\Response( * response="200", * description="Acknowledgment on successful collection deletion" * ), * @SWG\Response( * response="404", * description="Collection not found" * ), * @SWG\Response( * response="403", * description="Forbidden" * ) * ) */ if (!isset($feature)) { $collection->removeFromStore(); /* * Store query */ if ($this->context->storeQuery === true) { $this->user->storeQuery($this->context->method, 'remove', $collection->name, null, $this->context->query, $this->context->getUrl()); } return RestoLogUtil::success('Collection ' . $collection->name . ' deleted'); } else { $feature->removeFromStore(); /* * Store query */ if ($this->context->storeQuery === true) { $this->user->storeQuery($this->context->method, 'remove', $collection->name, $feature->identifier, $this->context->query, $this->context->getUrl()); } return RestoLogUtil::success('Feature ' . $feature->identifier . ' deleted', array('featureIdentifier' => $feature->identifier)); } }