From 0030e51561ba8fbfcedca7ee4675be0bc36adecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Tue, 19 Apr 2016 11:04:55 +0200 Subject: [PATCH] WIP RecordTransformer --- .../Phrasea/Controller/Api/V1Controller.php | 9 ++- lib/Alchemy/Phrasea/Search/CaptionView.php | 29 ++++++++++ .../Phrasea/Search/RecordTransformer.php | 57 ++++++++++++++----- 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index 7ea64a89cc..391ba31bf4 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -61,6 +61,7 @@ use Alchemy\Phrasea\Search\SearchResultView; use Alchemy\Phrasea\Search\StoryTransformer; use Alchemy\Phrasea\Search\StoryView; use Alchemy\Phrasea\Search\SubdefTransformer; +use Alchemy\Phrasea\Search\TechnicalDataTransformer; use Alchemy\Phrasea\Search\V1SearchCompositeResultTransformer; use Alchemy\Phrasea\Search\V1SearchRecordsResultTransformer; use Alchemy\Phrasea\Search\V1SearchResultTransformer; @@ -1051,8 +1052,9 @@ class V1Controller extends Controller $searchView = $this->buildSearchView($this->doSearch($request)); - $recordTransformer = new RecordTransformer(); - $storyTransformer = new StoryTransformer(new SubdefTransformer(), $recordTransformer); + $subdefTransformer = new SubdefTransformer(); + $recordTransformer = new RecordTransformer($subdefTransformer, new TechnicalDataTransformer()); + $storyTransformer = new StoryTransformer($subdefTransformer, $recordTransformer); $compositeTransformer = new V1SearchCompositeResultTransformer($recordTransformer, $storyTransformer); $searchTransformer = new V1SearchResultTransformer($compositeTransformer); @@ -1078,7 +1080,8 @@ class V1Controller extends Controller $searchView = $this->buildSearchRecordsView($this->doSearch($request)); - $searchTransformer = new V1SearchRecordsResultTransformer(new RecordTransformer()); + $recordTransformer = new RecordTransformer(new SubdefTransformer(), new TechnicalDataTransformer()); + $searchTransformer = new V1SearchRecordsResultTransformer($recordTransformer); $ret = $fractal->createData(new Item($searchView, $searchTransformer))->toArray(); diff --git a/lib/Alchemy/Phrasea/Search/CaptionView.php b/lib/Alchemy/Phrasea/Search/CaptionView.php index a31c584613..3a51af0d26 100644 --- a/lib/Alchemy/Phrasea/Search/CaptionView.php +++ b/lib/Alchemy/Phrasea/Search/CaptionView.php @@ -10,6 +10,8 @@ namespace Alchemy\Phrasea\Search; +use Assert\Assertion; + class CaptionView { /** @@ -17,6 +19,11 @@ class CaptionView */ private $caption; + /** + * @var \caption_field[] + */ + private $fields = []; + public function __construct(\caption_record $caption) { $this->caption = $caption; @@ -29,4 +36,26 @@ class CaptionView { return $this->caption; } + + /** + * @param \caption_field[] $fields + */ + public function setFields($fields) + { + Assertion::allIsInstanceOf($fields, \caption_field::class); + + $this->fields = []; + + foreach ($fields as $field) { + $this->fields[$field->get_name()] = $field; + } + } + + /** + * @return \caption_field[] + */ + public function getFields() + { + return $this->fields; + } } diff --git a/lib/Alchemy/Phrasea/Search/RecordTransformer.php b/lib/Alchemy/Phrasea/Search/RecordTransformer.php index e1948dac14..adfebd9147 100644 --- a/lib/Alchemy/Phrasea/Search/RecordTransformer.php +++ b/lib/Alchemy/Phrasea/Search/RecordTransformer.php @@ -55,7 +55,9 @@ class RecordTransformer extends TransformerAbstract public function includeThumbnail(RecordView $recordView) { - return $this->item($recordView->getSubdef('thumbnail'), $this->subdefTransformer); + $thumbnailView = $recordView->getSubdef('thumbnail'); + + return $thumbnailView ? $this->item($thumbnailView, $this->subdefTransformer) : null; } public function includeTechnicalInformations(RecordView $recordView) @@ -70,12 +72,13 @@ class RecordTransformer extends TransformerAbstract public function includeMetadata(RecordView $recordView) { - $ret = []; + $fieldData = []; + $values = []; - foreach ($recordView->getCaption()->getCaption()->get_fields() as $field) { + foreach ($recordView->getCaption()->getFields() as $field) { $databox_field = $field->get_databox_field(); - $fieldData = [ + $fieldData[$field->get_meta_struct_id()] = [ 'meta_structure_id' => $field->get_meta_struct_id(), 'name' => $field->get_name(), 'labels' => [ @@ -86,24 +89,52 @@ class RecordTransformer extends TransformerAbstract ], ]; - foreach ($field->get_values() as $value) { - $data = [ - 'meta_id' => $value->getId(), - 'value' => $value->getValue(), - ]; - - $ret[] = array_replace($fieldData, $data); - } + $values[] = $field->get_values(); } - return $this->collection($recordView->getCaption(), ) + if ($values) { + $values = call_user_func_array('array_merge', $values); + } + + return $this->collection($values, function (\caption_Field_Value $value) use ($fieldData) { + $data = $fieldData[$value->getDatabox_field()->get_id()]; + + $data['meta_id'] = $value->getId(); + $data['value'] = $value->getValue(); + + return $data; + }); } public function includeStatus(RecordView $recordView) { + $data = []; + + $bitMask = $recordView->getRecord()->getStatusBitField(); + + foreach ($recordView->getRecord()->getDatabox()->getStatusStructure() as $bit => $status) { + $data[] = [ + 'bit' => $bit, + 'mask' => $bitMask, + ]; + } + + return $this->collection($data, function (array $bitData) { + return [ + 'bit' => $bitData['bit'], + 'state' => \databox_status::bitIsSet($bitData['mask'], $bitData['bit']), + ]; + }); } public function includeCaption(RecordView $recordView) { + return $this->collection($recordView->getCaption()->getFields(), function (\caption_field $field) { + return [ + 'meta_structure_id' => $field->get_meta_struct_id(), + 'name' => $field->get_name(), + 'value' => $field->get_serialized_values(';'), + ]; + }); } }