Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IBX-2120: FieldConstraintsStorage should be aware of content type status #66

Merged
merged 8 commits into from
Feb 1, 2022
9 changes: 7 additions & 2 deletions src/contracts/FieldType/FieldConstraintsStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,19 @@ interface FieldConstraintsStorage
{
public function storeFieldConstraintsData(
int $fieldDefinitionId,
int $status,
FieldTypeConstraints $fieldTypeConstraints
): void;

public function getFieldConstraintsData(
int $fieldDefinitionId
int $fieldDefinitionId,
int $status
): FieldTypeConstraints;

public function deleteFieldConstraintsData(
int $fieldDefinitionId
int $fieldDefinitionId,
int $status
): void;

public function publishFieldConstraintsData(int $fieldDefinitionId): void;
}
17 changes: 11 additions & 6 deletions src/lib/Persistence/Legacy/Content/Type/Handler.php
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ protected function internalCreate(CreateStruct $createStruct, $contentTypeId = n
$storageFieldDef
);

$this->storageDispatcher->storeFieldConstraintsData($fieldDef);
$this->storageDispatcher->storeFieldConstraintsData($fieldDef, $contentType->status);
}

return $contentType;
Expand Down Expand Up @@ -378,7 +378,7 @@ public function delete($contentTypeId, $status)
}

foreach ($fieldDefinitions as $fieldDefinition) {
$this->storageDispatcher->deleteFieldConstraintsData($fieldDefinition->fieldType, $fieldDefinition->id);
$this->storageDispatcher->deleteFieldConstraintsData($fieldDefinition->fieldType, $fieldDefinition->id, $status);
}

$this->contentTypeGateway->delete($contentTypeId, $status);
Expand Down Expand Up @@ -515,7 +515,7 @@ public function getFieldDefinition($id, $status)

$multilingualData = $this->mapper->extractMultilingualData($rows);

return $this->mapper->extractFieldFromRow(reset($rows), $multilingualData);
return $this->mapper->extractFieldFromRow(reset($rows), $multilingualData, $status);
}

