Remove VocabularyController

This commit is contained in:
Benoît Burnichon
2016-03-30 16:33:10 +02:00
parent 86cba70a76
commit 020d7a9b02
6 changed files with 97 additions and 177 deletions

View File

@@ -12,8 +12,8 @@ namespace Alchemy\Phrasea\Controller\Admin;
use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Controller\Controller;
use Alchemy\Phrasea\Metadata\TagProvider; use Alchemy\Phrasea\Metadata\TagProvider;
use Alchemy\Phrasea\Vocabulary\Controller as VocabularyController;
use Alchemy\Phrasea\Vocabulary\ControlProvider\ControlProviderInterface; use Alchemy\Phrasea\Vocabulary\ControlProvider\ControlProviderInterface;
use Assert\Assertion;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
@@ -96,24 +96,57 @@ class FieldsController extends Controller
public function listVocabularies() public function listVocabularies()
{ {
$vocabularies = VocabularyController::getAvailable($this->app); return $this->app->json(array_map(
[$this, 'getVocabularyAsArray'],
$this->fetchVocabularies()
));
}
return $this->app->json(array_map(function (ControlProviderInterface $vocabulary) { /**
* @return ControlProviderInterface[]
*/
private function fetchVocabularies()
{
$vocabularies = $this->getVocabularies();
$instances = array_map(
function ($type) use ($vocabularies) {
return $vocabularies[$type];
},
$vocabularies->keys()
);
Assertion::allIsInstanceOf($instances, ControlProviderInterface::class);
return $instances;
}
/**
* @param string $type
* @return ControlProviderInterface
*/
private function fetchVocabulary($type)
{
$vocabularies = $this->getVocabularies();
$vocabulary = $vocabularies[$type];
Assertion::isInstanceOf($vocabulary, ControlProviderInterface::class);
return $vocabulary;
}
private function getVocabularyAsArray(ControlProviderInterface $vocabulary)
{
return [ return [
'type' => $vocabulary->getType(), 'type' => $vocabulary->getType(),
'name' => $vocabulary->getName(), 'name' => $vocabulary->getName(),
]; ];
}, $vocabularies));
} }
public function getVocabulary($type) public function getVocabulary($type)
{ {
$vocabulary = VocabularyController::get($this->app, $type); return $this->app->json($this->getVocabularyAsArray($this->fetchVocabulary($type)));
return $this->app->json([
'type' => $vocabulary->getType(),
'name' => $vocabulary->getName(),
]);
} }
public function searchTag(Request $request) public function searchTag(Request $request)
@@ -293,11 +326,11 @@ class FieldsController extends Controller
} }
try { try {
$vocabulary = VocabularyController::get($this->app, $data['vocabulary-type']); $vocabulary = $this->fetchVocabulary($data['vocabulary-type']);
$field->setVocabularyControl($vocabulary); $field->setVocabularyControl($vocabulary);
$field->setVocabularyRestricted($data['vocabulary-restricted']); $field->setVocabularyRestricted($data['vocabulary-restricted']);
} catch (\InvalidArgumentException $e) { } catch (\InvalidArgumentException $e) {
// Invalid vocabulary requested
} }
if ('' !== $dcesElement = (string) $data['dces-element']) { if ('' !== $dcesElement = (string) $data['dces-element']) {
@@ -347,4 +380,12 @@ class FieldsController extends Controller
return $data; return $data;
} }
/**
* @return ControlProviderInterface[]|\Pimple
*/
private function getVocabularies()
{
return $this->app['vocabularies'];
}
} }

View File

