Skip to content

Commit

Permalink
Add additional webspaces field
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-schranz committed Oct 14, 2021
1 parent ecfab9d commit 1134821
Show file tree
Hide file tree
Showing 16 changed files with 118 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ private function setWebspaceData(WebspaceInterface $dimensionContent, array $dat
// if no main webspace is yet set a default webspace will be set
$dimensionContent->setMainWebspace($this->getDefaultWebspaceKey());
}

if (\array_key_exists('additionalWebspaces', $data)) {
$dimensionContent->setAdditionalWebspaces($data['additionalWebspaces'] ?: []);
}
}

private function getDefaultWebspaceKey(): ?string
Expand Down
4 changes: 4 additions & 0 deletions Content/Application/ContentMerger/Merger/WebspaceMerger.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,9 @@ public function merge(object $targetObject, object $sourceObject): void
if ($mainWebspace = $sourceObject->getMainWebspace()) {
$targetObject->setMainWebspace($mainWebspace);
}

if ($additionalWebspaces = $sourceObject->getAdditionalWebspaces()) {
$targetObject->setAdditionalWebspaces($additionalWebspaces);
}
}
}
10 changes: 10 additions & 0 deletions Content/Domain/Model/WebspaceInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,14 @@ interface WebspaceInterface
public function getMainWebspace(): ?string;

public function setMainWebspace(?string $mainWebspace): void;

/**
* @return string[]
*/
public function getAdditionalWebspaces(): array;

/**
* @param string[] $additionalWebspaces
*/
public function setAdditionalWebspaces(array $additionalWebspaces): void;
}
31 changes: 31 additions & 0 deletions Content/Domain/Model/WebspaceTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ trait WebspaceTrait
*/
protected $mainWebspace;

/**
* @var string[]|null
*/
protected $additionalWebspaces;

public function getMainWebspace(): ?string
{
return $this->mainWebspace;
Expand All @@ -28,5 +33,31 @@ public function getMainWebspace(): ?string
public function setMainWebspace(?string $mainWebspace): void
{
$this->mainWebspace = $mainWebspace;

if ($mainWebspace && !\in_array($mainWebspace, $this->additionalWebspaces ?: [], true)) {
// additional webspace always include also the main webspace to make query simpler
$this->additionalWebspaces = \array_merge($this->additionalWebspaces ?: [], [$mainWebspace]);
}
}

/**
* @return string[]
*/
public function getAdditionalWebspaces(): array
{
return $this->additionalWebspaces ?: [];
}

/**
* @param string[] $additionalWebspaces
*/
public function setAdditionalWebspaces(array $additionalWebspaces): void
{
if ($this->mainWebspace && !\in_array($this->mainWebspace, $additionalWebspaces, true)) {
// additional webspace always include also the main webspace to make query simpler
$additionalWebspaces[] = $this->mainWebspace;
}

$this->additionalWebspaces = $additionalWebspaces;
}
}
1 change: 1 addition & 0 deletions Content/Infrastructure/Doctrine/MetadataLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ public function loadClassMetadata(LoadClassMetadataEventArgs $event): void

if ($reflection->implementsInterface(WebspaceInterface::class)) {
$this->addField($metadata, 'mainWebspace', 'string', ['nullable' => true]);
$this->addField($metadata, 'additionalWebspaces', 'json', ['nullable' => true]);
}