/**
Expand Down Expand Up @@ -552,7 +552,7 @@ public function addFieldDefinition($contentTypeId, $status, FieldDefinition $fie
$storageFieldDef
);

$this->storageDispatcher->storeFieldConstraintsData($fieldDefinition);
$this->storageDispatcher->storeFieldConstraintsData($fieldDefinition, $status);
}

/**
Expand All @@ -574,7 +574,8 @@ public function removeFieldDefinition(
): void {
$this->storageDispatcher->deleteFieldConstraintsData(
$fieldDefinition->fieldType,
$fieldDefinition->id
$fieldDefinition->id,
$status
);

$this->contentTypeGateway->deleteFieldDefinition(
Expand All @@ -600,7 +601,7 @@ public function updateFieldDefinition($contentTypeId, $status, FieldDefinition $
$storageFieldDef = new StorageFieldDefinition();
$this->mapper->toStorageFieldDefinition($fieldDefinition, $storageFieldDef);
$this->contentTypeGateway->updateFieldDefinition($contentTypeId, $status, $fieldDefinition, $storageFieldDef);
$this->storageDispatcher->storeFieldConstraintsData($fieldDefinition);
$this->storageDispatcher->storeFieldConstraintsData($fieldDefinition, $status);
}

/**
Expand Down Expand Up @@ -628,6 +629,10 @@ public function publish($contentTypeId)
}

$this->updateHandler->publishNewType($toType, Type::STATUS_DEFINED);

foreach ($toType->fieldDefinitions as $fieldDefinition) {
$this->storageDispatcher->publishFieldConstraintsData($fieldDefinition);
}
}

public function getSearchableFieldMap()
Expand Down
11 changes: 6 additions & 5 deletions src/lib/Persistence/Legacy/Content/Type/Mapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public function extractTypesFromRows(array $rows, bool $keepTypeIdAsKey = false)

$multilingualData = $this->extractMultilingualData($fieldDataRows);

$types[$typeId]->fieldDefinitions[] = $fields[$fieldId] = $this->extractFieldFromRow($row, $multilingualData);
$types[$typeId]->fieldDefinitions[] = $fields[$fieldId] = $this->extractFieldFromRow($row, $multilingualData, $types[$typeId]->status);
}

$groupId = (int)$row['ezcontentclass_classgroup_group_id'];
Expand Down Expand Up @@ -219,7 +219,7 @@ protected function extractTypeFromRow(array $row)
*
* @return \Ibexa\Contracts\Core\Persistence\Content\Type\FieldDefinition
*/
public function extractFieldFromRow(array $row, array $multilingualData = [])
public function extractFieldFromRow(array $row, array $multilingualData = [], int $status = Type::STATUS_DEFINED)
{
$storageFieldDef = $this->extractStorageFieldFromRow($row, $multilingualData);

Expand Down Expand Up @@ -249,7 +249,7 @@ public function extractFieldFromRow(array $row, array $multilingualData = [])
$mainLanguageCode = $this->maskGenerator->extractLanguageCodesFromMask((int)$row['ezcontentclass_initial_language_id']);
$field->mainLanguageCode = array_shift($mainLanguageCode);

$this->toFieldDefinition($storageFieldDef, $field);
$this->toFieldDefinition($storageFieldDef, $field, $status);

return $field;
}
Expand Down Expand Up @@ -456,7 +456,8 @@ public function toStorageFieldDefinition(
*/
public function toFieldDefinition(
StorageFieldDefinition $storageFieldDef,
FieldDefinition $fieldDef
FieldDefinition $fieldDef,
int $status = Type::STATUS_DEFINED
) {
$converter = $this->converterRegistry->getConverter(
$fieldDef->fieldType
Expand All @@ -466,7 +467,7 @@ public function toFieldDefinition(
$fieldDef
);

$this->storageDispatcher->loadFieldConstraintsData($fieldDef);
$this->storageDispatcher->loadFieldConstraintsData($fieldDef, $status);
}

/**
Expand Down
20 changes: 14 additions & 6 deletions src/lib/Persistence/Legacy/Content/Type/StorageDispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,36 @@ public function __construct(StorageRegistryInterface $registry)
$this->registry = $registry;
}

public function storeFieldConstraintsData(FieldDefinition $fieldDefinition): void
public function publishFieldConstraintsData(FieldDefinition $fieldDefinition): void
{
if ($this->registry->hasStorage($fieldDefinition->fieldType)) {
$storage = $this->registry->getStorage($fieldDefinition->fieldType);
$storage->storeFieldConstraintsData($fieldDefinition->id, $fieldDefinition->fieldTypeConstraints);
$storage->publishFieldConstraintsData($fieldDefinition->id);
}
}

public function loadFieldConstraintsData(FieldDefinition $fieldDefinition): void
public function storeFieldConstraintsData(FieldDefinition $fieldDefinition, int $status): void
{
if ($this->registry->hasStorage($fieldDefinition->fieldType)) {
$storage = $this->registry->getStorage($fieldDefinition->fieldType);
$storage->storeFieldConstraintsData($fieldDefinition->id, $status, $fieldDefinition->fieldTypeConstraints);
}
}

public function loadFieldConstraintsData(FieldDefinition $fieldDefinition, int $status): void
{
if ($this->registry->hasStorage($fieldDefinition->fieldType)) {
$storage = $this->registry->getStorage($fieldDefinition->fieldType);

$fieldDefinition->fieldTypeConstraints = $storage->getFieldConstraintsData($fieldDefinition->id);
$fieldDefinition->fieldTypeConstraints = $storage->getFieldConstraintsData($fieldDefinition->id, $status);
}
}

public function deleteFieldConstraintsData(string $fieldTypeIdentifier, int $fieldDefinitionId): void
public function deleteFieldConstraintsData(string $fieldTypeIdentifier, int $fieldDefinitionId, int $status): void
{
if ($this->registry->hasStorage($fieldTypeIdentifier)) {
$storage = $this->registry->getStorage($fieldTypeIdentifier);
$storage->deleteFieldConstraintsData($fieldDefinitionId);
$storage->deleteFieldConstraintsData($fieldDefinitionId, $status);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@

interface StorageDispatcherInterface
{
public function storeFieldConstraintsData(FieldDefinition $fieldDefinition): void;
public function publishFieldConstraintsData(FieldDefinition $fieldDefinition): void;

public function loadFieldConstraintsData(FieldDefinition $fieldDefinition): void;
public function storeFieldConstraintsData(FieldDefinition $fieldDefinition, int $status): void;

public function deleteFieldConstraintsData(string $fieldTypeIdentifier, int $fieldDefinitionId): void;
public function loadFieldConstraintsData(FieldDefinition $fieldDefinition, int $status): void;

public function deleteFieldConstraintsData(string $fieldTypeIdentifier, int $fieldDefinitionId, int $status): void;
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,9 @@ public function testStorageDataIsCreatedOnContentTypeCreate(): ContentType

$contentTypeService->publishContentTypeDraft($contentType);

$actualFieldTypeConstraints = $this
->getExampleFieldConstraintsStorage()
->getFieldConstraintsDataIfAvailable(
$contentType->getFieldDefinition(self::EXAMPLE_FIELD_IDENTIFIER)->id
);
$storage = $this->getExampleFieldConstraintsStorage();

self::assertTrue($storage->isPublished($contentType->fieldDefinitions->get(self::EXAMPLE_FIELD_IDENTIFIER)->id));

self::assertEquals(
new FieldTypeConstraints(
Expand All @@ -84,7 +82,9 @@ public function testStorageDataIsCreatedOnContentTypeCreate(): ContentType
'validators' => self::EXAMPLE_VALIDATOR_CONFIGURATION,
]
),
$actualFieldTypeConstraints
$storage->getFieldConstraintsDataIfAvailable(
$contentType->getFieldDefinition(self::EXAMPLE_FIELD_IDENTIFIER)->id
)
);

return $contentTypeService->loadContentTypeByIdentifier($contentType->identifier);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,26 @@ final class ExampleFieldConstraintsStorage implements FieldConstraintsStorage
/** @var \Ibexa\Contracts\Core\Persistence\Content\FieldTypeConstraints[] */
private array $fieldConstraints;

/** @var int[] */
private array $published = [];

/**
* @param \Ibexa\Contracts\Core\Persistence\Content\FieldTypeConstraints[]
*/
public function __construct(array $fieldConstraints = [])
{
$this->fieldConstraints = $fieldConstraints;
$this->published = [];
}

public function publishFieldConstraintsData(int $fieldDefinitionId): void
{
$this->published[] = $fieldDefinitionId;
}

public function storeFieldConstraintsData(
int $fieldDefinitionId,
int $status,
FieldTypeConstraints $fieldTypeConstraints
): void {
$this->fieldConstraints[$fieldDefinitionId] = $fieldTypeConstraints;
Expand All @@ -40,8 +50,14 @@ public function hasFieldConstraintsData(
return isset($this->fieldConstraints[$fieldDefinitionId]);
}

public function isPublished(int $fieldDefinitionId): bool
{
return in_array($fieldDefinitionId, $this->published, true);
}

public function getFieldConstraintsData(
int $fieldDefinitionId
int $fieldDefinitionId,
int $status
): FieldTypeConstraints {
return $this->fieldConstraints[$fieldDefinitionId];
}
Expand All @@ -52,7 +68,7 @@ public function getFieldConstraintsDataIfAvailable(
return $this->fieldConstraints[$fieldDefinitionId] ?? null;
}

public function deleteFieldConstraintsData(int $fieldDefinitionId): void
public function deleteFieldConstraintsData(int $fieldDefinitionId, int $status): void
{
unset($this->fieldConstraints[$fieldDefinitionId]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use Ibexa\Contracts\Core\FieldType\FieldConstraintsStorage;
use Ibexa\Contracts\Core\Persistence\Content\FieldTypeConstraints;
use Ibexa\Contracts\Core\Persistence\Content\Type as ContentType;
use Ibexa\Contracts\Core\Persistence\Content\Type\FieldDefinition;
use Ibexa\Core\Persistence\Legacy\Content\Type\StorageDispatcher;
use Ibexa\Core\Persistence\Legacy\Content\Type\StorageRegistryInterface;
Expand All @@ -20,15 +21,34 @@ final class StorageDispatcherTest extends TestCase
private const EXAMPLE_FIELD_DEFINITION_ID = 1;
private const EXAMPLE_FIELD_TYPE_IDENTIFIER = 'example_ft';

public function testPublishFieldConstraintsData(): void
{
$storage = $this->createMock(FieldConstraintsStorage::class);
$storage
->expects($this->once())
->method('publishFieldConstraintsData')
->with(self::EXAMPLE_FIELD_DEFINITION_ID);

$fieldDefinition = new FieldDefinition();
$fieldDefinition->id = self::EXAMPLE_FIELD_DEFINITION_ID;
$fieldDefinition->fieldType = self::EXAMPLE_FIELD_TYPE_IDENTIFIER;

$registry = $this->createStorageRegistryMockWithExternalStorage($storage);

$dispatcher = new StorageDispatcher($registry);
$dispatcher->publishFieldConstraintsData($fieldDefinition);
}

public function testStoreFieldConstraintsData(): void
{
$status = ContentType::STATUS_DEFINED;
$constraints = $this->createMock(FieldTypeConstraints::class);

$storage = $this->createMock(FieldConstraintsStorage::class);
$storage
->expects($this->once())
->method('storeFieldConstraintsData')
->with(self::EXAMPLE_FIELD_DEFINITION_ID, $constraints);
->with(self::EXAMPLE_FIELD_DEFINITION_ID, $status, $constraints);

$fieldDefinition = new FieldDefinition();
$fieldDefinition->fieldTypeConstraints = $constraints;
Expand All @@ -38,19 +58,21 @@ public function testStoreFieldConstraintsData(): void
$registry = $this->createStorageRegistryMockWithExternalStorage($storage);

$dispatcher = new StorageDispatcher($registry);
$dispatcher->storeFieldConstraintsData($fieldDefinition);
$dispatcher->storeFieldConstraintsData($fieldDefinition, $status);
}

public function testStoreFieldConstraintsDataForNonSupportedFieldType(): void
{
$status = ContentType::STATUS_DEFINED;

$fieldDefinition = new FieldDefinition();
$fieldDefinition->id = self::EXAMPLE_FIELD_DEFINITION_ID;
$fieldDefinition->fieldType = self::EXAMPLE_FIELD_TYPE_IDENTIFIER;

$registry = $this->createStorageRegistryMockWithoutExternalStorage();

$dispatcher = new StorageDispatcher($registry);
$dispatcher->storeFieldConstraintsData($fieldDefinition);
$dispatcher->storeFieldConstraintsData($fieldDefinition, $status);
}

public function testLoadFieldConstraintsData(): void
Expand All @@ -71,7 +93,7 @@ public function testLoadFieldConstraintsData(): void
$registry = $this->createStorageRegistryMockWithExternalStorage($storage);

$dispatcher = new StorageDispatcher($registry);
$dispatcher->loadFieldConstraintsData($fieldDefinition);
$dispatcher->loadFieldConstraintsData($fieldDefinition, ContentType::STATUS_DEFINED);

self::assertSame(
$constraints,
Expand All @@ -91,7 +113,7 @@ public function testLoadFieldConstraintsDataForNonSupportedFieldType(): void
$registry = $this->createStorageRegistryMockWithoutExternalStorage();

$dispatcher = new StorageDispatcher($registry);
$dispatcher->loadFieldConstraintsData($fieldDefinition);
$dispatcher->loadFieldConstraintsData($fieldDefinition, ContentType::STATUS_DEFINED);

self::assertSame(
$constraints,
Expand All @@ -112,7 +134,8 @@ public function testDeleteFieldConstraintsData(): void
$dispatcher = new StorageDispatcher($registry);
$dispatcher->deleteFieldConstraintsData(
self::EXAMPLE_FIELD_TYPE_IDENTIFIER,
self::EXAMPLE_FIELD_DEFINITION_ID
self::EXAMPLE_FIELD_DEFINITION_ID,
ContentType::STATUS_DEFINED,
);
}

Expand All @@ -123,7 +146,8 @@ public function testDeleteFieldConstraintsDataForNonSupportedFieldType(): void
$dispatcher = new StorageDispatcher($registry);
$dispatcher->deleteFieldConstraintsData(
self::EXAMPLE_FIELD_TYPE_IDENTIFIER,
self::EXAMPLE_FIELD_DEFINITION_ID
self::EXAMPLE_FIELD_DEFINITION_ID,
ContentType::STATUS_DEFINED,
);
}

Expand Down