@@ -20,7 +20,6 @@ use Alchemy\Phrasea\Model\Entities\Preset;
use Alchemy\Phrasea\Model\Entities\User; use Alchemy\Phrasea\Model\Entities\User;
use Alchemy\Phrasea\Model\Manipulator\PresetManipulator; use Alchemy\Phrasea\Model\Manipulator\PresetManipulator;
use Alchemy\Phrasea\Model\Repositories\PresetRepository; use Alchemy\Phrasea\Model\Repositories\PresetRepository;
use Alchemy\Phrasea\Vocabulary\Controller as VocabularyController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -240,7 +239,7 @@ class EditController extends Controller
throw new \Exception('Invalid sbas_id'); throw new \Exception('Invalid sbas_id');
} }
$VC = VocabularyController::get($this->app, $vocabulary); $vocabularyProvider = $this->app['vocabularies'][$vocabulary];
$databox = $this->findDataboxById($sbas_id); $databox = $this->findDataboxById($sbas_id);
} catch (\Exception $e) { } catch (\Exception $e) {
$data['message'] = $this->app->trans('Vocabulary not found'); $data['message'] = $this->app->trans('Vocabulary not found');
@@ -250,7 +249,7 @@ class EditController extends Controller
$query = $request->query->get('query'); $query = $request->query->get('query');
$results = $VC->find($query, $this->getAuthenticatedUser(), $databox); $results = $vocabularyProvider->find($query, $this->getAuthenticatedUser(), $databox);
$list = []; $list = [];

View File

@@ -1,51 +0,0 @@
<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2016 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Vocabulary;
use Alchemy\Phrasea\Application;
use Alchemy\Phrasea\Vocabulary\ControlProvider\ControlProviderInterface;
class Controller
{
/**
* Factory of ControlProvider
*
* @param Application $app
* @param string $type
*
* @return ControlProviderInterface
*
* @throws \InvalidArgumentException
*/
public static function get(Application $app, $type)
{
$classname = __NAMESPACE__ . '\\ControlProvider\\' . $type . 'Provider';
if ( ! class_exists($classname)) {
throw new \InvalidArgumentException('Vocabulary type not found');
}
return new $classname($app);
}
/**
* Returns an array of available ControlProviders
*
* @return array
*/
public static function getAvailable(Application $app)
{
return [
new ControlProvider\UserProvider($app)
];
}
}

View File

@@ -1,5 +1,4 @@
<?php <?php
/* /*
* This file is part of Phraseanet * This file is part of Phraseanet
* *
@@ -15,7 +14,6 @@ use Alchemy\Phrasea\Core\Event\Record\Structure\FieldEvent;
use Alchemy\Phrasea\Core\Event\Record\Structure\FieldUpdatedEvent; use Alchemy\Phrasea\Core\Event\Record\Structure\FieldUpdatedEvent;
use Alchemy\Phrasea\Core\Event\Record\Structure\RecordStructureEvents; use Alchemy\Phrasea\Core\Event\Record\Structure\RecordStructureEvents;
use Alchemy\Phrasea\Metadata\TagFactory; use Alchemy\Phrasea\Metadata\TagFactory;
use Alchemy\Phrasea\Vocabulary;
use Alchemy\Phrasea\Vocabulary\ControlProvider\ControlProviderInterface; use Alchemy\Phrasea\Vocabulary\ControlProvider\ControlProviderInterface;
use Alchemy\Phrasea\Metadata\Tag\NoSource; use Alchemy\Phrasea\Metadata\Tag\NoSource;
use Doctrine\DBAL\Connection; use Doctrine\DBAL\Connection;
@@ -1012,7 +1010,7 @@ class databox_field implements cache_cacheableInterface
} }
try { try {
$this->Vocabulary = Vocabulary\Controller::get($this->app, $this->VocabularyType); $this->Vocabulary = $this->app['vocabularies'][$this->VocabularyType];
} catch (\InvalidArgumentException $e) { } catch (\InvalidArgumentException $e) {
// Could not find Vocabulary // Could not find Vocabulary
} }

View File

@@ -3,8 +3,6 @@
namespace Alchemy\Tests\Phrasea\Controller\Admin; namespace Alchemy\Tests\Phrasea\Controller\Admin;
use PHPExiftool\Driver\Tag\IPTC\ObjectName; use PHPExiftool\Driver\Tag\IPTC\ObjectName;
use Alchemy\Phrasea\Vocabulary\Controller as VocabularyController;
use Symfony\Component\HttpKernel\Client;
/** /**
* @group functional * @group functional
@@ -16,18 +14,17 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
{ {
public function testRoot() public function testRoot()
{ {
$databoxes = self::$DI['app']->getDataboxes(); $databoxes = $this->getApplication()->getDataboxes();
$databox = array_shift($databoxes); $databox = array_shift($databoxes);
self::$DI['client']->request("GET", "/admin/fields/" . $databox->get_sbas_id()); $response = $this->request("GET", "/admin/fields/" . $databox->get_sbas_id());
$this->assertTrue(self::$DI['client']->getResponse()->isOk()); $this->assertTrue($response->isOk());
} }
public function testLanguage() public function testLanguage()
{ {
self::$DI['client']->request("GET", "/admin/fields/language.json"); $response = $this->request("GET", "/admin/fields/language.json");
$response = self::$DI['client']->getResponse();
$this->assertTrue($response->isOk()); $this->assertTrue($response->isOk());
$this->assertEquals("application/json", $response->headers->get("content-type")); $this->assertEquals("application/json", $response->headers->get("content-type"));
@@ -37,9 +34,7 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
{ {
$tag = new ObjectName(); $tag = new ObjectName();
self::$DI['client']->request("GET", "/admin/fields/tags/".$tag->getTagname()); $response = $this->request("GET", "/admin/fields/tags/".$tag->getTagname());
$response = self::$DI['client']->getResponse();
$this->assertEquals("application/json", $response->headers->get("content-type")); $this->assertEquals("application/json", $response->headers->get("content-type"));
$data = json_decode($response->getContent(), true); $data = json_decode($response->getContent(), true);
@@ -52,13 +47,11 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
public function testListDcFields() public function testListDcFields()
{ {
self::$DI['client']->request("GET", "/admin/fields/dc-fields"); $response = $this->request("GET", "/admin/fields/dc-fields");
$response = self::$DI['client']->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type")); $data = json_decode($response->getContent(), true);
$data = json_decode($response, true);
$this->assertInternalType('array', $data); $this->assertInternalType('array', $data);
foreach ($data as $dc) { foreach ($data as $dc) {
@@ -72,49 +65,40 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
public function testListVocabularies() public function testListVocabularies()
{ {
self::$DI['client']->request("GET", "/admin/fields/vocabularies"); $response = $this->request("GET", "/admin/fields/vocabularies");
$response = self::$DI['client']->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
$data = json_decode($response, true); $data = json_decode($response->getContent(), true);
$this->assertInternalType('array', $data); $this->assertInternalType('array', $data);
foreach ($data as $vocabulary) { foreach ($data as $vocabulary) {
$this->assertArrayHasKey('type', $vocabulary); $this->assertArrayHasKey('type', $vocabulary);
$this->assertArrayHasKey('name', $vocabulary); $this->assertArrayHasKey('name', $vocabulary);
$voc = VocabularyController::get(self::$DI['app'], $vocabulary['type']);
$this->assertInstanceOf('Alchemy\Phrasea\Vocabulary\ControlProvider\ControlProviderInterface', $voc);
} }
} }
public function testGetVocabulary() public function testGetVocabulary()
{ {
self::$DI['client']->request("GET", "/admin/fields/vocabularies/user"); $response = $this->request("GET", "/admin/fields/vocabularies/user");
$response = self::$DI['client']->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
$data = json_decode($response, true); $data = json_decode($response->getContent(), true);
$this->assertArrayHasKey('type', $data); $this->assertArrayHasKey('type', $data);
$this->assertEquals('User', $data['type']); $this->assertEquals('User', $data['type']);
$this->assertArrayHasKey('name', $data); $this->assertArrayHasKey('name', $data);
$voc = VocabularyController::get(self::$DI['app'], $data['type']);
$this->assertInstanceOf('Alchemy\Phrasea\Vocabulary\ControlProvider\UserProvider', $voc);
} }
public function testSearchTag() public function testSearchTag()
{ {
self::$DI['client']->request("GET", "/admin/fields/tags/search?term=xmp-exif"); $response = $this->request("GET", "/admin/fields/tags/search?term=xmp-exif");
$response = self::$DI['client']->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
$data = json_decode($response, true); $data = json_decode($response->getContent(), true);
$this->assertGreaterThan(90, count($data)); $this->assertGreaterThan(90, count($data));
@@ -128,7 +112,7 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
public function testUpdateFields() public function testUpdateFields()
{ {
$databoxes = self::$DI['app']->getDataboxes(); $databoxes = $this->getApplication()->getDataboxes();
$databox = array_shift($databoxes); $databox = array_shift($databoxes);
$fieldObjects = []; $fieldObjects = [];
// create two fields // create two fields
@@ -170,7 +154,7 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
]]; ]];
foreach ($fields as $fieldData) { foreach ($fields as $fieldData) {
$field = \databox_field::create(self::$DI['app'], $databox, $fieldData['name'], $fieldData['multi']); $field = \databox_field::create($this->getApplication(), $databox, $fieldData['name'], $fieldData['multi']);
$field $field
->set_thumbtitle($fieldData['thumbtitle']) ->set_thumbtitle($fieldData['thumbtitle'])
->set_tag(\databox_field::loadClassFromTagName($fieldData['tag'])) ->set_tag(\databox_field::loadClassFromTagName($fieldData['tag']))
@@ -197,13 +181,11 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
$body[count($body) - 1]['readonly'] = true; $body[count($body) - 1]['readonly'] = true;
$body[count($body) - 1]['required'] = false; $body[count($body) - 1]['required'] = false;
self::$DI['client']->request("PUT", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id()), [], [], [], json_encode($body)); $response = $this->request("PUT", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id()), [], [], [], json_encode($body));
$response = self::$DI['client']->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type")); $data = json_decode($response->getContent(), true);
$data = json_decode($response, true);
$this->assertTrue(is_array($data)); $this->assertTrue(is_array($data));
@@ -248,14 +230,11 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
'vocabulary-restricted' => true, 'vocabulary-restricted' => true,
]); ]);
/** @var Client $client */ $response = $this->request("POST", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id()), [], [], [], $body);
$client = self::$DI['client'];
$client->request("POST", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id()), [], [], [], $body);
$response = $client->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", $client->getResponse()->headers->get("content-type"));
$data = json_decode($response, true); $data = json_decode($response->getContent(), true);
$this->assertTrue(is_array($data)); $this->assertTrue(is_array($data));
@@ -271,15 +250,14 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
public function testListField() public function testListField()
{ {
$databoxes = self::$DI['app']->getDataboxes(); $databoxes = $this->getApplication()->getDataboxes();
$databox = array_shift($databoxes); $databox = array_shift($databoxes);
self::$DI['client']->request("GET", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id())); $response = $this->request("GET", sprintf("/admin/fields/%d/fields", $databox->get_sbas_id()));
$response = self::$DI['client']->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
$data = json_decode($response, true); $data = json_decode($response->getContent(), true);
$this->assertInternalType('array', $data); $this->assertInternalType('array', $data);
@@ -297,13 +275,11 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
$data = $field->toArray(); $data = $field->toArray();
$client = $this->getClient(); $response = $this->request("GET", sprintf("/admin/fields/%d/fields/%d", $databox->get_sbas_id(), $field->get_id()));
$client->request("GET", sprintf("/admin/fields/%d/fields/%d", $databox->get_sbas_id(), $field->get_id()));
$response = $client->getResponse()->getContent(); $this->assertEquals("application/json", $response->headers->get("content-type"));
$this->assertEquals("application/json", $client->getResponse()->headers->get("content-type"));
$this->assertEquals($data, json_decode($response, true)); $this->assertEquals($data, json_decode($response->getContent(), true));
$field->delete(); $field->delete();
} }
@@ -320,11 +296,9 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
$data['business'] = true; $data['business'] = true;
$data['vocabulary-type'] = 'User'; $data['vocabulary-type'] = 'User';
$client = $this->getClient(); $response = $this->request("PUT", sprintf("/admin/fields/%d/fields/%d", $databox->get_sbas_id(), $field->get_id()), [], [], json_encode($data));
$client->request("PUT", sprintf("/admin/fields/%d/fields/%d", $databox->get_sbas_id(), $field->get_id()), [], [], [], json_encode($data));
$response = $client->getResponse()->getContent(); $this->assertEquals($data, json_decode($response->getContent(), true));
$this->assertEquals($data, json_decode($response, true));
$field->delete(); $field->delete();
} }
@@ -342,13 +316,10 @@ class FieldsTest extends \PhraseanetAuthenticatedWebTestCase
$data['business'] = true; $data['business'] = true;
$data['vocabulary-type'] = 'User'; $data['vocabulary-type'] = 'User';
/** @var Client $client */ $response = $this->request("DELETE", sprintf("/admin/fields/%d/fields/%d", $databox->get_sbas_id(), $field->get_id()), [], [], json_encode($data));
$client = self::$DI['client'];
$client->request("DELETE", sprintf("/admin/fields/%d/fields/%d", $databox->get_sbas_id(), $field->get_id()), [], [], [], json_encode($data));
$response = $client->getResponse()->getContent(); $this->assertEquals('', $response->getContent());
$this->assertEquals('', $response); $this->assertEquals(204, $response->getStatusCode());
$this->assertEquals(204, $client->getResponse()->getStatusCode());
try { try {
$databox->get_meta_structure()->get_element($fieldId); $databox->get_meta_structure()->get_element($fieldId);

View File

@@ -1,38 +0,0 @@
<?php
namespace Alchemy\Tests\Phrasea\Vocabulary;
use Alchemy\Phrasea\Vocabulary\Controller;
/**
* @group functional
* @group legacy
*/
class ControllerTest extends \PhraseanetTestCase
{
public function testGet()
{
$provider = Controller::get(self::$DI['app'], 'User');
$this->assertInstanceOf('\\Alchemy\\Phrasea\\Vocabulary\\ControlProvider\\UserProvider', $provider);
try {
$provider = Controller::get(self::$DI['app'], 'Zebulon');
$this->fail('Should raise an exception');
} catch (\Exception $e) {
}
}
public function testGetAvailable()
{
$available = Controller::getAvailable(self::$DI['app']);
$this->assertTrue(is_array($available));
foreach ($available as $controller) {
$this->assertInstanceOf('\\Alchemy\\Phrasea\\Vocabulary\\ControlProvider\\ControlProviderInterface', $controller);
}
}
}