if ($reflection->implementsInterface(AuthorInterface::class)) {
Expand Down
16 changes: 15 additions & 1 deletion Resources/config/forms/content_settings_webspace.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
</meta>

<properties>
<property name="mainWebspace" type="single_select" colspan="6" spaceAfter="6">
<property name="mainWebspace" type="single_select" colspan="6">
<meta>
<title>sulu_content.main_webspace</title>
</meta>
Expand All @@ -27,6 +27,20 @@
/>
</params>
</property>

<property name="additionalWebspaces" type="select" colspan="6">
<meta>
<title>sulu_content.additional_webspaces</title>
</meta>

<params>
<param
name="values"
type="expression"
value="service('sulu_content.webspace_select').getValues()"
/>
</params>
</property>
</properties>
</section>
</properties>
Expand Down
3 changes: 3 additions & 0 deletions Tests/Functional/Integration/ExampleControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public function testPostPublish(): int
'author' => null,
'authored' => '2020-05-08T00:00:00+00:00',
'mainWebspace' => 'sulu-io',
'additionalWebspaces' => ['sulu-io', 'sulu-io2'],
]) ?: null);

$response = $this->client->getResponse();
Expand Down Expand Up @@ -134,6 +135,7 @@ public function testPost(): int
'excerptIcon' => null,
'excerptMedia' => null,
'mainWebspace' => 'sulu-io',
'additionalWebspaces' => ['sulu-io', 'sulu-io2'],
'authored' => '2020-05-08T00:00:00+00:00',
]) ?: null);

Expand Down Expand Up @@ -194,6 +196,7 @@ public function testPut(int $id): void
'excerptMedia' => null,
'authored' => '2020-06-09T00:00:00+00:00',
'mainWebspace' => 'sulu-io2',
'additionalWebspaces' => ['sulu-io', 'sulu-io2'],
]) ?: null);

$response = $this->client->getResponse();
Expand Down
3 changes: 2 additions & 1 deletion Tests/Functional/Integration/responses/example_get.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@
"title": "Test Example",
"url": "/my-example",
"workflowPlace": "unpublished",
"mainWebspace": "sulu-io"
"mainWebspace": "sulu-io",
"additionalWebspaces": ["sulu-io", "sulu-io2"]
}
3 changes: 2 additions & 1 deletion Tests/Functional/Integration/responses/example_post.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@
"title": "Test Example",
"url": "/my-example",
"workflowPlace": "unpublished",
"mainWebspace": "sulu-io"
"mainWebspace": "sulu-io",
"additionalWebspaces": ["sulu-io", "sulu-io2"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@
"title": "Test Example",
"url": "/my-example",
"workflowPlace": "published",
"mainWebspace": "sulu-io"
"mainWebspace": "sulu-io",
"additionalWebspaces": ["sulu-io", "sulu-io2"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@
"title": "Test Example",
"url": "\/my-example",
"workflowPlace": "unpublished",
"mainWebspace": "sulu-io"
"mainWebspace": "sulu-io",
"additionalWebspaces": ["sulu-io", "sulu-io2"]
}
3 changes: 2 additions & 1 deletion Tests/Functional/Integration/responses/example_put.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,6 @@
"title": "Test Example 2",
"url": "/my-example-2",
"workflowPlace": "unpublished",
"mainWebspace": "sulu-io2"
"mainWebspace": "sulu-io2",
"additionalWebspaces": ["sulu-io", "sulu-io2"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ public function testMapWebspaceNoData(): void
$authorMapper->map($unlocalizedDimensionContent, $localizedDimensionContent, $data);

$this->assertNull($localizedDimensionContent->getMainWebspace());
$this->assertSame([], $localizedDimensionContent->getAdditionalWebspaces());
}

public function testMapDefaultWebspace(): void
Expand All @@ -93,12 +94,14 @@ public function testMapDefaultWebspace(): void
$authorMapper->map($unlocalizedDimensionContent, $localizedDimensionContent, $data);

$this->assertSame('default-webspace', $localizedDimensionContent->getMainWebspace());
$this->assertSame(['default-webspace'], $localizedDimensionContent->getAdditionalWebspaces());
}

public function testMapData(): void
{
$data = [
'mainWebspace' => 'example',
'additionalWebspaces' => ['example', 'example2'],
];

$example = new Example();
Expand All @@ -109,22 +112,26 @@ public function testMapData(): void
$authorMapper->map($unlocalizedDimensionContent, $localizedDimensionContent, $data);

$this->assertSame('example', $localizedDimensionContent->getMainWebspace());
$this->assertSame(['example', 'example2'], $localizedDimensionContent->getAdditionalWebspaces());
}

