diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 35f195d037..d2387763e9 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -12,7 +12,6 @@ namespace Alchemy\Phrasea; use Alchemy\Geonames\GeonamesServiceProvider; -use Alchemy\Phrasea\ControllerProvider\Admin\Fields; use Alchemy\Phrasea\ControllerProvider\Admin\Publications; use Alchemy\Phrasea\ControllerProvider\Admin\Root as AdminRoot; use Alchemy\Phrasea\ControllerProvider\Admin\SearchEngine; @@ -312,6 +311,7 @@ class Application extends SilexApplication 'Alchemy\Phrasea\ControllerProvider\Admin\Dashboard' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\Databox' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\Databoxes' => [], + 'Alchemy\Phrasea\ControllerProvider\Admin\Fields' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\Users' => [], 'Alchemy\Phrasea\ControllerProvider\Datafiles' => [], 'Alchemy\Phrasea\ControllerProvider\Lightbox' => [], @@ -621,7 +621,6 @@ class Application extends SilexApplication $this->mount('/admin/setup', new Setup()); $this->mount('/admin/search-engine', new SearchEngine()); $this->mount('/admin/publications', new Publications()); - $this->mount('/admin/fields', new Fields()); $this->mount('/admin/task-manager', new TaskManager()); $this->mount('/admin/subdefs', new Subdefs()); @@ -671,6 +670,7 @@ class Application extends SilexApplication '/admin/dashboard' => 'Alchemy\Phrasea\ControllerProvider\Admin\Dashboard', '/admin/databox' => 'Alchemy\Phrasea\ControllerProvider\Admin\Databox', '/admin/databoxes' => 'Alchemy\Phrasea\ControllerProvider\Admin\Databoxes', + '/admin/fields' => 'Alchemy\Phrasea\ControllerProvider\Admin\Fields', '/admin/users' => 'Alchemy\Phrasea\ControllerProvider\Admin\Users', '/datafiles' => 'Alchemy\Phrasea\ControllerProvider\Datafiles', '/include/minify' => 'Alchemy\Phrasea\ControllerProvider\Minifier', diff --git a/lib/Alchemy/Phrasea/Controller/Admin/FieldsController.php b/lib/Alchemy/Phrasea/Controller/Admin/FieldsController.php new file mode 100644 index 0000000000..5cd730520a --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Admin/FieldsController.php @@ -0,0 +1,339 @@ +app = $app; + } + + public function updateFields(Application $app, Request $request, $sbas_id) + { + $fields = []; + $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); + $metaStructure = $databox->get_meta_structure(); + $connection = $databox->get_connection(); + $data = $this->getFieldsJsonFromRequest($app, $request); + + $connection->beginTransaction(); + + foreach ($data as $jsonField) { + try { + $field = \databox_field::get_instance($app, $databox, $jsonField['id']); + + if ($field->get_name() !== $jsonField['name']) { + $this->validateNameField($metaStructure, $jsonField); + } + + $this->validateTagField($jsonField); + + $this->updateFieldWithData($app, $field, $jsonField); + $field->save(); + $fields[] = $field->toArray(); + } catch (\Exception $e) { + $connection->rollback(); + $app->abort(500, $app->trans('Field %name% could not be saved, please try again or contact an admin.', ['%name%' => $jsonField['name']])); + break; + } + } + + $connection->commit(); + + return $app->json($fields); + } + + public function getLanguage(Application $app, Request $request) + { + return $app->json([ + 'something_wrong' => $app->trans('Something wrong happened, please try again or contact an admin.'), + 'created_success' => $app->trans('%s field has been created with success.'), + 'deleted_success' => $app->trans('%s field has been deleted with success.'), + 'are_you_sure_delete' => $app->trans('Do you really want to delete the field %s ?'), + 'validation_blank' => $app->trans('Field can not be blank.'), + 'validation_name_exists' => $app->trans('Field name already exists.'), + 'validation_name_invalid' => $app->trans('Field name is not valid.'), + 'validation_tag_invalid' => $app->trans('Field source is not valid.'), + 'field_error' => $app->trans('Field %s contains errors.'), + 'fields_save' => $app->trans('Your configuration has been successfuly saved.'), + ]); + } + + public function displayApp(Application $app, Request $request, $sbas_id) + { + $languages = []; + + foreach ($app['locales.available'] as $code => $language) { + $data = explode('_', $code); + $languages[$data[0]] = $language; + } + + return $app['twig']->render('/admin/fields/index.html.twig', [ + 'sbas_id' => $sbas_id, + 'languages' => $languages, + ]); + } + + public function listDcFields(Application $app, Request $request) + { + $data = $app['serializer']->serialize(array_values(\databox::get_available_dcfields()), 'json'); + + return new Response($data, 200, ['content-type' => 'application/json']); + } + + public function listVocabularies(Application $app, Request $request) + { + $vocabularies = VocabularyController::getAvailable($app); + + return $app->json(array_map(function ($vocabulary) { + return [ + 'type' => $vocabulary->getType(), + 'name' => $vocabulary->getName(), + ]; + }, $vocabularies)); + } + + public function getVocabulary(Application $app, Request $request, $type) + { + $vocabulary = VocabularyController::get($app, $type); + + return $app->json([ + 'type' => $vocabulary->getType(), + 'name' => $vocabulary->getName(), + ]); + } + + public function searchTag(Application $app, Request $request) + { + $term = trim(strtolower($request->query->get('term'))); + $res = []; + + if ($term) { + $provider = new TagProvider(); + + foreach ($provider->getLookupTable() as $namespace => $tags) { + $ns = strpos($namespace, $term); + + foreach ($tags as $tagname => $datas) { + if ($ns === false && strpos($tagname, $term) === false) { + continue; + } + + $res[] = [ + 'id' => $namespace . '/' . $tagname, + /** @Ignore */ + 'label' => $datas['namespace'] . ' / ' . $datas['tagname'], + 'value' => $datas['namespace'] . ':' . $datas['tagname'], + ]; + } + } + } + + return $app->json($res); + } + + public function getTag(Application $app, Request $request, $tagname) + { + $tag = \databox_field::loadClassFromTagName($tagname); + $json = $app['serializer']->serialize($tag, 'json'); + + return new Response($json, 200, ['Content-Type' => 'application/json']); + } + + public function createField(Application $app, Request $request, $sbas_id) + { + $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); + $data = $this->getFieldJsonFromRequest($app, $request); + + $metaStructure = $databox->get_meta_structure(); + $this->validateNameField($metaStructure, $data); + $this->validateTagField($data); + + try { + $field = \databox_field::create($app, $databox, $data['name'], $data['multi']); + $this->updateFieldWithData($app, $field, $data); + $field->save(); + } catch (\Exception $e) { + $app->abort(500, $app->trans('Field %name% could not be created, please try again or contact an admin.', ['%name%' => $data['name']])); + } + + return $app->json($field->toArray(), 201, [ + 'location' => $app->path('admin_fields_show_field', [ + 'sbas_id' => $sbas_id, + 'id' => $field->get_id() + ])]); + } + + public function listFields(Application $app, $sbas_id) + { + $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); + + return $app->json($databox->get_meta_structure()->toArray()); + } + + public function getField(Application $app, $sbas_id, $id) + { + $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); + $field = \databox_field::get_instance($app, $databox, $id); + + return $app->json($field->toArray()); + } + + public function updateField(Application $app, Request $request, $sbas_id, $id) + { + $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); + $field = \databox_field::get_instance($app, $databox, $id); + $data = $this->getFieldJsonFromRequest($app, $request); + + $this->validateTagField($data); + + if ($field->get_name() !== $data['name']) { + $metaStructure = $databox->get_meta_structure(); + $this->validateNameField($metaStructure, $data); + } + + $this->updateFieldWithData($app, $field, $data); + $field->save(); + + return $app->json($field->toArray()); + } + + public function deleteField(Application $app, $sbas_id, $id) + { + $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); + \databox_field::get_instance($app, $databox, $id)->delete(); + + return new Response('', 204); + } + + private function getFieldJsonFromRequest(Application $app, Request $request) + { + $data = $this->requestBodyToJson($request); + $required = $this->getMandatoryFieldProperties(); + + foreach ($required as $key) { + if (false === array_key_exists($key, $data)) { + $app->abort(400, sprintf('The entity must contain a key `%s`', $key)); + } + } + + return $data; + } + + private function getFieldsJsonFromRequest(Application $app, Request $request) + { + $data = $this->requestBodyToJson($request); + $required = $this->getMandatoryFieldProperties(); + + foreach ($data as $field) { + foreach ($required as $key) { + if (false === array_key_exists($key, $field)) { + $app->abort(400, sprintf('The entity must contain a key `%s`', $key)); + } + } + } + + return $data; + } + + private function updateFieldWithData(Application $app, \databox_field $field, array $data) + { + $field + ->set_name($data['name']) + ->set_thumbtitle($data['thumbtitle']) + ->set_tag(\databox_field::loadClassFromTagName($data['tag'])) + ->set_business($data['business']) + ->set_aggregable($data['aggregable']) + ->set_indexable($data['indexable']) + ->set_required($data['required']) + ->set_separator($data['separator']) + ->set_readonly($data['readonly']) + ->set_type($data['type']) + ->set_tbranch($data['tbranch']) + ->set_report($data['report']) + ->setVocabularyControl(null) + ->setVocabularyRestricted(false); + + foreach ($data['labels'] as $code => $label) { + $field->set_label($code, $label); + } + + if (isset($data['sorter'])) { + $field->set_position($data['sorter']); + } + + try { + $vocabulary = VocabularyController::get($app, $data['vocabulary-type']); + $field->setVocabularyControl($vocabulary); + $field->setVocabularyRestricted($data['vocabulary-restricted']); + } catch (\InvalidArgumentException $e) { + + } + + if ('' !== $dcesElement = (string) $data['dces-element']) { + $class = sprintf('\databox_Field_DCES_%s', $dcesElement); + + if (!class_exists($class)) { + throw new BadRequestHttpException(sprintf('DCES element %s does not exist.', $dcesElement)); + } + + $field->set_dces_element(new $class()); + } + } + + private function getMandatoryFieldProperties() + { + return [ + 'name', 'multi', 'thumbtitle', 'tag', 'business', 'indexable', 'aggregable', + 'required', 'separator', 'readonly', 'type', 'tbranch', 'report', + 'vocabulary-type', 'vocabulary-restricted', 'dces-element', 'labels' + ]; + } + + private function validateNameField(\databox_descriptionStructure $metaStructure, array $field) + { + if (null !== $metaStructure->get_element_by_name($field['name'])) { + throw new BadRequestHttpException(sprintf('Field %s already exists.', $field['name'])); + } + } + + private function validateTagField(array $field) + { + try { + \databox_field::loadClassFromTagName($field['tag'], true); + } catch (\Exception_Databox_metadataDescriptionNotFound $e) { + throw new BadRequestHttpException(sprintf('Provided tag %s is unknown.', $field['tag'])); + } + } + + private function requestBodyToJson(Request $request) + { + $body = $request->getContent(); + $data = @json_decode($body, true); + + if (JSON_ERROR_NONE !== json_last_error()) { + throw new BadRequestHttpException('Body must contain a valid JSON payload.'); + } + + return $data; + } +} diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Admin/Fields.php b/lib/Alchemy/Phrasea/ControllerProvider/Admin/Fields.php index a6cf25f42f..8dae2e0cad 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Admin/Fields.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Admin/Fields.php @@ -11,393 +11,94 @@ namespace Alchemy\Phrasea\ControllerProvider\Admin; -use Alchemy\Phrasea\Metadata\TagProvider; -use Alchemy\Phrasea\Vocabulary\Controller as VocabularyController; -use JMS\TranslationBundle\Annotation\Ignore; +use Alchemy\Phrasea\Application as PhraseaApplication; +use Alchemy\Phrasea\Controller\Admin\FieldsController; +use Alchemy\Phrasea\Security\Firewall; use Silex\Application; +use Silex\ControllerCollection; use Silex\ControllerProviderInterface; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Silex\ServiceProviderInterface; -class Fields implements ControllerProviderInterface +class Fields implements ControllerProviderInterface, ServiceProviderInterface { + public function register(Application $app) + { + $app['controller.admin.fields'] = $app->share(function (PhraseaApplication $app) { + return new FieldsController($app); + }); + } + + public function boot(Application $app) + { + } + public function connect(Application $app) { + /** @var ControllerCollection $controllers */ $controllers = $app['controllers_factory']; - $app['admin.fields.controller'] = $this; + /** @var Firewall $firewall */ + $firewall = $app['firewall']; + $firewall->addMandatoryAuthentication($controllers); - $app['firewall']->addMandatoryAuthentication($controllers); - - $controllers->before(function (Request $request) use ($app) { - $app['firewall'] + $controllers->before(function () use ($firewall) { + $firewall ->requireAccessToModule('admin') ->requireRight('bas_modify_struct'); }); - $controllers->get('/language.json', 'admin.fields.controller:getLanguage') + $controllers->get('/language.json', 'controller.admin.fields:getLanguage') ->bind('admin_fields_language'); - $controllers->get('/{sbas_id}', 'admin.fields.controller:displayApp') + $controllers->get('/{sbas_id}', 'controller.admin.fields:displayApp') ->assert('sbas_id', '\d+') ->bind('admin_fields'); - $controllers->put('/{sbas_id}/fields', 'admin.fields.controller:updateFields') + $controllers->put('/{sbas_id}/fields', 'controller.admin.fields:updateFields') ->assert('sbas_id', '\d+') ->bind('admin_fields_register'); - $controllers->get('/{sbas_id}/fields', 'admin.fields.controller:listFields') + $controllers->get('/{sbas_id}/fields', 'controller.admin.fields:listFields') ->assert('sbas_id', '\d+') ->bind('admin_fields_list'); - $controllers->post('/{sbas_id}/fields', 'admin.fields.controller:createField') + $controllers->post('/{sbas_id}/fields', 'controller.admin.fields:createField') ->assert('sbas_id', '\d+') ->bind('admin_fields_create_field'); - $controllers->get('/{sbas_id}/fields/{id}', 'admin.fields.controller:getField') + $controllers->get('/{sbas_id}/fields/{id}', 'controller.admin.fields:getField') ->assert('id', '\d+') ->assert('sbas_id', '\d+') ->bind('admin_fields_show_field'); - $controllers->put('/{sbas_id}/fields/{id}', 'admin.fields.controller:updateField') + $controllers->put('/{sbas_id}/fields/{id}', 'controller.admin.fields:updateField') ->assert('id', '\d+') ->assert('sbas_id', '\d+') ->bind('admin_fields_update_field'); - $controllers->delete('/{sbas_id}/fields/{id}', 'admin.fields.controller:deleteField') + $controllers->delete('/{sbas_id}/fields/{id}', 'controller.admin.fields:deleteField') ->assert('id', '\d+') ->assert('sbas_id', '\d+') ->bind('admin_fields_delete_field'); - $controllers->get('/tags/search', 'admin.fields.controller:searchTag') + $controllers->get('/tags/search', 'controller.admin.fields:searchTag') ->bind('admin_fields_search_tag'); - $controllers->get('/tags/{tagname}', 'admin.fields.controller:getTag') + $controllers->get('/tags/{tagname}', 'controller.admin.fields:getTag') ->bind('admin_fields_show_tag'); - $controllers->get('/vocabularies', 'admin.fields.controller:listVocabularies') + $controllers->get('/vocabularies', 'controller.admin.fields:listVocabularies') ->bind('admin_fields_list_vocabularies'); - $controllers->get('/vocabularies/{type}', 'admin.fields.controller:getVocabulary') + $controllers->get('/vocabularies/{type}', 'controller.admin.fields:getVocabulary') ->bind('admin_fields_show_vocabulary'); - $controllers->get('/dc-fields', 'admin.fields.controller:listDcFields') + $controllers->get('/dc-fields', 'controller.admin.fields:listDcFields') ->bind('admin_fields_list_dc_fields'); - $controllers->get('/dc-fields/{name}', 'admin.fields.controller:getDcFields') + $controllers->get('/dc-fields/{name}', 'controller.admin.fields:getDcFields') ->bind('admin_fields_get_dc_fields'); return $controllers; } - - public function updateFields(Application $app, Request $request, $sbas_id) - { - $fields = []; - $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); - $metaStructure = $databox->get_meta_structure(); - $connection = $databox->get_connection(); - $data = $this->getFieldsJsonFromRequest($app, $request); - - $connection->beginTransaction(); - - foreach ($data as $jsonField) { - try { - $field = \databox_field::get_instance($app, $databox, $jsonField['id']); - - if ($field->get_name() !== $jsonField['name']) { - $this->validateNameField($metaStructure, $jsonField); - } - - $this->validateTagField($jsonField); - - $this->updateFieldWithData($app, $field, $jsonField); - $field->save(); - $fields[] = $field->toArray(); - } catch (\Exception $e) { - $connection->rollback(); - $app->abort(500, $app->trans('Field %name% could not be saved, please try again or contact an admin.', ['%name%' => $jsonField['name']])); - break; - } - } - - $connection->commit(); - - return $app->json($fields); - } - - public function getLanguage(Application $app, Request $request) - { - return $app->json([ - 'something_wrong' => $app->trans('Something wrong happened, please try again or contact an admin.'), - 'created_success' => $app->trans('%s field has been created with success.'), - 'deleted_success' => $app->trans('%s field has been deleted with success.'), - 'are_you_sure_delete' => $app->trans('Do you really want to delete the field %s ?'), - 'validation_blank' => $app->trans('Field can not be blank.'), - 'validation_name_exists' => $app->trans('Field name already exists.'), - 'validation_name_invalid' => $app->trans('Field name is not valid.'), - 'validation_tag_invalid' => $app->trans('Field source is not valid.'), - 'field_error' => $app->trans('Field %s contains errors.'), - 'fields_save' => $app->trans('Your configuration has been successfuly saved.'), - ]); - } - - public function displayApp(Application $app, Request $request, $sbas_id) - { - $languages = []; - - foreach ($app['locales.available'] as $code => $language) { - $data = explode('_', $code); - $languages[$data[0]] = $language; - } - - return $app['twig']->render('/admin/fields/index.html.twig', [ - 'sbas_id' => $sbas_id, - 'languages' => $languages, - ]); - } - - public function listDcFields(Application $app, Request $request) - { - $data = $app['serializer']->serialize(array_values(\databox::get_available_dcfields()), 'json'); - - return new Response($data, 200, ['content-type' => 'application/json']); - } - - public function listVocabularies(Application $app, Request $request) - { - $vocabularies = VocabularyController::getAvailable($app); - - return $app->json(array_map(function ($vocabulary) { - return [ - 'type' => $vocabulary->getType(), - 'name' => $vocabulary->getName(), - ]; - }, $vocabularies)); - } - - public function getVocabulary(Application $app, Request $request, $type) - { - $vocabulary = VocabularyController::get($app, $type); - - return $app->json([ - 'type' => $vocabulary->getType(), - 'name' => $vocabulary->getName(), - ]); - } - - public function searchTag(Application $app, Request $request) - { - $term = trim(strtolower($request->query->get('term'))); - $res = []; - - if ($term) { - $provider = new TagProvider(); - - foreach ($provider->getLookupTable() as $namespace => $tags) { - $ns = strpos($namespace, $term); - - foreach ($tags as $tagname => $datas) { - if ($ns === false && strpos($tagname, $term) === false) { - continue; - } - - $res[] = [ - 'id' => $namespace . '/' . $tagname, - /** @Ignore */ - 'label' => $datas['namespace'] . ' / ' . $datas['tagname'], - 'value' => $datas['namespace'] . ':' . $datas['tagname'], - ]; - } - } - } - - return $app->json($res); - } - - public function getTag(Application $app, Request $request, $tagname) - { - $tag = \databox_field::loadClassFromTagName($tagname); - $json = $app['serializer']->serialize($tag, 'json'); - - return new Response($json, 200, ['Content-Type' => 'application/json']); - } - - public function createField(Application $app, Request $request, $sbas_id) - { - $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); - $data = $this->getFieldJsonFromRequest($app, $request); - - $metaStructure = $databox->get_meta_structure(); - $this->validateNameField($metaStructure, $data); - $this->validateTagField($data); - - try { - $field = \databox_field::create($app, $databox, $data['name'], $data['multi']); - $this->updateFieldWithData($app, $field, $data); - $field->save(); - } catch (\Exception $e) { - $app->abort(500, $app->trans('Field %name% could not be created, please try again or contact an admin.', ['%name%' => $data['name']])); - } - - return $app->json($field->toArray(), 201, [ - 'location' => $app->path('admin_fields_show_field', [ - 'sbas_id' => $sbas_id, - 'id' => $field->get_id() - ])]); - } - - public function listFields(Application $app, $sbas_id) - { - $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); - - return $app->json($databox->get_meta_structure()->toArray()); - } - - public function getField(Application $app, $sbas_id, $id) - { - $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); - $field = \databox_field::get_instance($app, $databox, $id); - - return $app->json($field->toArray()); - } - - public function updateField(Application $app, Request $request, $sbas_id, $id) - { - $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); - $field = \databox_field::get_instance($app, $databox, $id); - $data = $this->getFieldJsonFromRequest($app, $request); - - $this->validateTagField($data); - - if ($field->get_name() !== $data['name']) { - $metaStructure = $databox->get_meta_structure(); - $this->validateNameField($metaStructure, $data); - } - - $this->updateFieldWithData($app, $field, $data); - $field->save(); - - return $app->json($field->toArray()); - } - - public function deleteField(Application $app, $sbas_id, $id) - { - $databox = $app['phraseanet.appbox']->get_databox((int) $sbas_id); - \databox_field::get_instance($app, $databox, $id)->delete(); - - return new Response('', 204); - } - - private function getFieldJsonFromRequest(Application $app, Request $request) - { - $data = $this->requestBodyToJson($request); - $required = $this->getMandatoryFieldProperties(); - - foreach ($required as $key) { - if (false === array_key_exists($key, $data)) { - $app->abort(400, sprintf('The entity must contain a key `%s`', $key)); - } - } - - return $data; - } - - private function getFieldsJsonFromRequest(Application $app, Request $request) - { - $data = $this->requestBodyToJson($request); - $required = $this->getMandatoryFieldProperties(); - - foreach ($data as $field) { - foreach ($required as $key) { - if (false === array_key_exists($key, $field)) { - $app->abort(400, sprintf('The entity must contain a key `%s`', $key)); - } - } - } - - return $data; - } - - private function updateFieldWithData(Application $app, \databox_field $field, array $data) - { - $field - ->set_name($data['name']) - ->set_thumbtitle($data['thumbtitle']) - ->set_tag(\databox_field::loadClassFromTagName($data['tag'])) - ->set_business($data['business']) - ->set_aggregable($data['aggregable']) - ->set_indexable($data['indexable']) - ->set_required($data['required']) - ->set_separator($data['separator']) - ->set_readonly($data['readonly']) - ->set_type($data['type']) - ->set_tbranch($data['tbranch']) - ->set_report($data['report']) - ->setVocabularyControl(null) - ->setVocabularyRestricted(false); - - foreach ($data['labels'] as $code => $label) { - $field->set_label($code, $label); - } - - if (isset($data['sorter'])) { - $field->set_position($data['sorter']); - } - - try { - $vocabulary = VocabularyController::get($app, $data['vocabulary-type']); - $field->setVocabularyControl($vocabulary); - $field->setVocabularyRestricted($data['vocabulary-restricted']); - } catch (\InvalidArgumentException $e) { - - } - - if ('' !== $dcesElement = (string) $data['dces-element']) { - $class = sprintf('\databox_Field_DCES_%s', $dcesElement); - - if (!class_exists($class)) { - throw new BadRequestHttpException(sprintf('DCES element %s does not exist.', $dcesElement)); - } - - $field->set_dces_element(new $class()); - } - } - - private function getMandatoryFieldProperties() - { - return [ - 'name', 'multi', 'thumbtitle', 'tag', 'business', 'indexable', 'aggregable', - 'required', 'separator', 'readonly', 'type', 'tbranch', 'report', - 'vocabulary-type', 'vocabulary-restricted', 'dces-element', 'labels' - ]; - } - - private function validateNameField(\databox_descriptionStructure $metaStructure, array $field) - { - if (null !== $metaStructure->get_element_by_name($field['name'])) { - throw new BadRequestHttpException(sprintf('Field %s already exists.', $field['name'])); - } - } - - private function validateTagField(array $field) - { - try { - \databox_field::loadClassFromTagName($field['tag'], true); - } catch (\Exception_Databox_metadataDescriptionNotFound $e) { - throw new BadRequestHttpException(sprintf('Provided tag %s is unknown.', $field['tag'])); - } - } - - private function requestBodyToJson(Request $request) - { - $body = $request->getContent(); - $data = @json_decode($body, true); - - if (JSON_ERROR_NONE !== json_last_error()) { - throw new BadRequestHttpException('Body must contain a valid JSON payload.'); - } - - return $data; - } }