public function testMapDataEmpty(): void
{
$data = [
'mainWebspace' => null,
'additionalWebspaces' => null,
];

$example = new Example();
$unlocalizedDimensionContent = new ExampleDimensionContent($example);
$localizedDimensionContent = new ExampleDimensionContent($example);
$localizedDimensionContent->setMainWebspace('example');
$localizedDimensionContent->setAdditionalWebspaces(['example', 'example2']);

$authorMapper = $this->createWebspaceDataMapperInstance();
$authorMapper->map($unlocalizedDimensionContent, $localizedDimensionContent, $data);

$this->assertNull($localizedDimensionContent->getMainWebspace());
$this->assertSame([], $localizedDimensionContent->getAdditionalWebspaces());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,17 @@ public function testMergeSet(): void
$merger = $this->getWebspaceMergerInstance();

$mainWebspace = 'sulu-io';
$additionalWebspaces = ['sulu-io', 'sulu-io2'];

$source = $this->prophesize(DimensionContentInterface::class);
$source->willImplement(WebspaceInterface::class);
$source->getMainWebspace()->willReturn($mainWebspace)->shouldBeCalled();
$source->getAdditionalWebspaces()->willReturn($additionalWebspaces)->shouldBeCalled();

$target = $this->prophesize(DimensionContentInterface::class);
$target->willImplement(WebspaceInterface::class);
$target->setMainWebspace($mainWebspace)->shouldBeCalled();
$target->setAdditionalWebspaces($additionalWebspaces)->shouldBeCalled();

$merger->merge($target->reveal(), $source->reveal());
}
Expand All @@ -77,10 +80,12 @@ public function testMergeNotSet(): void
$source = $this->prophesize(DimensionContentInterface::class);
$source->willImplement(WebspaceInterface::class);
$source->getMainWebspace()->willReturn(null)->shouldBeCalled();
$source->getAdditionalWebspaces()->willReturn([])->shouldBeCalled();

$target = $this->prophesize(DimensionContentInterface::class);
$target->willImplement(WebspaceInterface::class);
$target->setMainWebspace(Argument::any())->shouldNotBeCalled();
$target->setAdditionalWebspaces(Argument::any())->shouldNotBeCalled();

$merger->merge($target->reveal(), $source->reveal());
}
Expand Down
27 changes: 27 additions & 0 deletions Tests/Unit/Content/Domain/Model/WebspaceTraitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,31 @@ public function testGetSetMainWebspace(): void
$model->setMainWebspace('example');
$this->assertSame('example', $model->getMainWebspace());
}

public function testGetSetAdditionalWebspaces(): void
{
$model = $this->getWebspaceInstance();
$this->assertSame([], $model->getAdditionalWebspaces());
$model->setAdditionalWebspaces(['example', 'example2']);
$this->assertSame(['example', 'example2'], $model->getAdditionalWebspaces());
}

public function testMainWebspaceAlwaysAdditionalWebspaces(): void
{
$model = $this->getWebspaceInstance();
$model->setMainWebspace('example');

$this->assertSame('example', $model->getMainWebspace());
$this->assertSame(['example'], $model->getAdditionalWebspaces());
}

public function testAdditionalWebspacesWithoutMainWebspace(): void
{
$model = $this->getWebspaceInstance();
$model->setMainWebspace('example');
$model->setAdditionalWebspaces(['example-2']);

$this->assertSame('example', $model->getMainWebspace());
$this->assertSame(['example-2', 'example'], $model->getAdditionalWebspaces());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ public function dataProvider(): \Generator
],
[
'mainWebspace' => true,
'additionalWebspaces' => true,
],
[],
[],
Expand Down

0 comments on commit 1134821

Please sign in to comment.