From a21828f21f1dbe16a7bbfd529a79a4aca6b41fe0 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Sun, 28 Feb 2021 14:02:17 +0100 Subject: [PATCH 01/19] camp-prototype-model backend --- .../config/Rest/campTemplate.config.php | 9 -- .../config/Rest/categoryContent.config.php | 8 -- .../Rest/categoryContentTemplate.config.php | 17 --- .../categoryContentTypeTemplate.config.php | 17 --- .../config/Rest/categoryTemplate.config.php | 17 --- .../Rest/materialListTemplate.config.php | 10 -- .../CampTemplate/CampTemplateCollection.php | 8 -- .../CampTemplate/CampTemplateResource.php | 8 -- .../CategoryContentCollection.php | 8 -- .../CategoryContentResource.php | 8 -- .../CategoryContentTemplateCollection.php | 8 -- .../CategoryContentTemplateResource.php | 8 -- .../CategoryContentTypeTemplateCollection.php | 8 -- .../CategoryContentTypeTemplateResource.php | 8 -- .../MaterialListTemplateCollection.php | 8 -- .../MaterialListTemplateResource.php | 8 -- .../eCampApi/V1/Rpc/Index/IndexController.php | 5 - .../eCampApi/test/Rest/CampTemplateTest.php | 94 ------------- .../Rest/CategoryContentTypeTemplateTest.php | 102 -------------- .../test/Rest/CategoryTemplateTest.php | 107 -------------- .../test/Rest/MaterialListTemplateTest.php | 102 -------------- backend/module/eCampApi/test/Rpc/RootTest.php | 4 - .../eCampCore/data/dev/ScheduleEntryData.php | 2 +- .../module/eCampCore/data/prod/AdminData.php | 33 +++++ .../eCampCore/data/prod/CampPrototypeData.php | 55 ++++++++ .../eCampCore/data/prod/CampTemplateData.php | 38 ----- ...lateData.php => CategoryPrototypeData.php} | 56 ++++---- .../data/prod/MaterialListPrototypeData.php | 54 ++++++++ .../data/prod/MaterialListTemplateData.php | 64 --------- .../module/eCampCore/src/Acl/AclAssertion.php | 59 ++++++++ .../module/eCampCore/src/Acl/AclFactory.php | 55 ++++---- .../eCampCore/src/Acl/CampIsPrototype.php | 26 ++++ .../src/Entity/AbstractContentNodeOwner.php | 53 +++++++ .../module/eCampCore/src/Entity/Activity.php | 23 +--- backend/module/eCampCore/src/Entity/Camp.php | 25 +++- .../eCampCore/src/Entity/CampTemplate.php | 73 ---------- .../module/eCampCore/src/Entity/Category.php | 47 ++----- .../eCampCore/src/Entity/CategoryContent.php | 128 ----------------- .../src/Entity/CategoryContentTemplate.php | 111 --------------- .../src/Entity/CategoryContentType.php | 10 +- .../Entity/CategoryContentTypeTemplate.php | 42 ------ .../eCampCore/src/Entity/CategoryTemplate.php | 130 ------------------ .../eCampCore/src/Entity/ContentNode.php | 56 ++++++-- .../eCampCore/src/Entity/MaterialList.php | 10 +- .../src/Entity/MaterialListTemplate.php | 38 ----- .../eCampCore/src/EntityFilter/CampFilter.php | 3 +- .../src/EntityService/ActivityService.php | 24 ++-- .../src/EntityService/CampService.php | 30 ++-- .../src/EntityService/CampTemplateService.php | 19 --- .../EntityService/CategoryContentService.php | 72 ---------- .../CategoryContentTypeService.php | 7 +- .../CategoryContentTypeTemplateService.php | 36 ----- .../src/EntityService/CategoryService.php | 41 +++--- .../EntityService/CategoryTemplateService.php | 31 ----- .../src/EntityService/ContentNodeService.php | 28 ++-- .../src/EntityService/MaterialListService.php | 7 +- .../MaterialListTemplateService.php | 31 ----- .../src/Hydrator/ActivityHydrator.php | 8 -- .../src/Hydrator/CampTemplateHydrator.php | 43 ------ .../src/Hydrator/CategoryContentHydrator.php | 50 ------- .../CategoryContentTemplateHydrator.php | 45 ------ .../CategoryContentTypeTemplateHydrator.php | 36 ----- .../src/Hydrator/CategoryHydrator.php | 4 +- .../src/Hydrator/CategoryTemplateHydrator.php | 56 -------- .../src/Hydrator/ContentNodeHydrator.php | 28 +++- .../Hydrator/MaterialListTemplateHydrator.php | 42 ------ .../eCampCore/test/Data/AdminTestData.php | 27 ++++ .../test/Data/CampPrototypeTestData.php | 34 +++++ .../test/Data/CampTemplateTestData.php | 21 --- .../Data/CategoryContentTemplateTestData.php | 32 ----- .../test/Data/CategoryContentTestData.php | 32 ----- .../CategoryContentTypePrototypeTestData.php | 33 +++++ .../CategoryContentTypeTemplateTestData.php | 32 ----- .../test/Data/CategoryPrototypeTestData.php | 34 +++++ .../test/Data/CategoryTemplateTestData.php | 32 ----- .../test/Data/ContentNodeTestData.php | 46 +++++++ .../test/Data/MaterialItemTestData.php | 2 +- .../Data/MaterialListPrototypeTestData.php | 31 +++++ .../Data/MaterialListTemplateTestData.php | 31 ----- .../test/Entity/CampTemplateTest.php | 30 ---- .../Entity/CategoryContentTemplateTest.php | 54 -------- .../test/Entity/CategoryContentTest.php | 55 -------- .../CategoryContentTypeTemplateTest.php | 31 ----- .../test/Entity/CategoryTemplateTest.php | 52 ------- .../eCampCore/test/Entity/CategoryTest.php | 12 -- .../eCampCore/test/Entity/ContentNodeTest.php | 10 +- .../test/Entity/MaterialListTemplateTest.php | 23 ---- .../Hydrator/CampTemplateHydratorTest.php | 39 ------ .../Hydrator/CategoryContentHydratorTest.php | 42 ------ .../CategoryContentTemplateHydratorTest.php | 42 ------ .../Hydrator/CategoryTemplateHydratorTest.php | 46 ------- .../MaterialListTemplateHydratorTest.php | 34 ----- .../test/Service/ActivityServiceTest.php | 8 +- .../test/Service/CampServiceTest.php | 46 +++---- 94 files changed, 748 insertions(+), 2564 deletions(-) delete mode 100644 backend/module/eCampApi/config/Rest/campTemplate.config.php delete mode 100644 backend/module/eCampApi/config/Rest/categoryContent.config.php delete mode 100644 backend/module/eCampApi/config/Rest/categoryContentTemplate.config.php delete mode 100644 backend/module/eCampApi/config/Rest/categoryContentTypeTemplate.config.php delete mode 100644 backend/module/eCampApi/config/Rest/categoryTemplate.config.php delete mode 100644 backend/module/eCampApi/config/Rest/materialListTemplate.config.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CampTemplate/CampTemplateCollection.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CampTemplate/CampTemplateResource.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CategoryContent/CategoryContentCollection.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CategoryContent/CategoryContentResource.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CategoryContentTemplate/CategoryContentTemplateCollection.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CategoryContentTemplate/CategoryContentTemplateResource.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CategoryContentTypeTemplate/CategoryContentTypeTemplateCollection.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/CategoryContentTypeTemplate/CategoryContentTypeTemplateResource.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/MaterialListTemplate/MaterialListTemplateCollection.php delete mode 100644 backend/module/eCampApi/src/eCampApi/V1/Rest/MaterialListTemplate/MaterialListTemplateResource.php delete mode 100644 backend/module/eCampApi/test/Rest/CampTemplateTest.php delete mode 100644 backend/module/eCampApi/test/Rest/CategoryContentTypeTemplateTest.php delete mode 100644 backend/module/eCampApi/test/Rest/CategoryTemplateTest.php delete mode 100644 backend/module/eCampApi/test/Rest/MaterialListTemplateTest.php create mode 100644 backend/module/eCampCore/data/prod/AdminData.php create mode 100644 backend/module/eCampCore/data/prod/CampPrototypeData.php delete mode 100644 backend/module/eCampCore/data/prod/CampTemplateData.php rename backend/module/eCampCore/data/prod/{CategoryTemplateData.php => CategoryPrototypeData.php} (74%) create mode 100644 backend/module/eCampCore/data/prod/MaterialListPrototypeData.php delete mode 100644 backend/module/eCampCore/data/prod/MaterialListTemplateData.php create mode 100644 backend/module/eCampCore/src/Acl/AclAssertion.php create mode 100644 backend/module/eCampCore/src/Acl/CampIsPrototype.php create mode 100644 backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php delete mode 100644 backend/module/eCampCore/src/Entity/CampTemplate.php delete mode 100644 backend/module/eCampCore/src/Entity/CategoryContent.php delete mode 100644 backend/module/eCampCore/src/Entity/CategoryContentTemplate.php delete mode 100644 backend/module/eCampCore/src/Entity/CategoryContentTypeTemplate.php delete mode 100644 backend/module/eCampCore/src/Entity/CategoryTemplate.php delete mode 100644 backend/module/eCampCore/src/Entity/MaterialListTemplate.php delete mode 100644 backend/module/eCampCore/src/EntityService/CampTemplateService.php delete mode 100644 backend/module/eCampCore/src/EntityService/CategoryContentService.php delete mode 100644 backend/module/eCampCore/src/EntityService/CategoryContentTypeTemplateService.php delete mode 100644 backend/module/eCampCore/src/EntityService/CategoryTemplateService.php delete mode 100644 backend/module/eCampCore/src/EntityService/MaterialListTemplateService.php delete mode 100644 backend/module/eCampCore/src/Hydrator/CampTemplateHydrator.php delete mode 100644 backend/module/eCampCore/src/Hydrator/CategoryContentHydrator.php delete mode 100644 backend/module/eCampCore/src/Hydrator/CategoryContentTemplateHydrator.php delete mode 100644 backend/module/eCampCore/src/Hydrator/CategoryContentTypeTemplateHydrator.php delete mode 100644 backend/module/eCampCore/src/Hydrator/CategoryTemplateHydrator.php delete mode 100644 backend/module/eCampCore/src/Hydrator/MaterialListTemplateHydrator.php create mode 100644 backend/module/eCampCore/test/Data/AdminTestData.php create mode 100644 backend/module/eCampCore/test/Data/CampPrototypeTestData.php delete mode 100644 backend/module/eCampCore/test/Data/CampTemplateTestData.php delete mode 100644 backend/module/eCampCore/test/Data/CategoryContentTemplateTestData.php delete mode 100644 backend/module/eCampCore/test/Data/CategoryContentTestData.php create mode 100644 backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php delete mode 100644 backend/module/eCampCore/test/Data/CategoryContentTypeTemplateTestData.php create mode 100644 backend/module/eCampCore/test/Data/CategoryPrototypeTestData.php delete mode 100644 backend/module/eCampCore/test/Data/CategoryTemplateTestData.php create mode 100644 backend/module/eCampCore/test/Data/ContentNodeTestData.php create mode 100644 backend/module/eCampCore/test/Data/MaterialListPrototypeTestData.php delete mode 100644 backend/module/eCampCore/test/Data/MaterialListTemplateTestData.php delete mode 100644 backend/module/eCampCore/test/Entity/CampTemplateTest.php delete mode 100644 backend/module/eCampCore/test/Entity/CategoryContentTemplateTest.php delete mode 100644 backend/module/eCampCore/test/Entity/CategoryContentTest.php delete mode 100644 backend/module/eCampCore/test/Entity/CategoryContentTypeTemplateTest.php delete mode 100644 backend/module/eCampCore/test/Entity/CategoryTemplateTest.php delete mode 100644 backend/module/eCampCore/test/Entity/MaterialListTemplateTest.php delete mode 100644 backend/module/eCampCore/test/Hydrator/CampTemplateHydratorTest.php delete mode 100644 backend/module/eCampCore/test/Hydrator/CategoryContentHydratorTest.php delete mode 100644 backend/module/eCampCore/test/Hydrator/CategoryContentTemplateHydratorTest.php delete mode 100644 backend/module/eCampCore/test/Hydrator/CategoryTemplateHydratorTest.php delete mode 100644 backend/module/eCampCore/test/Hydrator/MaterialListTemplateHydratorTest.php diff --git a/backend/module/eCampApi/config/Rest/campTemplate.config.php b/backend/module/eCampApi/config/Rest/campTemplate.config.php deleted file mode 100644 index 3d65a59a09..0000000000 --- a/backend/module/eCampApi/config/Rest/campTemplate.config.php +++ /dev/null @@ -1,9 +0,0 @@ -setEntityHttpMethodsReadonly() - ->setCollectionHttpMethodsReadonly() - ->buildConfig() -; diff --git a/backend/module/eCampApi/config/Rest/categoryContent.config.php b/backend/module/eCampApi/config/Rest/categoryContent.config.php deleted file mode 100644 index 3870a554b2..0000000000 --- a/backend/module/eCampApi/config/Rest/categoryContent.config.php +++ /dev/null @@ -1,8 +0,0 @@ -setEntityHttpMethodsReadonly() - ->setCollectionHttpMethodsReadonly() - ->addCollectionQueryWhitelist('campTemplateId') - ->buildConfig() -; diff --git a/backend/module/eCampApi/src/eCampApi/V1/Rest/CampTemplate/CampTemplateCollection.php b/backend/module/eCampApi/src/eCampApi/V1/Rest/CampTemplate/CampTemplateCollection.php deleted file mode 100644 index 9b63619acc..0000000000 --- a/backend/module/eCampApi/src/eCampApi/V1/Rest/CampTemplate/CampTemplateCollection.php +++ /dev/null @@ -1,8 +0,0 @@ - 'e-camp-api.rest.doctrine.user', ]); - $data['campTemplates'] = TemplatedLink::factory([ - 'rel' => 'campTemplates', - 'route' => 'e-camp-api.rest.doctrine.camp-template', - ]); - $data['camps'] = TemplatedLink::factory([ 'rel' => 'camps', 'route' => 'e-camp-api.rest.doctrine.camp', diff --git a/backend/module/eCampApi/test/Rest/CampTemplateTest.php b/backend/module/eCampApi/test/Rest/CampTemplateTest.php deleted file mode 100644 index 594682fe1a..0000000000 --- a/backend/module/eCampApi/test/Rest/CampTemplateTest.php +++ /dev/null @@ -1,94 +0,0 @@ -addFixture($userLoader); - $loader->addFixture($campTemplateLoader); - $this->loadFixtures($loader); - - $this->user = $userLoader->getReference(UserTestData::$USER1); - $this->campTemplate = $campTemplateLoader->getReference(CampTemplateTestData::$TEMPLATE1); - - $this->authenticateUser($this->user); - } - - public function testFetch(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->campTemplate->getId()}", 'GET'); - - $this->assertResponseStatusCode(200); - - $expectedBody = <<campTemplate->getId()}", - "name": "CampTemplate1" - } -JSON; - - $expectedLinks = <<host}{$this->apiEndpoint}/{$this->campTemplate->getId()}" - } - } -JSON; - $expectedEmbeddedObjects = ['categoryTemplates']; - - $this->verifyHalResourceResponse($expectedBody, $expectedLinks, $expectedEmbeddedObjects); - } - - public function testFetchAll(): void { - $this->dispatch("{$this->apiEndpoint}?page_size=10", 'GET'); - - $this->assertResponseStatusCode(200); - - $this->assertEquals(1, $this->getResponseContent()->total_items); - $this->assertEquals(10, $this->getResponseContent()->page_size); - $this->assertEquals("http://{$this->host}{$this->apiEndpoint}?page_size=10&page=1", $this->getResponseContent()->_links->self->href); - $this->assertEquals($this->campTemplate->getId(), $this->getResponseContent()->_embedded->items[0]->id); - } - - public function testCreateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}", 'POST'); - $this->assertResponseStatusCode(405); - } - - public function testPatchForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->campTemplate->getId()}", 'PATCH'); - $this->assertResponseStatusCode(405); - } - - public function testUpdateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->campTemplate->getId()}", 'PUT'); - $this->assertResponseStatusCode(405); - } - - public function testDeleteForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->campTemplate->getId()}", 'DELETE'); - $this->assertResponseStatusCode(405); - } -} diff --git a/backend/module/eCampApi/test/Rest/CategoryContentTypeTemplateTest.php b/backend/module/eCampApi/test/Rest/CategoryContentTypeTemplateTest.php deleted file mode 100644 index 7b2f447bb9..0000000000 --- a/backend/module/eCampApi/test/Rest/CategoryContentTypeTemplateTest.php +++ /dev/null @@ -1,102 +0,0 @@ -addFixture($userLoader); - $loader->addFixture($categoryTemplateLoader); - $loader->addFixture($categoryContentTypeTemplateLoader); - $this->loadFixtures($loader); - - $this->user = $userLoader->getReference(UserTestData::$USER1); - $this->categoryTemplate = $categoryTemplateLoader->getReference(CategoryTemplateTestData::$TEMPLATE1); - $this->categoryContentTypeTemplate = $categoryContentTypeTemplateLoader->getReference(CategoryContentTypeTemplateTestData::$TEMPLATE1); - - $this->authenticateUser($this->user); - } - - public function testFetch(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryContentTypeTemplate->getId()}", 'GET'); - - $this->assertResponseStatusCode(200); - - $expectedBody = <<categoryContentTypeTemplate->getId()}" - } -JSON; - - $expectedLinks = <<host}{$this->apiEndpoint}/{$this->categoryContentTypeTemplate->getId()}" - } - } -JSON; - $expectedEmbeddedObjects = ['contentType']; - - $this->verifyHalResourceResponse($expectedBody, $expectedLinks, $expectedEmbeddedObjects); - } - - public function testFetchAll(): void { - $categoryTemplateId = $this->categoryTemplate->getId(); - $this->dispatch("{$this->apiEndpoint}?page_size=10&categoryTemplateId={$categoryTemplateId}", 'GET'); - - $this->assertResponseStatusCode(200); - - $this->assertEquals(1, $this->getResponseContent()->total_items); - $this->assertEquals(10, $this->getResponseContent()->page_size); - $this->assertEquals("http://{$this->host}{$this->apiEndpoint}?page_size=10&categoryTemplateId={$categoryTemplateId}&page=1", $this->getResponseContent()->_links->self->href); - $this->assertEquals($this->categoryContentTypeTemplate->getId(), $this->getResponseContent()->_embedded->items[0]->id); - } - - public function testCreateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}", 'POST'); - $this->assertResponseStatusCode(405); - } - - public function testPatchForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryContentTypeTemplate->getId()}", 'PATCH'); - $this->assertResponseStatusCode(405); - } - - public function testUpdateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryContentTypeTemplate->getId()}", 'PUT'); - $this->assertResponseStatusCode(405); - } - - public function testDeleteForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryContentTypeTemplate->getId()}", 'DELETE'); - $this->assertResponseStatusCode(405); - } -} diff --git a/backend/module/eCampApi/test/Rest/CategoryTemplateTest.php b/backend/module/eCampApi/test/Rest/CategoryTemplateTest.php deleted file mode 100644 index 342851b057..0000000000 --- a/backend/module/eCampApi/test/Rest/CategoryTemplateTest.php +++ /dev/null @@ -1,107 +0,0 @@ -addFixture($userLoader); - $loader->addFixture($campTemplateLoader); - $loader->addFixture($categoryTemplateLoader); - $this->loadFixtures($loader); - - $this->user = $userLoader->getReference(UserTestData::$USER1); - $this->campTemplate = $campTemplateLoader->getReference(CampTemplateTestData::$TEMPLATE1); - $this->categoryTemplate = $categoryTemplateLoader->getReference(CategoryTemplateTestData::$TEMPLATE1); - - $this->authenticateUser($this->user); - } - - public function testFetch(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryTemplate->getId()}", 'GET'); - - $this->assertResponseStatusCode(200); - - $expectedBody = <<categoryTemplate->getId()}", - "short": "AC", - "name": "ActivityCategory1", - "color": "#FF00FF", - "numberingStyle": "i" - } -JSON; - - $expectedLinks = <<host}{$this->apiEndpoint}/{$this->categoryTemplate->getId()}" - } - } -JSON; - $expectedEmbeddedObjects = ['categoryContentTypeTemplates', 'categoryContentTemplates']; - - $this->verifyHalResourceResponse($expectedBody, $expectedLinks, $expectedEmbeddedObjects); - } - - public function testFetchAll(): void { - $campTemplateId = $this->campTemplate->getId(); - $this->dispatch("{$this->apiEndpoint}?page_size=10&campTemplateId={$campTemplateId}", 'GET'); - - $this->assertResponseStatusCode(200); - - $this->assertEquals(1, $this->getResponseContent()->total_items); - $this->assertEquals(10, $this->getResponseContent()->page_size); - $this->assertEquals("http://{$this->host}{$this->apiEndpoint}?page_size=10&campTemplateId={$campTemplateId}&page=1", $this->getResponseContent()->_links->self->href); - $this->assertEquals($this->categoryTemplate->getId(), $this->getResponseContent()->_embedded->items[0]->id); - } - - public function testCreateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}", 'POST'); - $this->assertResponseStatusCode(405); - } - - public function testPatchForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryTemplate->getId()}", 'PATCH'); - $this->assertResponseStatusCode(405); - } - - public function testUpdateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryTemplate->getId()}", 'PUT'); - $this->assertResponseStatusCode(405); - } - - public function testDeleteForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->categoryTemplate->getId()}", 'DELETE'); - $this->assertResponseStatusCode(405); - } -} diff --git a/backend/module/eCampApi/test/Rest/MaterialListTemplateTest.php b/backend/module/eCampApi/test/Rest/MaterialListTemplateTest.php deleted file mode 100644 index fe204d8e2f..0000000000 --- a/backend/module/eCampApi/test/Rest/MaterialListTemplateTest.php +++ /dev/null @@ -1,102 +0,0 @@ -addFixture($userLoader); - $loader->addFixture($campTemplateLoader); - $loader->addFixture($materialListTemplateLoader); - $this->loadFixtures($loader); - - $this->user = $userLoader->getReference(UserTestData::$USER1); - $this->campTemplate = $campTemplateLoader->getReference(CampTemplateTestData::$TEMPLATE1); - $this->materialListTemplate = $materialListTemplateLoader->getReference(MaterialListTemplateTestData::$MATERIALLISTTEMPLATE1); - - $this->authenticateUser($this->user); - } - - public function testFetch(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->materialListTemplate->getId()}", 'GET'); - - $this->assertResponseStatusCode(200); - - $expectedBody = <<materialListTemplate->getId()}", - "name": "MaterialListTemplate1" - } -JSON; - - $expectedLinks = <<host}{$this->apiEndpoint}/{$this->materialListTemplate->getId()}" - } - } -JSON; - $expectedEmbeddedObjects = []; - - $this->verifyHalResourceResponse($expectedBody, $expectedLinks, $expectedEmbeddedObjects); - } - - public function testFetchAll(): void { - $campTemplateId = $this->campTemplate->getId(); - $this->dispatch("{$this->apiEndpoint}?page_size=10&campTemplateId={$campTemplateId}", 'GET'); - - $this->assertResponseStatusCode(200); - - $this->assertEquals(1, $this->getResponseContent()->total_items); - $this->assertEquals(10, $this->getResponseContent()->page_size); - $this->assertEquals("http://{$this->host}{$this->apiEndpoint}?page_size=10&campTemplateId={$campTemplateId}&page=1", $this->getResponseContent()->_links->self->href); - $this->assertEquals($this->materialListTemplate->getId(), $this->getResponseContent()->_embedded->items[0]->id); - } - - public function testCreateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}", 'POST'); - $this->assertResponseStatusCode(405); - } - - public function testPatchForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->materialListTemplate->getId()}", 'PATCH'); - $this->assertResponseStatusCode(405); - } - - public function testUpdateForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->materialListTemplate->getId()}", 'PUT'); - $this->assertResponseStatusCode(405); - } - - public function testDeleteForbidden(): void { - $this->dispatch("{$this->apiEndpoint}/{$this->materialListTemplate->getId()}", 'DELETE'); - $this->assertResponseStatusCode(405); - } -} diff --git a/backend/module/eCampApi/test/Rpc/RootTest.php b/backend/module/eCampApi/test/Rpc/RootTest.php index eabcb48723..d321fa2a99 100644 --- a/backend/module/eCampApi/test/Rpc/RootTest.php +++ b/backend/module/eCampApi/test/Rpc/RootTest.php @@ -65,10 +65,6 @@ public function testApiResponse(): void { "href": "http://{$host}/api/users{/userId}{?page_size,page,search}", "templated": true }, - "campTemplates": { - "href": "http://{$host}/api/camp-templates{/campTemplateId}{?page_size,page}", - "templated": true - }, "camps": { "href": "http://{$host}/api/camps{/campId}{?page_size,page}", "templated": true diff --git a/backend/module/eCampCore/data/dev/ScheduleEntryData.php b/backend/module/eCampCore/data/dev/ScheduleEntryData.php index e1a360ae4a..6bd17c0e15 100644 --- a/backend/module/eCampCore/data/dev/ScheduleEntryData.php +++ b/backend/module/eCampCore/data/dev/ScheduleEntryData.php @@ -4,7 +4,7 @@ use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\DependentFixtureInterface; -use Doctrine\Common\Persistence\ObjectManager; +use Doctrine\Persistence\ObjectManager; use eCamp\Core\Entity\Activity; use eCamp\Core\Entity\Period; use eCamp\Core\Entity\ScheduleEntry; diff --git a/backend/module/eCampCore/data/prod/AdminData.php b/backend/module/eCampCore/data/prod/AdminData.php new file mode 100644 index 0000000000..3c0941d6e6 --- /dev/null +++ b/backend/module/eCampCore/data/prod/AdminData.php @@ -0,0 +1,33 @@ +getRepository(User::class); + + /** @var User $admin */ + $admin = $repository->findOneBy(['username' => 'admin']); + if (null == $admin) { + $admin = new User(); + $admin->setUsername('admin'); + $admin->setRole(User::ROLE_ADMIN); + $admin->setState(User::STATE_ACTIVATED); + + $login = new Login($admin, 'admin'); + + $manager->persist($admin); + $manager->persist($login); + } + $this->addReference(self::$ADMIN, $admin); + + $manager->flush(); + } +} diff --git a/backend/module/eCampCore/data/prod/CampPrototypeData.php b/backend/module/eCampCore/data/prod/CampPrototypeData.php new file mode 100644 index 0000000000..420ba5bcde --- /dev/null +++ b/backend/module/eCampCore/data/prod/CampPrototypeData.php @@ -0,0 +1,55 @@ +getRepository(Camp::class); + + /** @var User $admin */ + $admin = $this->getReference(AdminData::$ADMIN); + + /** @var Camp $camp */ + $camp = $repository->findOneBy(['name' => 'J+S Kids']); + if (null == $camp) { + $camp = new Camp(); + $camp->setIsTemplate(true); + $camp->setName('J+S Kids'); + $camp->setTitle('J+S Kids'); + $camp->setCreator($admin); + $camp->setOwner($admin); + + $manager->persist($camp); + } + $this->addReference(self::$PBS_JS_KIDS, $camp); + + /** @var Camp $camp */ + $camp = $repository->findOneBy(['name' => 'J+S Teen']); + if (null == $camp) { + $camp = new Camp(); + $camp->setIsTemplate(true); + $camp->setName('J+S Teen'); + $camp->setTitle('J+S Teen'); + $camp->setCreator($admin); + $camp->setOwner($admin); + + $manager->persist($camp); + } + $this->addReference(self::$PBS_JS_TEEN, $camp); + + $manager->flush(); + } + + public function getDependencies() { + return [AdminData::class]; + } +} diff --git a/backend/module/eCampCore/data/prod/CampTemplateData.php b/backend/module/eCampCore/data/prod/CampTemplateData.php deleted file mode 100644 index 74901b6880..0000000000 --- a/backend/module/eCampCore/data/prod/CampTemplateData.php +++ /dev/null @@ -1,38 +0,0 @@ -getRepository(CampTemplate::class); - - /** @var CampTemplate $campTemplate */ - $campTemplate = $repository->findOneBy(['name' => 'J+S Kids']); - if (null == $campTemplate) { - $campTemplate = new CampTemplate(); - $campTemplate->setName('J+S Kids'); - - $manager->persist($campTemplate); - } - $this->addReference(self::$PBS_JS_KIDS, $campTemplate); - - /** @var CampTemplate $campTemplate */ - $campTemplate = $repository->findOneBy(['name' => 'J+S Teen']); - if (null == $campTemplate) { - $campTemplate = new CampTemplate(); - $campTemplate->setName('J+S Teen'); - - $manager->persist($campTemplate); - } - $this->addReference(self::$PBS_JS_TEEN, $campTemplate); - - $manager->flush(); - } -} diff --git a/backend/module/eCampCore/data/prod/CategoryTemplateData.php b/backend/module/eCampCore/data/prod/CategoryPrototypeData.php similarity index 74% rename from backend/module/eCampCore/data/prod/CategoryTemplateData.php rename to backend/module/eCampCore/data/prod/CategoryPrototypeData.php index 08bf7e638a..f2a94573d4 100644 --- a/backend/module/eCampCore/data/prod/CategoryTemplateData.php +++ b/backend/module/eCampCore/data/prod/CategoryPrototypeData.php @@ -5,31 +5,31 @@ use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Persistence\ObjectManager; -use eCamp\Core\Entity\CampTemplate; -use eCamp\Core\Entity\CategoryContentTypeTemplate; -use eCamp\Core\Entity\CategoryTemplate; +use eCamp\Core\Entity\Camp; +use eCamp\Core\Entity\Category; +use eCamp\Core\Entity\CategoryContentType; use eCamp\Core\Entity\ContentType; -class CategoryTemplateData extends AbstractFixture implements DependentFixtureInterface { +class CategoryPrototypeData extends AbstractFixture implements DependentFixtureInterface { public static $PBS_JS_KIDS_LAGERSPORT = 'PBS_JS_KIDS_LAGERSPORT'; public static $PBS_JS_KIDS_LAGERAKTIVITAET = 'PBS_JS_KIDS_LAGERAKTIVITAET'; public static $PBS_JS_TEEN_LAGERSPORT = 'PBS_JS_TEEN_LAGERSPORT'; public static $PBS_JS_TEEN_LAGERAKTIVITAET = 'PBS_JS_TEEN_LAGERAKTIVITAET'; public function load(ObjectManager $manager): void { - $repository = $manager->getRepository(CategoryTemplate::class); + $repository = $manager->getRepository(Category::class); - /** @var CampTemplate $pbsJsKids */ - $pbsJsKids = $this->getReference(CampTemplateData::$PBS_JS_KIDS); + /** @var Camp $pbsJsKids */ + $pbsJsKids = $this->getReference(CampPrototypeData::$PBS_JS_KIDS); - $lagersport = $repository->findOneBy(['name' => 'Lagersport', 'campTemplate' => $pbsJsKids]); + $lagersport = $repository->findOneBy(['name' => 'Lagersport', 'camp' => $pbsJsKids]); if (null == $lagersport) { - $lagersport = new CategoryTemplate(); + $lagersport = new Category(); $lagersport->setShort('LS'); $lagersport->setName('Lagersport'); $lagersport->setColor('#4CAF50'); $lagersport->setNumberingStyle('1'); - $pbsJsKids->addCategoryTemplate($lagersport); + $pbsJsKids->addCategory($lagersport); $manager->persist($lagersport); // add allowed content types @@ -41,14 +41,14 @@ public function load(ObjectManager $manager): void { } $this->addReference(self::$PBS_JS_KIDS_LAGERSPORT, $lagersport); - $lageraktivitaet = $repository->findOneBy(['name' => 'Lageraktivität', 'campTemplate' => $pbsJsKids]); + $lageraktivitaet = $repository->findOneBy(['name' => 'Lageraktivität', 'camp' => $pbsJsKids]); if (null == $lageraktivitaet) { - $lageraktivitaet = new CategoryTemplate(); + $lageraktivitaet = new Category(); $lageraktivitaet->setShort('LA'); $lageraktivitaet->setName('Lageraktivität'); $lageraktivitaet->setColor('#FF9800'); $lageraktivitaet->setNumberingStyle('A'); - $pbsJsKids->addCategoryTemplate($lageraktivitaet); + $pbsJsKids->addCategory($lageraktivitaet); $manager->persist($lageraktivitaet); // add allowed content types @@ -60,17 +60,17 @@ public function load(ObjectManager $manager): void { } $this->addReference(self::$PBS_JS_KIDS_LAGERAKTIVITAET, $lageraktivitaet); - /** @var CampTemplate $pbsJsTeen */ - $pbsJsTeen = $this->getReference(CampTemplateData::$PBS_JS_TEEN); + /** @var Camp $pbsJsTeen */ + $pbsJsTeen = $this->getReference(CampPrototypeData::$PBS_JS_TEEN); - $lagersport = $repository->findOneBy(['name' => 'Lagersport', 'campTemplate' => $pbsJsTeen]); + $lagersport = $repository->findOneBy(['name' => 'Lagersport', 'camp' => $pbsJsTeen]); if (null == $lagersport) { - $lagersport = new CategoryTemplate(); + $lagersport = new Category(); $lagersport->setShort('LS'); $lagersport->setName('Lagersport'); $lagersport->setColor('#4CAF50'); $lagersport->setNumberingStyle('1'); - $pbsJsTeen->addCategoryTemplate($lagersport); + $pbsJsTeen->addCategory($lagersport); $manager->persist($lagersport); // add allowed content types @@ -82,14 +82,14 @@ public function load(ObjectManager $manager): void { } $this->addReference(self::$PBS_JS_TEEN_LAGERSPORT, $lagersport); - $lageraktivitaet = $repository->findOneBy(['name' => 'Lageraktivität', 'campTemplate' => $pbsJsTeen]); + $lageraktivitaet = $repository->findOneBy(['name' => 'Lageraktivität', 'camp' => $pbsJsTeen]); if (null == $lageraktivitaet) { - $lageraktivitaet = new CategoryTemplate(); + $lageraktivitaet = new Category(); $lageraktivitaet->setShort('LA'); $lageraktivitaet->setName('Lageraktivität'); $lageraktivitaet->setColor('#FF9800'); $lageraktivitaet->setNumberingStyle('A'); - $pbsJsTeen->addCategoryTemplate($lageraktivitaet); + $pbsJsTeen->addCategory($lageraktivitaet); $manager->persist($lageraktivitaet); // add allowed content types @@ -105,15 +105,15 @@ public function load(ObjectManager $manager): void { } public function getDependencies() { - return [CampTemplateData::class, ContentTypeData::class]; + return [CampPrototypeData::class, ContentTypeData::class]; } - private function addContentType(ObjectManager $manager, CategoryTemplate $categoryTemplate, ContentType $contentType): CategoryContentTypeTemplate { - $categoryContentTypeTemplate = new CategoryContentTypeTemplate(); - $categoryContentTypeTemplate->setContentType($contentType); - $categoryTemplate->addCategoryContentTypeTemplate($categoryContentTypeTemplate); - $manager->persist($categoryContentTypeTemplate); + private function addContentType(ObjectManager $manager, Category $category, ContentType $contentType): CategoryContentType { + $categoryContentType = new CategoryContentType(); + $categoryContentType->setContentType($contentType); + $category->addCategoryContentType($categoryContentType); + $manager->persist($categoryContentType); - return $categoryContentTypeTemplate; + return $categoryContentType; } } diff --git a/backend/module/eCampCore/data/prod/MaterialListPrototypeData.php b/backend/module/eCampCore/data/prod/MaterialListPrototypeData.php new file mode 100644 index 0000000000..e04eae0ba6 --- /dev/null +++ b/backend/module/eCampCore/data/prod/MaterialListPrototypeData.php @@ -0,0 +1,54 @@ +getRepository(MaterialList::class); + + /** @var MaterialList $migros */ + $migros = $repository->findOneBy(['name' => 'Migros']); + if (null == $migros) { + $migros = new MaterialList(); + $migros->setName('Migros'); + $manager->persist($migros); + } + $this->addReference(self::$MIGROS, $migros); + + /** @var Camp $pbsJsKids */ + $pbsJsKids = $this->getReference(CampPrototypeData::$PBS_JS_KIDS); + if (!$pbsJsKids->getMaterialLists()->contains($migros)) { + $pbsJsKids->addMaterialList($migros); + } + + /** @var MaterialList $coop */ + $coop = $repository->findOneBy(['name' => 'Coop']); + if (null == $coop) { + $coop = new MaterialList(); + $coop->setName('Coop'); + $manager->persist($coop); + } + $this->addReference(self::$COOP, $coop); + + /** @var Camp $pbsJsTeen */ + $pbsJsTeen = $this->getReference(CampPrototypeData::$PBS_JS_TEEN); + if (!$pbsJsTeen->getMaterialLists()->contains($coop)) { + $pbsJsTeen->addMaterialList($coop); + } + + $manager->flush(); + } + + public function getDependencies() { + return [CampPrototypeData::class]; + } +} diff --git a/backend/module/eCampCore/data/prod/MaterialListTemplateData.php b/backend/module/eCampCore/data/prod/MaterialListTemplateData.php deleted file mode 100644 index ec9dbc5fe4..0000000000 --- a/backend/module/eCampCore/data/prod/MaterialListTemplateData.php +++ /dev/null @@ -1,64 +0,0 @@ -manager = $manager; - - $repository = $manager->getRepository(MaterialListTemplate::class); - - /** @var MaterialListTemplate $migros */ - $migros = $repository->findOneBy(['name' => 'Migros']); - if (null == $migros) { - $migros = new MaterialListTemplate(); - $migros->setName('Migros'); - $manager->persist($migros); - } - $this->addReference(self::$MIGROS, $migros); - - /** @var MaterialListTemplate $migros */ - $coop = $repository->findOneBy(['name' => 'Coop']); - if (null == $coop) { - $coop = new MaterialListTemplate(); - $coop->setName('Coop'); - $manager->persist($coop); - } - $this->addReference(self::$COOP, $coop); - - /** @var CampTemplate $pbsJsKids */ - $pbsJsKids = $this->getReference(CampTemplateData::$PBS_JS_KIDS); - if (!$pbsJsKids->getMaterialListTemplates()->contains($migros)) { - $pbsJsKids->addMaterialListTemplate($migros); - } - if (!$pbsJsKids->getMaterialListTemplates()->contains($coop)) { - $pbsJsKids->addMaterialListTemplate($coop); - } - - /** @var CampTemplate $pbsJsTeen */ - $pbsJsTeen = $this->getReference(CampTemplateData::$PBS_JS_TEEN); - if (!$pbsJsTeen->getMaterialListTemplates()->contains($migros)) { - $pbsJsTeen->addMaterialListTemplate($migros); - } - if (!$pbsJsTeen->getMaterialListTemplates()->contains($coop)) { - $pbsJsTeen->addMaterialListTemplate($coop); - } - - $manager->flush(); - } - - public function getDependencies() { - return [CampTemplateData::class]; - } -} diff --git a/backend/module/eCampCore/src/Acl/AclAssertion.php b/backend/module/eCampCore/src/Acl/AclAssertion.php new file mode 100644 index 0000000000..0f4d7616a2 --- /dev/null +++ b/backend/module/eCampCore/src/Acl/AclAssertion.php @@ -0,0 +1,59 @@ +operand = self::OR; + $assertion->assertions = $assertions; + + return $assertion; + } + + public static function and(...$assertions): AclAssertion { + $assertion = new AclAssertion(); + $assertion->operand = self::AND; + $assertion->assertions = $assertions; + + return $assertion; + } + + public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $resource = null, $privilege = null): bool { + if (self::OR == $this->operand) { + for ($i = 0; $i < count($this->assertions); ++$i) { + /** @var AclAssertion $assertion */ + $assertion = $this->assertions[$i]; + if ($assertion->assert($acl, $role, $resource, $privilege)) { + return true; + } + } + + return false; + } + if (self::AND == $this->operand) { + for ($i = 0; $i < count($this->assertions); ++$i) { + /** @var AclAssertion $assertion */ + $assertion = $this->assertions[$i]; + if (!$assertion->assert($acl, $role, $resource, $privilege)) { + return false; + } + } + + return true; + } + + return false; + } +} diff --git a/backend/module/eCampCore/src/Acl/AclFactory.php b/backend/module/eCampCore/src/Acl/AclFactory.php index 7397a48e63..14f0390c6c 100644 --- a/backend/module/eCampCore/src/Acl/AclFactory.php +++ b/backend/module/eCampCore/src/Acl/AclFactory.php @@ -2,17 +2,13 @@ namespace eCamp\Core\Acl; +use eCamp\Core\Entity\AbstractContentNodeOwner; use eCamp\Core\Entity\Activity; use eCamp\Core\Entity\ActivityResponsible; use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\CampCollaboration; -use eCamp\Core\Entity\CampTemplate; use eCamp\Core\Entity\Category; -use eCamp\Core\Entity\CategoryContent; -use eCamp\Core\Entity\CategoryContentTemplate; use eCamp\Core\Entity\CategoryContentType; -use eCamp\Core\Entity\CategoryContentTypeTemplate; -use eCamp\Core\Entity\CategoryTemplate; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; use eCamp\Core\Entity\Day; @@ -20,7 +16,6 @@ use eCamp\Core\Entity\GroupMembership; use eCamp\Core\Entity\MaterialItem; use eCamp\Core\Entity\MaterialList; -use eCamp\Core\Entity\MaterialListTemplate; use eCamp\Core\Entity\Organization; use eCamp\Core\Entity\Period; use eCamp\Core\Entity\ScheduleEntry; @@ -55,18 +50,12 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o $acl->addResource(Group::class, BaseEntity::class); $acl->addResource(GroupMembership::class, BaseEntity::class); - $acl->addResource(CampTemplate::class, BaseEntity::class); - $acl->addResource(MaterialListTemplate::class, BaseEntity::class); - $acl->addResource(CategoryTemplate::class, BaseEntity::class); - $acl->addResource(CategoryContentTypeTemplate::class, BaseEntity::class); - $acl->addResource(CategoryContentTemplate::class, BaseEntity::class); - $acl->addResource(ContentType::class, BaseEntity::class); - + $acl->addResource(AbstractContentNodeOwner::class, BaseEntity::class); $acl->addResource(Activity::class, BaseEntity::class); $acl->addResource(Category::class, BaseEntity::class); $acl->addResource(CategoryContentType::class, BaseEntity::class); - $acl->addResource(CategoryContent::class, BaseEntity::class); $acl->addResource(ContentNode::class, BaseEntity::class); + $acl->addResource(ContentType::class, BaseEntity::class); $acl->addResource(ActivityResponsible::class, BaseEntity::class); $acl->addResource(ScheduleEntry::class, BaseEntity::class); @@ -90,11 +79,6 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o [ Organization::class, Group::class, - CampTemplate::class, - MaterialListTemplate::class, - CategoryTemplate::class, - CategoryContentTypeTemplate::class, - CategoryContentTemplate::class, ContentType::class, ], [ @@ -126,11 +110,33 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o ); $acl->allow(User::ROLE_USER, [Camp::class], [ACL::REST_PRIVILEGE_CREATE, ACL::REST_PRIVILEGE_FETCH_ALL]); + $acl->allow( + User::ROLE_USER, + [ + Camp::class, + CampCollaboration::class, + Period::class, + Day::class, + AbstractContentNodeOwner::class, + Activity::class, + Category::class, + CategoryContentType::class, + ActivityResponsible::class, + ScheduleEntry::class, + ContentNode::class, + MaterialList::class, + MaterialItem::class, + ], + Acl::REST_PRIVILEGE_FETCH, + AclAssertion::or( + new CampIsPrototype(), + new UserIsCollaborator([CampCollaboration::ROLE_MEMBER, CampCollaboration::ROLE_MANAGER]) + ) + ); $acl->allow( User::ROLE_USER, Camp::class, [ - Acl::REST_PRIVILEGE_FETCH, Acl::REST_PRIVILEGE_PATCH, Acl::REST_PRIVILEGE_UPDATE, ], @@ -148,19 +154,17 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o CampCollaboration::class, Period::class, Day::class, + AbstractContentNodeOwner::class, Activity::class, Category::class, CategoryContentType::class, - CategoryContent::class, ActivityResponsible::class, ScheduleEntry::class, ContentNode::class, MaterialList::class, MaterialItem::class, ], - [ - Acl::REST_PRIVILEGE_FETCH_ALL, - ] + Acl::REST_PRIVILEGE_FETCH_ALL, ); $acl->allow( User::ROLE_USER, @@ -168,10 +172,10 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o CampCollaboration::class, Period::class, Day::class, + AbstractContentNodeOwner::class, Activity::class, Category::class, CategoryContentType::class, - CategoryContent::class, ActivityResponsible::class, ScheduleEntry::class, ContentNode::class, @@ -180,7 +184,6 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o ], [ Acl::REST_PRIVILEGE_CREATE, - Acl::REST_PRIVILEGE_FETCH, Acl::REST_PRIVILEGE_DELETE, Acl::REST_PRIVILEGE_PATCH, Acl::REST_PRIVILEGE_UPDATE, diff --git a/backend/module/eCampCore/src/Acl/CampIsPrototype.php b/backend/module/eCampCore/src/Acl/CampIsPrototype.php new file mode 100644 index 0000000000..4fb449cf4c --- /dev/null +++ b/backend/module/eCampCore/src/Acl/CampIsPrototype.php @@ -0,0 +1,26 @@ +getContentNode(); + } + + if ($resource instanceof BelongsToCampInterface) { + $camp = $resource->getCamp(); + + return $camp->getIsTemplate(); + } + + return false; + } +} diff --git a/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php b/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php new file mode 100644 index 0000000000..dbdcb43287 --- /dev/null +++ b/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php @@ -0,0 +1,53 @@ +contentNodes = new ArrayCollection(); + } + + public function getRootContentNode(): ?ContentNode { + return $this->rootContentNode; + } + + public function setRootContentNode(?ContentNode $rootContentNode) { + $this->rootContentNode = $rootContentNode; + } + + public function getContentNodes(): Collection { + return $this->contentNodes; + } + + public function addContentNode(ContentNode $contentNode) { + $contentNode->setOwner($this); + $this->contentNodes->add($contentNode); + } + + public function removeContentNode(ContentNode $contentNode) { + $contentNode->setOwner(null); + $this->contentNodes->removeElement($contentNode); + } +} diff --git a/backend/module/eCampCore/src/Entity/Activity.php b/backend/module/eCampCore/src/Entity/Activity.php index 6b8fd61cb6..3b7271a0b3 100644 --- a/backend/module/eCampCore/src/Entity/Activity.php +++ b/backend/module/eCampCore/src/Entity/Activity.php @@ -5,18 +5,12 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; -use eCamp\Lib\Entity\BaseEntity; /** * @ORM\Entity * @ORM\HasLifecycleCallbacks */ -class Activity extends BaseEntity implements BelongsToCampInterface { - /** - * @ORM\OneToMany(targetEntity="ContentNode", mappedBy="activity", cascade={"all"}, orphanRemoval=true) - */ - protected Collection $contentNodes; - +class Activity extends AbstractContentNodeOwner implements BelongsToCampInterface { /** * @ORM\OneToMany(targetEntity="ScheduleEntry", mappedBy="activity", orphanRemoval=true) */ @@ -52,7 +46,6 @@ class Activity extends BaseEntity implements BelongsToCampInterface { public function __construct() { parent::__construct(); - $this->contentNodes = new ArrayCollection(); $this->scheduleEntries = new ArrayCollection(); $this->activityResponsibles = new ArrayCollection(); } @@ -94,20 +87,6 @@ public function setLocation(?string $location): void { $this->location = $location; } - public function getContentNodes(): Collection { - return $this->contentNodes; - } - - public function addContentNode(ContentNode $contentNode): void { - $contentNode->setActivity($this); - $this->contentNodes->add($contentNode); - } - - public function removeContentNode(ContentNode $contentNode): void { - $contentNode->setActivity(null); - $this->contentNodes->removeElement($contentNode); - } - public function getScheduleEntries(): Collection { return $this->scheduleEntries; } diff --git a/backend/module/eCampCore/src/Entity/Camp.php b/backend/module/eCampCore/src/Entity/Camp.php index f507f72628..9940788092 100644 --- a/backend/module/eCampCore/src/Entity/Camp.php +++ b/backend/module/eCampCore/src/Entity/Camp.php @@ -51,7 +51,12 @@ class Camp extends BaseEntity implements BelongsToCampInterface { /** * @ORM\Column(type="string", length=32, nullable=true) */ - private ?string $campTemplateId = null; + private ?string $campPrototypeId = null; + + /** + * @ORM\Column(type="boolean", nullable=false) + */ + private bool $isTemplate = false; /** * @ORM\Column(type="string", length=32, nullable=false) @@ -64,7 +69,7 @@ class Camp extends BaseEntity implements BelongsToCampInterface { private ?string $title = null; /** - * @ORM\Column(type="string", length=128, nullable=false) + * @ORM\Column(type="string", length=128, nullable=true) */ private ?string $motto = null; @@ -91,12 +96,20 @@ public function __construct() { $this->materialLists = new ArrayCollection(); } - public function getCampTemplateId(): ?string { - return $this->campTemplateId; + public function getCampPrototypeId(): ?string { + return $this->campPrototypeId; + } + + public function setCampPrototypeId(?string $campPrototypeId): void { + $this->campPrototypeId = $campPrototypeId; + } + + public function getIsTemplate(): bool { + return $this->isTemplate; } - public function setCampTemplateId(?string $campTemplateId): void { - $this->campTemplateId = $campTemplateId; + public function setIsTemplate(bool $isTemplate) { + $this->isTemplate = $isTemplate; } public function getName(): ?string { diff --git a/backend/module/eCampCore/src/Entity/CampTemplate.php b/backend/module/eCampCore/src/Entity/CampTemplate.php deleted file mode 100644 index 359a3aa13e..0000000000 --- a/backend/module/eCampCore/src/Entity/CampTemplate.php +++ /dev/null @@ -1,73 +0,0 @@ -categoryTemplates = new ArrayCollection(); - $this->materialListTemplates = new ArrayCollection(); - } - - public function getName(): ?string { - return $this->name; - } - - public function setName(?string $name): void { - $this->name = $name; - } - - public function getCategoryTemplates(): Collection { - return $this->categoryTemplates; - } - - public function addCategoryTemplate(CategoryTemplate $categoryTemplate): void { - $categoryTemplate->setCampTemplate($this); - $this->categoryTemplates->add($categoryTemplate); - } - - public function removeCategoryTemplate(CategoryTemplate $categoryTemplate): void { - $categoryTemplate->setCampTemplate(null); - $this->categoryTemplates->removeElement($categoryTemplate); - } - - public function getMaterialListTemplates(): Collection { - return $this->materialListTemplates; - } - - public function addMaterialListTemplate(MaterialListTemplate $materialListTemplate): void { - $materialListTemplate->setCampTemplate($this); - $this->materialListTemplates->add($materialListTemplate); - } - - public function removeMaterialListTemplate(MaterialListTemplate $materialListTemplate): void { - $materialListTemplate->setCampTemplate(null); - $this->materialListTemplates->removeElement($materialListTemplate); - } -} diff --git a/backend/module/eCampCore/src/Entity/Category.php b/backend/module/eCampCore/src/Entity/Category.php index c3fc1f65f3..ec99cfb5f1 100644 --- a/backend/module/eCampCore/src/Entity/Category.php +++ b/backend/module/eCampCore/src/Entity/Category.php @@ -5,34 +5,28 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; -use eCamp\Lib\Entity\BaseEntity; /** * Category. * * @ORM\Entity */ -class Category extends BaseEntity implements BelongsToCampInterface { - /** - * @ORM\OneToMany(targetEntity="CategoryContentType", mappedBy="category", orphanRemoval=true) - */ - protected Collection $categoryContentTypes; - - /** - * @ORM\OneToMany(targetEntity="CategoryContent", mappedBy="category", orphanRemoval=true) - */ - protected Collection $categoryContents; - +class Category extends AbstractContentNodeOwner implements BelongsToCampInterface { /** * @ORM\ManyToOne(targetEntity="Camp") * @ORM\JoinColumn(nullable=false, onDelete="cascade") */ private ?Camp $camp = null; + /** + * @ORM\OneToMany(targetEntity="CategoryContentType", mappedBy="category", orphanRemoval=true) + */ + private Collection $categoryContentTypes; + /** * @ORM\Column(type="string", length=32, nullable=true) */ - private ?string $categoryTemplateId = null; + private ?string $categoryPrototypeId = null; /** * @ORM\Column(type="string", length=16, nullable=false) @@ -58,7 +52,6 @@ public function __construct() { parent::__construct(); $this->categoryContentTypes = new ArrayCollection(); - $this->categoryContents = new ArrayCollection(); } public function getCamp(): ?Camp { @@ -86,30 +79,12 @@ public function removeCategoryContentType(CategoryContentType $categoryContentTy $this->categoryContentTypes->removeElement($categoryContentType); } - public function getCategoryContents(): Collection { - return $this->categoryContents; - } - - public function getRootCategoryContents(): Collection { - return $this->categoryContents->filter(fn (CategoryContent $cc) => $cc->isRoot()); - } - - public function addCategoryContent(CategoryContent $categoryContent): void { - $categoryContent->setCategory($this); - $this->categoryContents->add($categoryContent); - } - - public function removeCategoryContent(CategoryContent $categoryContent): void { - $categoryContent->setCategory(null); - $this->categoryContents->removeElement($categoryContent); - } - - public function getCategoryTemplateId(): ?string { - return $this->categoryTemplateId; + public function getCategoryPrototypeId(): ?string { + return $this->categoryPrototypeId; } - public function setCategoryTemplateId(?string $categoryTemplateId): void { - $this->categoryTemplateId = $categoryTemplateId; + public function setCategoryPrototypeId(?string $categoryPrototypeId): void { + $this->categoryPrototypeId = $categoryPrototypeId; } public function getShort(): ?string { diff --git a/backend/module/eCampCore/src/Entity/CategoryContent.php b/backend/module/eCampCore/src/Entity/CategoryContent.php deleted file mode 100644 index 33c272a265..0000000000 --- a/backend/module/eCampCore/src/Entity/CategoryContent.php +++ /dev/null @@ -1,128 +0,0 @@ -children = new ArrayCollection(); - } - - public function getCategory(): ?Category { - return $this->category; - } - - public function setCategory(?Category $category): void { - $this->category = $category; - } - - public function getCamp(): ?Camp { - return (null != $this->category) ? $this->category->getCamp() : null; - } - - public function isRoot(): bool { - return null == $this->parent; - } - - public function getParent(): ?CategoryContent { - return $this->parent; - } - - public function setParent(?CategoryContent $parent): void { - $this->parent = $parent; - } - - public function getContentType(): ?ContentType { - return $this->contentType; - } - - public function setContentType(?ContentType $contentType): void { - $this->contentType = $contentType; - } - - public function getInstanceName(): ?string { - return $this->instanceName; - } - - public function setInstanceName(?string $instanceName): void { - $this->instanceName = $instanceName; - } - - public function getChildren(): Collection { - return $this->children; - } - - public function addChild(CategoryContent $categoryContent): void { - $categoryContent->setParent($this); - $this->children->add($categoryContent); - } - - public function removeChild(CategoryContent $categoryContent): void { - $categoryContent->setParent(null); - $this->children->removeElement($categoryContent); - } - - public function getPosition() { - return $this->position; - } - - public function setPosition($position): void { - $this->position = $position; - } - - public function getCategoryContentTemplateId(): ?string { - return $this->categoryContentTemplateId; - } - - public function setCategoryContentTemplateId(?string $categoryContentTemplateId): void { - $this->categoryContentTemplateId = $categoryContentTemplateId; - } -} diff --git a/backend/module/eCampCore/src/Entity/CategoryContentTemplate.php b/backend/module/eCampCore/src/Entity/CategoryContentTemplate.php deleted file mode 100644 index e92e1c9fd0..0000000000 --- a/backend/module/eCampCore/src/Entity/CategoryContentTemplate.php +++ /dev/null @@ -1,111 +0,0 @@ -children = new ArrayCollection(); - } - - public function getCategoryTemplate(): ?CategoryTemplate { - return $this->categoryTemplate; - } - - public function setCategoryTemplate(?CategoryTemplate $categoryTemplate): void { - $this->categoryTemplate = $categoryTemplate; - } - - public function isRoot(): bool { - return null == $this->parent; - } - - public function getParent(): ?CategoryContentTemplate { - return $this->parent; - } - - public function setParent(?CategoryContentTemplate $parent): void { - $this->parent = $parent; - } - - public function getContentType(): ?ContentType { - return $this->contentType; - } - - public function setContentType(?ContentType $contentType): void { - $this->contentType = $contentType; - } - - public function getInstanceName(): ?string { - return $this->instanceName; - } - - public function setInstanceName(?string $instanceName): void { - $this->instanceName = $instanceName; - } - - public function getChildren(): Collection { - return $this->children; - } - - public function addChild(CategoryContentTemplate $categoryContentTemplate): void { - $categoryContentTemplate->setParent($this); - $this->children->add($categoryContentTemplate); - } - - public function removeChild(CategoryContentTemplate $categoryContentTemplate): void { - $categoryContentTemplate->setParent(null); - $this->children->removeElement($categoryContentTemplate); - } - - public function getPosition() { - return $this->position; - } - - public function setPosition($position): void { - $this->position = $position; - } -} diff --git a/backend/module/eCampCore/src/Entity/CategoryContentType.php b/backend/module/eCampCore/src/Entity/CategoryContentType.php index a3e8ae7092..b05223fccb 100644 --- a/backend/module/eCampCore/src/Entity/CategoryContentType.php +++ b/backend/module/eCampCore/src/Entity/CategoryContentType.php @@ -27,7 +27,7 @@ class CategoryContentType extends BaseEntity implements BelongsToCampInterface { /** * @ORM\Column(type="string", length=32, nullable=true) */ - private ?string $categoryContentTypeTemplateId = null; + private ?string $categoryContentTypePrototypeId = null; public function getCamp(): ?Camp { return (null != $this->category) ? $this->category->getCamp() : null; @@ -49,11 +49,11 @@ public function setContentType(?ContentType $contentType): void { $this->contentType = $contentType; } - public function getCategoryContentTypeTemplateId(): ?string { - return $this->categoryContentTypeTemplateId; + public function getCategoryContentTypePrototypeId(): ?string { + return $this->categoryContentTypePrototypeId; } - public function setCategoryContentTypeTemplateId(?string $categoryContentTypeTemplateId): void { - $this->categoryContentTypeTemplateId = $categoryContentTypeTemplateId; + public function setCategoryContentTypePrototypeId(?string $categoryContentTypePrototypeId): void { + $this->categoryContentTypePrototypeId = $categoryContentTypePrototypeId; } } diff --git a/backend/module/eCampCore/src/Entity/CategoryContentTypeTemplate.php b/backend/module/eCampCore/src/Entity/CategoryContentTypeTemplate.php deleted file mode 100644 index 38cd35cf00..0000000000 --- a/backend/module/eCampCore/src/Entity/CategoryContentTypeTemplate.php +++ /dev/null @@ -1,42 +0,0 @@ -categoryTemplate; - } - - public function setCategoryTemplate(?CategoryTemplate $categoryTemplate): void { - $this->categoryTemplate = $categoryTemplate; - } - - public function getContentType(): ?ContentType { - return $this->contentType; - } - - public function setContentType(?ContentType $contentType): void { - $this->contentType = $contentType; - } -} diff --git a/backend/module/eCampCore/src/Entity/CategoryTemplate.php b/backend/module/eCampCore/src/Entity/CategoryTemplate.php deleted file mode 100644 index 7a0aa7e8db..0000000000 --- a/backend/module/eCampCore/src/Entity/CategoryTemplate.php +++ /dev/null @@ -1,130 +0,0 @@ -categoryContentTypeTemplates = new ArrayCollection(); - $this->categoryContentTemplates = new ArrayCollection(); - } - - public function getCampTemplate(): ?CampTemplate { - return $this->campTemplate; - } - - public function setCampTemplate(?CampTemplate $campTemplate): void { - $this->campTemplate = $campTemplate; - } - - public function getShort(): ?string { - return $this->short; - } - - public function setShort(?string $short): void { - $this->short = $short; - } - - public function getName(): ?string { - return $this->name; - } - - public function setName(?string $name): void { - $this->name = $name; - } - - public function getColor(): ?string { - return $this->color; - } - - public function setColor(?string $color): void { - $this->color = $color; - } - - public function getNumberingStyle(): ?string { - return $this->numberingStyle; - } - - public function setNumberingStyle(?string $numberingStyle): void { - $this->numberingStyle = $numberingStyle; - } - - public function getCategoryContentTypeTemplates(): Collection { - return $this->categoryContentTypeTemplates; - } - - public function addCategoryContentTypeTemplate(CategoryContentTypeTemplate $categoryContentTypeTemplate): void { - $categoryContentTypeTemplate->setCategoryTemplate($this); - $this->categoryContentTypeTemplates->add($categoryContentTypeTemplate); - } - - public function removeCategoryContentTypeTemplate(CategoryContentTypeTemplate $categoryContentTypeTemplate): void { - $categoryContentTypeTemplate->setCategoryTemplate(null); - $this->categoryContentTypeTemplates->removeElement($categoryContentTypeTemplate); - } - - public function getCategoryContentTemplates(): Collection { - return $this->categoryContentTemplates; - } - - public function getRootCategoryContentTemplates(): Collection { - return $this->categoryContentTemplates->filter(fn (CategoryContentTemplate $cct) => $cct->isRoot()); - } - - public function addCategoryContentTemplate(CategoryContentTemplate $categoryContentTemplate): void { - $categoryContentTemplate->setCategoryTemplate($this); - $this->categoryContentTemplates->add($categoryContentTemplate); - } - - public function removeCategoryContentTemplate(CategoryContentTemplate $categoryContentTemplate): void { - $categoryContentTemplate->setCategoryTemplate(null); - $this->categoryContentTemplates->removeElement($categoryContentTemplate); - } -} diff --git a/backend/module/eCampCore/src/Entity/ContentNode.php b/backend/module/eCampCore/src/Entity/ContentNode.php index 10d87ca0ad..2ed30c7363 100644 --- a/backend/module/eCampCore/src/Entity/ContentNode.php +++ b/backend/module/eCampCore/src/Entity/ContentNode.php @@ -14,14 +14,14 @@ * @ORM\Entity * @ORM\HasLifecycleCallbacks */ -class ContentNode extends BaseEntity implements ContentTypeStrategyProviderAware, BelongsToCampInterface { +class ContentNode extends BaseEntity implements BelongsToCampInterface, ContentTypeStrategyProviderAware { use ContentTypeStrategyProviderTrait; /** - * @ORM\ManyToOne(targetEntity="Activity") - * @ORM\JoinColumn(nullable=false, onDelete="cascade") + * @ORM\ManyToOne(targetEntity="AbstractContentNodeOwner", inversedBy="contentNodes") + * @ORM\JoinColumn(nullable=false) */ - private ?Activity $activity = null; + private ?AbstractContentNodeOwner $owner = null; /** * @ORM\ManyToOne(targetEntity="ContentNode") @@ -34,10 +34,20 @@ class ContentNode extends BaseEntity implements ContentTypeStrategyProviderAware */ private Collection $children; + /** + * @ORM\Column(type="string", length=64, nullable=true) + */ + private ?string $slot = null; + + /** + * @ORM\Column(type="integer", nullable=true) + */ + private ?float $position = null; + /** * @ORM\Column(type="json", nullable=true) */ - private ?string $position = null; + private ?string $config = null; /** * @ORM\ManyToOne(targetEntity="ContentType") @@ -56,16 +66,16 @@ public function __construct() { $this->children = new ArrayCollection(); } - public function getActivity(): ?Activity { - return $this->activity; + public function getOwner(): ?AbstractContentNodeOwner { + return $this->owner; } - public function setActivity(?Activity $activity): void { - $this->activity = $activity; + public function setOwner(?AbstractContentNodeOwner $owner): void { + $this->owner = $owner; } public function getCamp(): ?Camp { - return (null != $this->activity) ? $this->activity->getCamp() : null; + return (null != $this->owner) ? $this->owner->getCamp() : null; } public function isRoot(): bool { @@ -77,6 +87,12 @@ public function getParent(): ?ContentNode { } public function setParent(?ContentNode $parent): void { + $origParentOwner = isset($this->parent) ? $this->parent->getOwner() : null; + $newParentOwner = isset($parent) ? $parent->getOwner() : null; + + if ($origParentOwner != $newParentOwner) { + $this->setOwner($newParentOwner); + } $this->parent = $parent; } @@ -110,14 +126,30 @@ public function removeChild(ContentNode $contentNode): void { $this->children->removeElement($contentNode); } - public function getPosition() { + public function getSlot(): ?string { + return $this->slot; + } + + public function setSlot(?string $slot): void { + $this->slot = $slot; + } + + public function getPosition(): ?int { return $this->position; } - public function setPosition($position): void { + public function setPosition(?int $position): void { $this->position = $position; } + public function getConfig() { + return $this->config; + } + + public function setConfig($config): void { + $this->config = $config; + } + /** * Returns the strategy class of the content-type. */ diff --git a/backend/module/eCampCore/src/Entity/MaterialList.php b/backend/module/eCampCore/src/Entity/MaterialList.php index de9ad0b7a7..cd582ff432 100644 --- a/backend/module/eCampCore/src/Entity/MaterialList.php +++ b/backend/module/eCampCore/src/Entity/MaterialList.php @@ -25,7 +25,7 @@ class MaterialList extends BaseEntity implements BelongsToCampInterface { /** * @ORM\Column(type="string", length=32, nullable=true) */ - private ?string $materialListTemplateId = null; + private ?string $materialListPrototypeId = null; /** * @ORM\Column(type="string", length=64, nullable=false) @@ -49,12 +49,12 @@ public function setCamp(?Camp $camp): void { $this->camp = $camp; } - public function getMaterialListTemplateId(): ?string { - return $this->materialListTemplateId; + public function getMaterialListPrototypeId(): ?string { + return $this->materialListPrototypeId; } - public function setMaterialListTemplateId(?string $materialListTemplateId): void { - $this->materialListTemplateId = $materialListTemplateId; + public function setMaterialListPrototypeId(?string $materialListPrototypeId): void { + $this->materialListPrototypeId = $materialListPrototypeId; } public function getName(): ?string { diff --git a/backend/module/eCampCore/src/Entity/MaterialListTemplate.php b/backend/module/eCampCore/src/Entity/MaterialListTemplate.php deleted file mode 100644 index a6f5f0c224..0000000000 --- a/backend/module/eCampCore/src/Entity/MaterialListTemplate.php +++ /dev/null @@ -1,38 +0,0 @@ -campTemplate; - } - - public function setCampTemplate(?CampTemplate $campTemplate): void { - $this->campTemplate = $campTemplate; - } - - public function getName(): ?string { - return $this->name; - } - - public function setName(?string $name): void { - $this->name = $name; - } -} diff --git a/backend/module/eCampCore/src/EntityFilter/CampFilter.php b/backend/module/eCampCore/src/EntityFilter/CampFilter.php index 85713b5c31..5ff4b948e0 100644 --- a/backend/module/eCampCore/src/EntityFilter/CampFilter.php +++ b/backend/module/eCampCore/src/EntityFilter/CampFilter.php @@ -18,7 +18,8 @@ public function create(QueryBuilder $q, $alias, $field): Expr\Func { $campQ->orWhere( //$campQ->expr()->eq('1', '1'), $campQ->expr()->in('c.id', $collQ->getDQL()), - $campQ->expr()->eq('c.owner', ':f_auth_user') + $campQ->expr()->eq('c.owner', ':f_auth_user'), + $campQ->expr()->eq('c.isTemplate', 1) ); $authUser = $this->authUserProvider->getAuthUser(); diff --git a/backend/module/eCampCore/src/EntityService/ActivityService.php b/backend/module/eCampCore/src/EntityService/ActivityService.php index 501bf4efab..60e1085240 100644 --- a/backend/module/eCampCore/src/EntityService/ActivityService.php +++ b/backend/module/eCampCore/src/EntityService/ActivityService.php @@ -7,7 +7,6 @@ use eCamp\Core\Entity\Activity; use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\Category; -use eCamp\Core\Entity\CategoryContent; use eCamp\Core\Entity\ScheduleEntry; use eCamp\Core\Hydrator\ActivityHydrator; use eCamp\Lib\Acl\NoAccessException; @@ -22,9 +21,9 @@ class ActivityService extends AbstractEntityService { protected ContentNodeService $contentNodeService; public function __construct( - ActivityResponsibleService $activityResponsibleService, ServiceUtils $serviceUtils, AuthenticationService $authenticationService, + ActivityResponsibleService $activityResponsibleService, ScheduleEntryService $scheduleEntryService, ContentNodeService $contentNodeService ) { @@ -52,9 +51,11 @@ protected function createEntity($data): Activity { /** @var Category $category */ $category = $this->findRelatedEntity(Category::class, $data, 'categoryId'); + $camp = $category->getCamp(); + // Set Camp and Category + $camp->addActivity($activity); $activity->setCategory($category); - $activity->setCamp($category->getCamp()); // TODO meeting discus: Why do we actually need camp on activity? Redundant relationship return $activity; } @@ -73,7 +74,13 @@ protected function createEntityPost(BaseEntity $entity, $data): Activity { $this->updateActivityResponsibles($activity, $data); $this->updateScheduleEntries($activity, $data); - $this->createInitialContentNodes($activity); + + // Copy ContentNode + $prototype = $activity->getCategory()->getRootContentNode(); + if (isset($prototype)) { + $contentNode = $this->contentNodeService->createFromPrototype($activity, $prototype); + $activity->setRootContentNode($contentNode); + } return $activity; } @@ -190,13 +197,4 @@ private function updateScheduleEntries(Activity $activity, $data): void { } } } - - private function createInitialContentNodes(Activity $activity): void { - $categoryContents = $activity->getCategory()->getRootCategoryContents(); - - /** @var CategoryContent $categoryContent */ - foreach ($categoryContents as $categoryContent) { - $this->contentNodeService->createFromCategoryContent($activity, $categoryContent); - } - } } diff --git a/backend/module/eCampCore/src/EntityService/CampService.php b/backend/module/eCampCore/src/EntityService/CampService.php index d03f92941c..7c270b4d31 100644 --- a/backend/module/eCampCore/src/EntityService/CampService.php +++ b/backend/module/eCampCore/src/EntityService/CampService.php @@ -7,9 +7,8 @@ use eCamp\Core\Entity\AbstractCampOwner; use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\CampCollaboration; -use eCamp\Core\Entity\CampTemplate; -use eCamp\Core\Entity\CategoryTemplate; -use eCamp\Core\Entity\MaterialListTemplate; +use eCamp\Core\Entity\Category; +use eCamp\Core\Entity\MaterialList; use eCamp\Core\Entity\User; use eCamp\Core\Hydrator\CampHydrator; use eCamp\Lib\Acl\NoAccessException; @@ -90,23 +89,22 @@ protected function createEntityPost(BaseEntity $entity, $data): Camp { 'role' => CampCollaboration::ROLE_MANAGER, ]); - if (isset($data->campTemplateId)) { - // CampTemplateId given - // - Create MaterialLists - // - Create Categories - $camp->setCampTemplateId($data->campTemplateId); + if (isset($data->campPrototypeId)) { + // CampPrototypeId given + // Copy Entities + $camp->setCampPrototypeId($data->campPrototypeId); - /** @var CampTemplate $campTemplate */ - $campTemplate = $this->findEntity(CampTemplate::class, $data->campTemplateId); + /** @var Camp $campPrototype */ + $campPrototype = $this->findEntity(Camp::class, $data->campPrototypeId); - /** @var MaterialListTemplate $materialListTemplate */ - foreach ($campTemplate->getMaterialListTemplates() as $materialListTemplate) { - $this->materialListService->createFromTemplate($camp, $materialListTemplate); + /** @var Category $category */ + foreach ($campPrototype->getCategories() as $category) { + $this->categoryService->createFromPrototype($camp, $category); } - /** @var CategoryTemplate $categoryTemplate */ - foreach ($campTemplate->getCategoryTemplates() as $categoryTemplate) { - $this->categoryService->createFromTemplate($camp, $categoryTemplate); + /** @var MaterialList $materialList */ + foreach ($campPrototype->getMaterialLists() as $materialList) { + $this->materialListService->createFromPrototype($camp, $materialList); } } diff --git a/backend/module/eCampCore/src/EntityService/CampTemplateService.php b/backend/module/eCampCore/src/EntityService/CampTemplateService.php deleted file mode 100644 index afaca4f04c..0000000000 --- a/backend/module/eCampCore/src/EntityService/CampTemplateService.php +++ /dev/null @@ -1,19 +0,0 @@ -create((object) [ - 'categoryId' => $category->getId(), - 'contentTypeId' => $template->getContentType()->getId(), - 'instanceName' => $template->getInstanceName(), - 'position' => $template->getPosition(), - ]); - $categoryContent->setCategoryContentTemplateId($template->getId()); - - foreach ($template->getChildren() as $childTemplate) { - $childCategoryContent = $this->createFromTemplate($category, $childTemplate); - $categoryContent->addChild($childCategoryContent); - } - - return $categoryContent; - } - - protected function createEntity($data): CategoryContent { - /** @var CategoryContent $categoryContent */ - $categoryContent = parent::createEntity($data); - - /** @var Category $category */ - $category = $this->findRelatedEntity(Category::class, $data, 'categoryId'); - $category->addCategoryContent($categoryContent); - - /** @var ContentType $contentType */ - $contentType = $this->findRelatedEntity(ContentType::class, $data, 'contentTypeId'); - $categoryContent->setContentType($contentType); - - return $categoryContent; - } - - protected function patchEntity(BaseEntity $entity, $data): CategoryContent { - /** @var CategoryContent $entity */ - $entity = parent::patchEntity($entity, $data); - - if (isset($data['parentId'])) { - /** @var CategoryContent $parent */ - $parent = $this->findRelatedEntity(CategoryContent::class, $data, 'parentId'); - $entity->setParent($parent); - } - - return $entity; - } -} diff --git a/backend/module/eCampCore/src/EntityService/CategoryContentTypeService.php b/backend/module/eCampCore/src/EntityService/CategoryContentTypeService.php index 7ae046a393..5ea9efbe9d 100644 --- a/backend/module/eCampCore/src/EntityService/CategoryContentTypeService.php +++ b/backend/module/eCampCore/src/EntityService/CategoryContentTypeService.php @@ -4,7 +4,6 @@ use eCamp\Core\Entity\Category; use eCamp\Core\Entity\CategoryContentType; -use eCamp\Core\Entity\CategoryContentTypeTemplate; use eCamp\Core\Entity\ContentType; use eCamp\Core\Hydrator\CategoryContentTypeHydrator; use eCamp\Lib\Service\ServiceUtils; @@ -20,13 +19,13 @@ public function __construct(ServiceUtils $serviceUtils, AuthenticationService $a ); } - public function createFromTemplate(Category $category, CategoryContentTypeTemplate $template) { + public function createFromPrototype(Category $category, CategoryContentType $prototype) { /** @var CategoryContentType $categoryContentType */ $categoryContentType = $this->create((object) [ 'categoryId' => $category->getId(), - 'contentTypeId' => $template->getContentType()->getId(), + 'contentTypeId' => $prototype->getContentType()->getId(), ]); - $categoryContentType->setCategoryContentTypeTemplateId($template->getId()); + $categoryContentType->setCategoryContentTypePrototypeId($prototype->getId()); return $categoryContentType; } diff --git a/backend/module/eCampCore/src/EntityService/CategoryContentTypeTemplateService.php b/backend/module/eCampCore/src/EntityService/CategoryContentTypeTemplateService.php deleted file mode 100644 index 2780a7df1a..0000000000 --- a/backend/module/eCampCore/src/EntityService/CategoryContentTypeTemplateService.php +++ /dev/null @@ -1,36 +0,0 @@ -findRelatedEntity(CategoryTemplate::class, $data, 'categoryTemplateId'); - $categoryTemplate->addCategoryContentTypeTemplate($categoryContentTypeTemplate); - - /** @var ContentType $contentType */ - $contentType = $this->findRelatedEntity(ContentType::class, $data, 'contentTypeId'); - $categoryContentTypeTemplate->setContentType($contentType); - - return $categoryContentTypeTemplate; - } -} diff --git a/backend/module/eCampCore/src/EntityService/CategoryService.php b/backend/module/eCampCore/src/EntityService/CategoryService.php index ffbc3fad52..3487576c27 100644 --- a/backend/module/eCampCore/src/EntityService/CategoryService.php +++ b/backend/module/eCampCore/src/EntityService/CategoryService.php @@ -6,9 +6,8 @@ use Doctrine\ORM\QueryBuilder; use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\Category; -use eCamp\Core\Entity\CategoryContentTemplate; -use eCamp\Core\Entity\CategoryContentTypeTemplate; -use eCamp\Core\Entity\CategoryTemplate; +use eCamp\Core\Entity\CategoryContentType; +use eCamp\Core\Entity\ContentNode; use eCamp\Core\Hydrator\CategoryHydrator; use eCamp\Lib\Acl\NoAccessException; use eCamp\Lib\Service\EntityNotFoundException; @@ -16,14 +15,14 @@ use Laminas\Authentication\AuthenticationService; class CategoryService extends AbstractEntityService { - protected CategoryContentTypeService $categoryContentTypeService; - protected CategoryContentService $categoryContentService; + private ContentNodeService $contentNodeService; + private CategoryContentTypeService $categoryContentTypeService; public function __construct( ServiceUtils $serviceUtils, AuthenticationService $authenticationService, - CategoryContentTypeService $categoryContentTypeService, - CategoryContentService $categoryContentService + ContentNodeService $contentNodeService, + CategoryContentTypeService $categoryContentTypeService ) { parent::__construct( $serviceUtils, @@ -32,29 +31,31 @@ public function __construct( $authenticationService ); + $this->contentNodeService = $contentNodeService; $this->categoryContentTypeService = $categoryContentTypeService; - $this->categoryContentService = $categoryContentService; } - public function createFromTemplate(Camp $camp, CategoryTemplate $template): Category { + public function createFromPrototype(Camp $camp, Category $prototype): Category { /** @var Category $category */ $category = $this->create((object) [ 'campId' => $camp->getId(), - 'short' => $template->getShort(), - 'name' => $template->getName(), - 'color' => $template->getColor(), - 'numberingStyle' => $template->getNumberingStyle(), + 'short' => $prototype->getShort(), + 'name' => $prototype->getName(), + 'color' => $prototype->getColor(), + 'numberingStyle' => $prototype->getNumberingStyle(), ]); - $category->setCategoryTemplateId($template->getId()); + $category->setCategoryPrototypeId($prototype->getId()); - /** @var CategoryContentTypeTemplate $categoryContentTypeTemplate */ - foreach ($template->getCategoryContentTypeTemplates() as $categoryContentTypeTemplate) { - $this->categoryContentTypeService->createFromTemplate($category, $categoryContentTypeTemplate); + /** @var ContentNode $contentNodePrototype */ + $contentNodePrototype = $prototype->getRootContentNode(); + if (isset($contentNodePrototype)) { + $contentNode = $this->contentNodeService->createFromPrototype($category, $contentNodePrototype); + $category->setRootContentNode($contentNode); } - /** @var CategoryContentTemplate $categoryContentTemplate */ - foreach ($template->getRootCategoryContentTemplates() as $categoryContentTemplate) { - $this->categoryContentService->createFromTemplate($category, $categoryContentTemplate); + /** @var CategoryContentType $categoryContentType */ + foreach ($prototype->getCategoryContentTypes() as $categoryContentType) { + $this->categoryContentTypeService->createFromPrototype($category, $categoryContentType); } return $category; diff --git a/backend/module/eCampCore/src/EntityService/CategoryTemplateService.php b/backend/module/eCampCore/src/EntityService/CategoryTemplateService.php deleted file mode 100644 index 71932f7578..0000000000 --- a/backend/module/eCampCore/src/EntityService/CategoryTemplateService.php +++ /dev/null @@ -1,31 +0,0 @@ -andWhere('row.campTemplate = :campTemplateId'); - $q->setParameter('campTemplateId', $params['campTemplateId']); - } - - return $q; - } -} diff --git a/backend/module/eCampCore/src/EntityService/ContentNodeService.php b/backend/module/eCampCore/src/EntityService/ContentNodeService.php index aa66053059..2fcbef5ca6 100644 --- a/backend/module/eCampCore/src/EntityService/ContentNodeService.php +++ b/backend/module/eCampCore/src/EntityService/ContentNodeService.php @@ -6,9 +6,8 @@ use Doctrine\ORM\QueryBuilder; use eCamp\Core\ContentType\ContentTypeStrategyProvider; use eCamp\Core\ContentType\ContentTypeStrategyProviderTrait; -use eCamp\Core\Entity\Activity; +use eCamp\Core\Entity\AbstractContentNodeOwner; use eCamp\Core\Entity\Camp; -use eCamp\Core\Entity\CategoryContent; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; use eCamp\Core\Hydrator\ContentNodeHydrator; @@ -33,20 +32,19 @@ public function __construct(ServiceUtils $serviceUtils, AuthenticationService $a $this->setContentTypeStrategyProvider($contentTypeStrategyProvider); } - /** - * Create ContentNode and all Child-ContentNodes. - */ - public function createFromCategoryContent(Activity $activity, CategoryContent $categoryContent): ContentNode { + public function createFromPrototype(AbstractContentNodeOwner $owner, ContentNode $prototype): ContentNode { /** @var ContentNode $contentNode */ $contentNode = $this->create((object) [ - 'activityId' => $activity->getId(), - 'contentTypeId' => $categoryContent->getContentType()->getId(), - 'instanceName' => $categoryContent->getInstanceName(), - 'position' => $categoryContent->getPosition(), + 'ownerId' => $owner->getId(), + 'contentTypeId' => $prototype->getContentType()->getId(), + 'instanceName' => $prototype->getInstanceName(), + 'slot' => $prototype->getSlot(), + 'position' => $prototype->getPosition(), + 'config' => $prototype->getConfig(), ]); - foreach ($categoryContent->getChildren() as $childCategoryContent) { - $childContentNode = $this->createFromCategoryContent($activity, $childCategoryContent); + foreach ($prototype->getChildren() as $childPrototype) { + $childContentNode = $this->createFromPrototype($owner, $childPrototype); $contentNode->addChild($childContentNode); } @@ -63,13 +61,13 @@ protected function createEntity($data): ContentNode { /** @var ContentNode $contentNode */ $contentNode = parent::createEntity($data); - /** @var Activity $activity */ - $activity = $this->findRelatedEntity(Activity::class, $data, 'activityId'); + /** @var AbstractContentNodeOwner $owner */ + $owner = $this->findRelatedEntity(AbstractContentNodeOwner::class, $data, 'ownerId'); /** @var ContentType $contentType */ $contentType = $this->findRelatedEntity(ContentType::class, $data, 'contentTypeId'); - $activity->addContentNode($contentNode); + $owner->addContentNode($contentNode); $contentNode->setContentType($contentType); $contentNode->setContentTypeStrategyProvider($this->getContentTypeStrategyProvider()); diff --git a/backend/module/eCampCore/src/EntityService/MaterialListService.php b/backend/module/eCampCore/src/EntityService/MaterialListService.php index 5e9f2626b8..b9d40a5800 100644 --- a/backend/module/eCampCore/src/EntityService/MaterialListService.php +++ b/backend/module/eCampCore/src/EntityService/MaterialListService.php @@ -5,7 +5,6 @@ use Doctrine\ORM\QueryBuilder; use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\MaterialList; -use eCamp\Core\Entity\MaterialListTemplate; use eCamp\Core\Hydrator\MaterialListHydrator; use eCamp\Lib\Service\ServiceUtils; use Laminas\Authentication\AuthenticationService; @@ -20,13 +19,13 @@ public function __construct(ServiceUtils $serviceUtils, AuthenticationService $a ); } - public function createFromTemplate(Camp $camp, MaterialListTemplate $template): MaterialList { + public function createFromPrototype(Camp $camp, MaterialList $prototype): MaterialList { /** @var MaterialList $materialList */ $materialList = $this->create((object) [ 'campId' => $camp->getId(), - 'name' => $template->getName(), + 'name' => $prototype->getName(), ]); - $materialList->setMaterialListTemplateId($template->getId()); + $materialList->setMaterialListPrototypeId($prototype->getId()); return $materialList; } diff --git a/backend/module/eCampCore/src/EntityService/MaterialListTemplateService.php b/backend/module/eCampCore/src/EntityService/MaterialListTemplateService.php deleted file mode 100644 index 78847e68ea..0000000000 --- a/backend/module/eCampCore/src/EntityService/MaterialListTemplateService.php +++ /dev/null @@ -1,31 +0,0 @@ -andWhere('row.campTemplate = :campTemplateId'); - $q->setParameter('campTemplateId', $params['campTemplateId']); - } - - return $q; - } -} diff --git a/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php b/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php index b75ef9961d..2f647b9d3d 100644 --- a/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php @@ -54,14 +54,6 @@ public function extract($object): array { 'scheduleEntries' => new EntityLinkCollection($activity->getScheduleEntries()), 'contentNodes' => new EntityLinkCollection($activity->getContentNodes()), - - // 'contentNodes' => Link::factory([ - // 'rel' => 'contentNodes', - // 'route' => [ - // 'name' => 'e-camp-api.rest.doctrine.content-node', - // 'options' => [ 'query' => [ 'activityId' => $activity->getId() ] ] - // ] - // ]), ]; } diff --git a/backend/module/eCampCore/src/Hydrator/CampTemplateHydrator.php b/backend/module/eCampCore/src/Hydrator/CampTemplateHydrator.php deleted file mode 100644 index a1daa17958..0000000000 --- a/backend/module/eCampCore/src/Hydrator/CampTemplateHydrator.php +++ /dev/null @@ -1,43 +0,0 @@ - $campTemplate->getId(), - 'name' => $campTemplate->getName(), - - 'categoryTemplates' => new EntityLinkCollection($campTemplate->getCategoryTemplates()), - ]; - } - - /** - * @param object $object - */ - public function hydrate(array $data, $object): CampTemplate { - /** @var CampTemplate $campTemplate */ - $campTemplate = $object; - - if (isset($data['name'])) { - $campTemplate->setName($data['name']); - } - - return $campTemplate; - } -} diff --git a/backend/module/eCampCore/src/Hydrator/CategoryContentHydrator.php b/backend/module/eCampCore/src/Hydrator/CategoryContentHydrator.php deleted file mode 100644 index 2cd5727553..0000000000 --- a/backend/module/eCampCore/src/Hydrator/CategoryContentHydrator.php +++ /dev/null @@ -1,50 +0,0 @@ -getContentType(); - - return [ - 'id' => $categoryContent->getId(), - 'instanceName' => $categoryContent->getInstanceName(), - 'position' => $categoryContent->getPosition(), - 'contentTypeName' => $contentType->getName(), - - 'parent' => ($categoryContent->isRoot() ? null : new EntityLink($categoryContent->getParent())), - 'contentType' => new EntityLink($categoryContent->getContentType()), - ]; - } - - /** - * @param object $object - */ - public function hydrate(array $data, $object): CategoryContent { - /** @var CategoryContent $categoryContent */ - $categoryContent = $object; - - if (isset($data['instanceName'])) { - $categoryContent->setInstanceName($data['instanceName']); - } - if (isset($data['position'])) { - $categoryContent->setPosition($data['position']); - } - - return $categoryContent; - } -} diff --git a/backend/module/eCampCore/src/Hydrator/CategoryContentTemplateHydrator.php b/backend/module/eCampCore/src/Hydrator/CategoryContentTemplateHydrator.php deleted file mode 100644 index 8fd4de1bf6..0000000000 --- a/backend/module/eCampCore/src/Hydrator/CategoryContentTemplateHydrator.php +++ /dev/null @@ -1,45 +0,0 @@ -getContentType(); - - return [ - 'id' => $categoryContentTemplate->getId(), - 'instanceName' => $categoryContentTemplate->getInstanceName(), - 'contentTypeName' => $contentType->getName(), - - 'contentType' => new EntityLink($categoryContentTemplate->getContentType()), - ]; - } - - /** - * @param object $object - */ - public function hydrate(array $data, $object): CategoryContentTemplate { - /** @var CategoryContentTemplate $categoryContentTemplate */ - $categoryContentTemplate = $object; - - if (isset($data['instanceName'])) { - $categoryContentTemplate->setInstanceName($data['instanceName']); - } - - return $categoryContentTemplate; - } -} diff --git a/backend/module/eCampCore/src/Hydrator/CategoryContentTypeTemplateHydrator.php b/backend/module/eCampCore/src/Hydrator/CategoryContentTypeTemplateHydrator.php deleted file mode 100644 index dbd47673e9..0000000000 --- a/backend/module/eCampCore/src/Hydrator/CategoryContentTypeTemplateHydrator.php +++ /dev/null @@ -1,36 +0,0 @@ - Util::Entity(function (CategoryContentTypeTemplate $e) { - return $e->getContentType(); - }), - ]; - } - - /** - * @param object $object - */ - public function extract($object): array { - /** @var CategoryContentTypeTemplate $categoryContentTypeTemplate */ - $categoryContentTypeTemplate = $object; - - return [ - 'id' => $categoryContentTypeTemplate->getId(), - ]; - } - - /** - * @param object $object - */ - public function hydrate(array $data, $object): CategoryContentTypeTemplate { - return $object; - } -} diff --git a/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php b/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php index 17f48d8dab..801beec49d 100644 --- a/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php @@ -4,7 +4,7 @@ use eCamp\Core\Entity\Category; use eCamp\Lib\Entity\EntityLink; -use eCampApi\V1\Rest\CategoryContent\CategoryContentCollection; +use eCamp\Lib\Entity\EntityLinkCollection; use eCampApi\V1\Rest\CategoryContentType\CategoryContentTypeCollection; use Laminas\Hydrator\HydratorInterface; @@ -29,8 +29,8 @@ public function extract($object): array { 'numberingStyle' => $category->getNumberingStyle(), 'camp' => EntityLink::Create($category->getCamp()), + 'contentNodes' => new EntityLinkCollection($category->getContentNodes()), 'categoryContentTypes' => new CategoryContentTypeCollection($category->getCategoryContentTypes()), - 'categoryContents' => new CategoryContentCollection($category->getCategoryContents()), ]; } diff --git a/backend/module/eCampCore/src/Hydrator/CategoryTemplateHydrator.php b/backend/module/eCampCore/src/Hydrator/CategoryTemplateHydrator.php deleted file mode 100644 index aedf0f7945..0000000000 --- a/backend/module/eCampCore/src/Hydrator/CategoryTemplateHydrator.php +++ /dev/null @@ -1,56 +0,0 @@ - $categoryTemplate->getId(), - 'short' => $categoryTemplate->getShort(), - 'name' => $categoryTemplate->getName(), - 'color' => $categoryTemplate->getColor(), - 'numberingStyle' => $categoryTemplate->getNumberingStyle(), - 'categoryContentTypeTemplates' => new CategoryContentTypeTemplateCollection($categoryTemplate->getCategoryContentTypeTemplates()), - 'categoryContentTemplates' => new CategoryContentTemplateCollection($categoryTemplate->getCategoryContentTemplates()), - ]; - } - - /** - * @param object $object - */ - public function hydrate(array $data, $object): CategoryTemplate { - /** @var CategoryTemplate $categoryTemplate */ - $categoryTemplate = $object; - - if (isset($data['short'])) { - $categoryTemplate->setShort($data['short']); - } - if (isset($data['name'])) { - $categoryTemplate->setName($data['name']); - } - if (isset($data['color'])) { - $categoryTemplate->setColor($data['color']); - } - if (isset($data['numberingStyle'])) { - $categoryTemplate->setNumberingStyle($data['numberingStyle']); - } - - return $categoryTemplate; - } -} diff --git a/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php b/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php index e422c43ddf..9cf9c3020e 100644 --- a/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php @@ -4,6 +4,8 @@ use eCamp\Core\ContentType\ContentTypeStrategyInterface; use eCamp\Core\ContentType\ContentTypeStrategyProvider; +use eCamp\Core\Entity\Activity; +use eCamp\Core\Entity\Category; use eCamp\Core\Entity\ContentNode; use eCamp\Lib\Entity\EntityLink; use Laminas\ApiTools\Hal\Link\Link; @@ -33,6 +35,7 @@ public function extract($object): array { /** @var ContentNode $contentNode */ $contentNode = $object; $contentType = $contentNode->getContentType(); + $owner = $contentNode->getOwner(); $data = [ 'id' => $contentNode->getId(), @@ -42,15 +45,26 @@ public function extract($object): array { 'parent' => ($contentNode->isRoot() ? null : new EntityLink($contentNode->getParent())), 'contentType' => new EntityLink($contentNode->getContentType()), + ]; - 'activity' => Link::factory([ - 'rel' => 'activity', + if ($owner instanceof Activity) { + $data['owner'] = Link::factory([ + 'rel' => 'owner', 'route' => [ 'name' => 'e-camp-api.rest.doctrine.activity', - 'params' => ['activityId' => $contentNode->getActivity()->getId()], + 'params' => ['activityId' => $owner->getId()], ], - ]), - ]; + ]); + } + if ($owner instanceof Category) { + $data['owner'] = Link::factory([ + 'rel' => 'owner', + 'route' => [ + 'name' => 'e-camp-api.rest.doctrine.category', + 'params' => ['categoryId' => $owner->getId()], + ], + ]); + } /** @var ContentTypeStrategyInterface $strategy */ $strategy = $this->contentTypeStrategyProvider->get($contentType); @@ -73,9 +87,13 @@ public function hydrate(array $data, $object): ContentNode { if (isset($data['instanceName'])) { $contentNode->setInstanceName($data['instanceName']); } + if (isset($data['slot'])) { + $contentNode->setSlot($data['slot']); + } if (isset($data['position'])) { $contentNode->setPosition($data['position']); } + // todo config return $contentNode; } diff --git a/backend/module/eCampCore/src/Hydrator/MaterialListTemplateHydrator.php b/backend/module/eCampCore/src/Hydrator/MaterialListTemplateHydrator.php deleted file mode 100644 index 08672685d4..0000000000 --- a/backend/module/eCampCore/src/Hydrator/MaterialListTemplateHydrator.php +++ /dev/null @@ -1,42 +0,0 @@ - $materialListTemplate->getId(), - 'name' => $materialListTemplate->getName(), - 'campTemplate' => EntityLink::Create($materialListTemplate->getCampTemplate()), - ]; - } - - /** - * @param object $object - */ - public function hydrate(array $data, $object): MaterialListTemplate { - /** @var MaterialListTemplate $materialListTemplate */ - $materialListTemplate = $object; - - if (isset($data['name'])) { - $materialListTemplate->setName($data['name']); - } - - return $materialListTemplate; - } -} diff --git a/backend/module/eCampCore/test/Data/AdminTestData.php b/backend/module/eCampCore/test/Data/AdminTestData.php new file mode 100644 index 0000000000..fa7cf9da46 --- /dev/null +++ b/backend/module/eCampCore/test/Data/AdminTestData.php @@ -0,0 +1,27 @@ +setUsername('admin'); + $user->setRole(User::ROLE_ADMIN); + $user->setState(User::STATE_ACTIVATED); + $login = new Login($user, 'admin'); + + $manager->persist($user); + $manager->persist($login); + + $manager->flush(); + + $this->addReference(self::$ADMIN, $user); + } +} diff --git a/backend/module/eCampCore/test/Data/CampPrototypeTestData.php b/backend/module/eCampCore/test/Data/CampPrototypeTestData.php new file mode 100644 index 0000000000..22f4216e7a --- /dev/null +++ b/backend/module/eCampCore/test/Data/CampPrototypeTestData.php @@ -0,0 +1,34 @@ +getReference(AdminTestData::$ADMIN); + + $camp = new Camp(); + $camp->setName('CampPrototype1'); + $camp->setTitle('CampPrototype1'); + $camp->setCreator($admin); + $camp->setOwner($admin); + $camp->setIsTemplate(true); + + $manager->persist($camp); + $manager->flush(); + + $this->addReference(self::$PROTOTYPE1, $camp); + } + + public function getDependencies() { + return [AdminTestData::class]; + } +} diff --git a/backend/module/eCampCore/test/Data/CampTemplateTestData.php b/backend/module/eCampCore/test/Data/CampTemplateTestData.php deleted file mode 100644 index f52bbaabd3..0000000000 --- a/backend/module/eCampCore/test/Data/CampTemplateTestData.php +++ /dev/null @@ -1,21 +0,0 @@ -setName('CampTemplate1'); - - $manager->persist($campTemplate); - $manager->flush(); - - $this->addReference(self::$TEMPLATE1, $campTemplate); - } -} diff --git a/backend/module/eCampCore/test/Data/CategoryContentTemplateTestData.php b/backend/module/eCampCore/test/Data/CategoryContentTemplateTestData.php deleted file mode 100644 index 34e18758b3..0000000000 --- a/backend/module/eCampCore/test/Data/CategoryContentTemplateTestData.php +++ /dev/null @@ -1,32 +0,0 @@ -getReference(CategoryTemplateTestData::$TEMPLATE1); - $contentType = $this->getReference(ContentTypeTestData::$TYPE1); - - $categoryContentTemplate = new CategoryContentTemplate(); - $categoryContentTemplate->setContentType($contentType); - $categoryTemplate->addCategoryContentTemplate($categoryContentTemplate); - - $manager->persist($categoryContentTemplate); - $manager->flush(); - - $this->addReference(self::$TEMPLATE1, $categoryContentTemplate); - } - - public function getDependencies() { - return [CategoryTemplateTestData::class, ContentTypeTestData::class]; - } -} diff --git a/backend/module/eCampCore/test/Data/CategoryContentTestData.php b/backend/module/eCampCore/test/Data/CategoryContentTestData.php deleted file mode 100644 index cdf00c5758..0000000000 --- a/backend/module/eCampCore/test/Data/CategoryContentTestData.php +++ /dev/null @@ -1,32 +0,0 @@ -getReference(CategoryTestData::$CATEGORY1); - $contentType = $this->getReference(ContentTypeTestData::$TYPE1); - - $categoryContent = new CategoryContent(); - $categoryContent->setContentType($contentType); - $category->addCategoryContent($categoryContent); - - $manager->persist($categoryContent); - $manager->flush(); - - $this->addReference(self::$CATEGORY_CONTENT1, $categoryContent); - } - - public function getDependencies() { - return [CategoryTestData::class, ContentTypeTestData::class]; - } -} diff --git a/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php b/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php new file mode 100644 index 0000000000..b42fded06a --- /dev/null +++ b/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php @@ -0,0 +1,33 @@ +getReference(CategoryPrototypeTestData::$PROTOTYPE1); + $contentType = $this->getReference(ContentTypeTestData::$TYPE1); + + $categoryContentType = new CategoryContentType(); + $categoryContentType->setContentType($contentType); + $category->addCategoryContentType($categoryContentType); + + $manager->persist($categoryContentType); + $manager->flush(); + + $this->addReference(self::$PROTOTYPE1, $categoryContentType); + } + + public function getDependencies() { + return [CategoryPrototypeData::class, ContentTypeTestData::class]; + } +} diff --git a/backend/module/eCampCore/test/Data/CategoryContentTypeTemplateTestData.php b/backend/module/eCampCore/test/Data/CategoryContentTypeTemplateTestData.php deleted file mode 100644 index 3439f5f4e1..0000000000 --- a/backend/module/eCampCore/test/Data/CategoryContentTypeTemplateTestData.php +++ /dev/null @@ -1,32 +0,0 @@ -getReference(CategoryTemplateTestData::$TEMPLATE1); - $contentType = $this->getReference(ContentTypeTestData::$TYPE1); - - $categoryContentTypeTemplate = new CategoryContentTypeTemplate(); - $categoryContentTypeTemplate->setContentType($contentType); - $categoryTemplate->addCategoryContentTypeTemplate($categoryContentTypeTemplate); - - $manager->persist($categoryContentTypeTemplate); - $manager->flush(); - - $this->addReference(self::$TEMPLATE1, $categoryContentTypeTemplate); - } - - public function getDependencies() { - return [CategoryTemplateTestData::class, ContentTypeTestData::class]; - } -} diff --git a/backend/module/eCampCore/test/Data/CategoryPrototypeTestData.php b/backend/module/eCampCore/test/Data/CategoryPrototypeTestData.php new file mode 100644 index 0000000000..7e0f142f7f --- /dev/null +++ b/backend/module/eCampCore/test/Data/CategoryPrototypeTestData.php @@ -0,0 +1,34 @@ +getReference(CampPrototypeTestData::$PROTOTYPE1); + + $category = new Category(); + $category->setShort('AC'); + $category->setName('ActivityCategory1'); + $category->setColor('#FF00FF'); + $category->setNumberingStyle('i'); + $camp->addCategory($category); + + $manager->persist($category); + $manager->flush(); + + $this->addReference(self::$PROTOTYPE1, $category); + } + + public function getDependencies() { + return [CampPrototypeTestData::class]; + } +} diff --git a/backend/module/eCampCore/test/Data/CategoryTemplateTestData.php b/backend/module/eCampCore/test/Data/CategoryTemplateTestData.php deleted file mode 100644 index 5adfa10851..0000000000 --- a/backend/module/eCampCore/test/Data/CategoryTemplateTestData.php +++ /dev/null @@ -1,32 +0,0 @@ -getReference(CampTemplateTestData::$TEMPLATE1); - - $categoryTemplate = new CategoryTemplate(); - $categoryTemplate->setShort('AC'); - $categoryTemplate->setName('ActivityCategory1'); - $categoryTemplate->setColor('#FF00FF'); - $categoryTemplate->setNumberingStyle('i'); - $campTemplate->addCategoryTemplate($categoryTemplate); - - $manager->persist($categoryTemplate); - $manager->flush(); - - $this->addReference(self::$TEMPLATE1, $categoryTemplate); - } - - public function getDependencies() { - return [CampTemplateTestData::class]; - } -} diff --git a/backend/module/eCampCore/test/Data/ContentNodeTestData.php b/backend/module/eCampCore/test/Data/ContentNodeTestData.php new file mode 100644 index 0000000000..dbdceb8c39 --- /dev/null +++ b/backend/module/eCampCore/test/Data/ContentNodeTestData.php @@ -0,0 +1,46 @@ +container = $container; + } + + public function load(ObjectManager $manager): void { + /** @var Category $category */ + $category = $this->getReference(CategoryTestData::$CATEGORY1); + /** @var ContentType $storyboard */ + $storyboard = $this->getReference(ContentTypeTestData::$TYPE1); + $contentTypeStrategyProvider = new ContentTypeStrategyProvider($this->container); + + $contentNode = new ContentNode(); + $contentNode->setInstanceName('Programm'); + $contentNode->setContentType($storyboard); + $contentNode->setContentTypeStrategyProvider($contentTypeStrategyProvider); + $category->addContentNode($contentNode); + $category->setRootContentNode($contentNode); + + $manager->persist($contentNode); + $manager->flush(); + + $this->addReference(self::$CATEGORY_CONTENT1, $contentNode); + } + + public function getDependencies() { + return [CategoryTestData::class, ActivityTestData::class]; + } +} diff --git a/backend/module/eCampCore/test/Data/MaterialItemTestData.php b/backend/module/eCampCore/test/Data/MaterialItemTestData.php index c99890eb0b..87799cf29d 100644 --- a/backend/module/eCampCore/test/Data/MaterialItemTestData.php +++ b/backend/module/eCampCore/test/Data/MaterialItemTestData.php @@ -36,7 +36,7 @@ public function load(ObjectManager $manager): void { $materialList = $this->getReference(MaterialListTestData::$MATERIALLIST1); $contentNode = new ContentNode(); - $contentNode->setActivity($activity); + $contentNode->setOwner($activity); $contentNode->setContentType($contentType); $contentNode->setContentTypeStrategyProvider($contentTypeStrategyProvider); diff --git a/backend/module/eCampCore/test/Data/MaterialListPrototypeTestData.php b/backend/module/eCampCore/test/Data/MaterialListPrototypeTestData.php new file mode 100644 index 0000000000..aa4756ae6c --- /dev/null +++ b/backend/module/eCampCore/test/Data/MaterialListPrototypeTestData.php @@ -0,0 +1,31 @@ +getReference(CampPrototypeTestData::$PROTOTYPE1); + + $materialList = new MaterialList(); + $materialList->setName('MaterialListPrototype1'); + $camp->addMaterialList($materialList); + + $manager->persist($materialList); + $manager->flush(); + + $this->addReference(self::$PROTOTYPE1, $materialList); + } + + public function getDependencies() { + return [CampPrototypeTestData::class]; + } +} diff --git a/backend/module/eCampCore/test/Data/MaterialListTemplateTestData.php b/backend/module/eCampCore/test/Data/MaterialListTemplateTestData.php deleted file mode 100644 index 994d7ae58f..0000000000 --- a/backend/module/eCampCore/test/Data/MaterialListTemplateTestData.php +++ /dev/null @@ -1,31 +0,0 @@ -getReference(CampTemplateTestData::$TEMPLATE1); - - $materialListTemplate = new MaterialListTemplate(); - $materialListTemplate->setName('MaterialListTemplate1'); - $campTemplate->addMaterialListTemplate($materialListTemplate); - - $manager->persist($materialListTemplate); - $manager->flush(); - - $this->addReference(self::$MATERIALLISTTEMPLATE1, $materialListTemplate); - } - - public function getDependencies() { - return [CampTemplateTestData::class]; - } -} diff --git a/backend/module/eCampCore/test/Entity/CampTemplateTest.php b/backend/module/eCampCore/test/Entity/CampTemplateTest.php deleted file mode 100644 index f59b10e332..0000000000 --- a/backend/module/eCampCore/test/Entity/CampTemplateTest.php +++ /dev/null @@ -1,30 +0,0 @@ -setName('CampTemplate.Name'); - - $this->assertEquals('CampTemplate.Name', $campTemplate->getName()); - } - - public function testCategoryTemplate(): void { - $campTemplate = new CampTemplate(); - $categoryTemplate = new CategoryTemplate(); - - $this->assertCount(0, $campTemplate->getCategoryTemplates()); - $campTemplate->addCategoryTemplate($categoryTemplate); - $this->assertContains($categoryTemplate, $campTemplate->getCategoryTemplates()); - $campTemplate->removeCategoryTemplate($categoryTemplate); - $this->assertCount(0, $campTemplate->getCategoryTemplates()); - } -} diff --git a/backend/module/eCampCore/test/Entity/CategoryContentTemplateTest.php b/backend/module/eCampCore/test/Entity/CategoryContentTemplateTest.php deleted file mode 100644 index 8331b575e2..0000000000 --- a/backend/module/eCampCore/test/Entity/CategoryContentTemplateTest.php +++ /dev/null @@ -1,54 +0,0 @@ -setCampTemplate($campTemplate); - $categoryTemplate->setName('CategoryName'); - - $categoryContentTemplate = new CategoryContentTemplate(); - $categoryContentTemplate->setCategoryTemplate($categoryTemplate); - $categoryContentTemplate->setContentType($contentType); - $categoryContentTemplate->setInstanceName('CategoryContentName'); - $categoryContentTemplate->setPosition('position'); - - $this->assertEquals($categoryTemplate, $categoryContentTemplate->getCategoryTemplate()); - $this->assertEquals($contentType, $categoryContentTemplate->getContentType()); - $this->assertEquals('CategoryContentName', $categoryContentTemplate->getInstanceName()); - $this->assertEquals('position', $categoryContentTemplate->getPosition()); - } - - public function testCategoryContentTemplateHierarchy(): void { - $categoryContentTemplate = new CategoryContentTemplate(); - $childCategoryContentTemplate = new CategoryContentTemplate(); - - // Add Child-CategoryContentTemplate - $categoryContentTemplate->addChild($childCategoryContentTemplate); - $this->assertCount(1, $categoryContentTemplate->getChildren()); - $this->assertEquals($categoryContentTemplate, $childCategoryContentTemplate->getParent()); - $this->assertTrue($categoryContentTemplate->isRoot()); - $this->assertFalse($childCategoryContentTemplate->isRoot()); - - // Remove Child-CategoryContentTemplate - $categoryContentTemplate->removeChild($childCategoryContentTemplate); - $this->assertCount(0, $categoryContentTemplate->getChildren()); - $this->assertNull($childCategoryContentTemplate->getParent()); - $this->assertTrue($categoryContentTemplate->isRoot()); - $this->assertTrue($childCategoryContentTemplate->isRoot()); - } -} diff --git a/backend/module/eCampCore/test/Entity/CategoryContentTest.php b/backend/module/eCampCore/test/Entity/CategoryContentTest.php deleted file mode 100644 index d038c50d0c..0000000000 --- a/backend/module/eCampCore/test/Entity/CategoryContentTest.php +++ /dev/null @@ -1,55 +0,0 @@ -setCamp($camp); - $category->setName('CategoryName'); - - $categoryContent = new CategoryContent(); - $categoryContent->setCategory($category); - $categoryContent->setContentType($contentType); - $categoryContent->setInstanceName('CategoryContentName'); - $categoryContent->setPosition('position'); - - $this->assertEquals($category, $categoryContent->getCategory()); - $this->assertEquals($contentType, $categoryContent->getContentType()); - $this->assertEquals('CategoryContentName', $categoryContent->getInstanceName()); - $this->assertEquals('position', $categoryContent->getPosition()); - $this->assertEquals($camp, $categoryContent->getCamp()); - } - - public function testCategoryContentHierarchy(): void { - $categoryContent = new CategoryContent(); - $childCategoryContent = new CategoryContent(); - - // Add Child-CategoryContent - $categoryContent->addChild($childCategoryContent); - $this->assertCount(1, $categoryContent->getChildren()); - $this->assertEquals($categoryContent, $childCategoryContent->getParent()); - $this->assertTrue($categoryContent->isRoot()); - $this->assertFalse($childCategoryContent->isRoot()); - - // Remove Child-CategoryContent - $categoryContent->removeChild($childCategoryContent); - $this->assertCount(0, $categoryContent->getChildren()); - $this->assertNull($childCategoryContent->getParent()); - $this->assertTrue($categoryContent->isRoot()); - $this->assertTrue($childCategoryContent->isRoot()); - } -} diff --git a/backend/module/eCampCore/test/Entity/CategoryContentTypeTemplateTest.php b/backend/module/eCampCore/test/Entity/CategoryContentTypeTemplateTest.php deleted file mode 100644 index 6751a2736f..0000000000 --- a/backend/module/eCampCore/test/Entity/CategoryContentTypeTemplateTest.php +++ /dev/null @@ -1,31 +0,0 @@ -setCampTemplate($campTemplate); - $categoryTemplate->setName('CategoryName'); - - $categoryContentTypeTemplate = new CategoryContentTypeTemplate(); - $categoryContentTypeTemplate->setCategoryTemplate($categoryTemplate); - $categoryContentTypeTemplate->setContentType($contentType); - - $this->assertEquals($categoryTemplate, $categoryContentTypeTemplate->getCategoryTemplate()); - $this->assertEquals($contentType, $categoryContentTypeTemplate->getContentType()); - } -} diff --git a/backend/module/eCampCore/test/Entity/CategoryTemplateTest.php b/backend/module/eCampCore/test/Entity/CategoryTemplateTest.php deleted file mode 100644 index fc5c0d7760..0000000000 --- a/backend/module/eCampCore/test/Entity/CategoryTemplateTest.php +++ /dev/null @@ -1,52 +0,0 @@ -setName('ActivityType Name'); - $categoryTemplate->setColor('#FF00FF'); - $categoryTemplate->setNumberingStyle('i'); - $campTemplate->addCategoryTemplate($categoryTemplate); - - $this->assertEquals($campTemplate, $categoryTemplate->getCampTemplate()); - $this->assertEquals('ActivityType Name', $categoryTemplate->getName()); - $this->assertEquals('#FF00FF', $categoryTemplate->getColor()); - $this->assertEquals('i', $categoryTemplate->getNumberingStyle()); - $this->assertInstanceOf('Doctrine\Common\Collections\ArrayCollection', $categoryTemplate->getCategoryContentTemplates()); - $this->assertInstanceOf('Doctrine\Common\Collections\ArrayCollection', $categoryTemplate->getCategoryContentTypeTemplates()); - } - - public function testCategoryContentTypeTemplate(): void { - $categoryTemplate = new CategoryTemplate(); - $categoryContentTypeTemplate = new CategoryContentTypeTemplate(); - - $this->assertCount(0, $categoryTemplate->getCategoryContentTypeTemplates()); - $categoryTemplate->addCategoryContentTypeTemplate($categoryContentTypeTemplate); - $this->assertContains($categoryContentTypeTemplate, $categoryTemplate->getCategoryContentTypeTemplates()); - $categoryTemplate->removeCategoryContentTypeTemplate($categoryContentTypeTemplate); - $this->assertCount(0, $categoryTemplate->getCategoryContentTypeTemplates()); - } - - public function testCategoryContentTemplate(): void { - $categoryTemplate = new CategoryTemplate(); - $categoryContentTemplate = new CategoryContentTemplate(); - - $this->assertCount(0, $categoryTemplate->getCategoryContentTemplates()); - $categoryTemplate->addCategoryContentTemplate($categoryContentTemplate); - $this->assertContains($categoryContentTemplate, $categoryTemplate->getCategoryContentTemplates()); - $categoryTemplate->removeCategoryContentTemplate($categoryContentTemplate); - $this->assertCount(0, $categoryTemplate->getCategoryContentTemplates()); - } -} diff --git a/backend/module/eCampCore/test/Entity/CategoryTest.php b/backend/module/eCampCore/test/Entity/CategoryTest.php index 51181903c0..dd031eaf03 100644 --- a/backend/module/eCampCore/test/Entity/CategoryTest.php +++ b/backend/module/eCampCore/test/Entity/CategoryTest.php @@ -4,7 +4,6 @@ use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\Category; -use eCamp\Core\Entity\CategoryContent; use eCamp\Core\Entity\CategoryContentType; use eCamp\LibTest\PHPUnit\AbstractTestCase; @@ -42,17 +41,6 @@ public function testCategoryContentType(): void { $this->assertCount(0, $category->getCategoryContentTypes()); } - public function testCategoryContent(): void { - $category = new Category(); - $categoryContent = new CategoryContent(); - - $this->assertCount(0, $category->getCategoryContents()); - $category->addCategoryContent($categoryContent); - $this->assertContains($categoryContent, $category->getCategoryContents()); - $category->removeCategoryContent($categoryContent); - $this->assertCount(0, $category->getCategoryContents()); - } - public function testNumberingStyle(): void { $category = new Category(); diff --git a/backend/module/eCampCore/test/Entity/ContentNodeTest.php b/backend/module/eCampCore/test/Entity/ContentNodeTest.php index 2bbd55f3f2..08cc1453ab 100644 --- a/backend/module/eCampCore/test/Entity/ContentNodeTest.php +++ b/backend/module/eCampCore/test/Entity/ContentNodeTest.php @@ -22,15 +22,17 @@ public function testContentNode(): void { $activity->setTitle('ActivityTitle'); $contentNode = new ContentNode(); - $contentNode->setActivity($activity); + $contentNode->setOwner($activity); $contentNode->setContentType($contentType); $contentNode->setInstanceName('ContentNodeName'); - $contentNode->setPosition('position'); + $contentNode->setSlot('slot'); + $contentNode->setPosition(1); - $this->assertEquals($activity, $contentNode->getActivity()); + $this->assertEquals($activity, $contentNode->getOwner()); $this->assertEquals($contentType, $contentNode->getContentType()); $this->assertEquals('ContentNodeName', $contentNode->getInstanceName()); - $this->assertEquals('position', $contentNode->getPosition()); + $this->assertEquals('slot', $contentNode->getSlot()); + $this->assertEquals(1, $contentNode->getPosition()); $this->assertEquals($camp, $contentNode->getCamp()); } diff --git a/backend/module/eCampCore/test/Entity/MaterialListTemplateTest.php b/backend/module/eCampCore/test/Entity/MaterialListTemplateTest.php deleted file mode 100644 index bbec4e6d06..0000000000 --- a/backend/module/eCampCore/test/Entity/MaterialListTemplateTest.php +++ /dev/null @@ -1,23 +0,0 @@ -setName('name'); - $materialListTemplate->setCampTemplate($campTemplate); - - $this->assertEquals('name', $materialListTemplate->getName()); - $this->assertEquals($campTemplate, $materialListTemplate->getCampTemplate()); - } -} diff --git a/backend/module/eCampCore/test/Hydrator/CampTemplateHydratorTest.php b/backend/module/eCampCore/test/Hydrator/CampTemplateHydratorTest.php deleted file mode 100644 index cfc6128725..0000000000 --- a/backend/module/eCampCore/test/Hydrator/CampTemplateHydratorTest.php +++ /dev/null @@ -1,39 +0,0 @@ -setName('name'); - - $hydrator = new CampTemplateHydrator(); - $data = $hydrator->extract($campTemplate); - - $this->assertEquals('name', $data['name']); - - // Wie muss das korrekt verglichen werden? - // ($data['organization'] ist ein LinkEntity - // $this->assertEquals($organization, $data['organization']); - } - - public function testHydrate(): void { - $campTemplate = new CampTemplate(); - $data = [ - 'name' => 'name', - ]; - - $hydrator = new CampTemplateHydrator(); - $hydrator->hydrate($data, $campTemplate); - - $this->assertEquals('name', $campTemplate->getName()); - } -} diff --git a/backend/module/eCampCore/test/Hydrator/CategoryContentHydratorTest.php b/backend/module/eCampCore/test/Hydrator/CategoryContentHydratorTest.php deleted file mode 100644 index 5cc08eb6b4..0000000000 --- a/backend/module/eCampCore/test/Hydrator/CategoryContentHydratorTest.php +++ /dev/null @@ -1,42 +0,0 @@ -setName('ContentTypeName'); - $categoryContent = new CategoryContent(); - $categoryContent->setCategory($category); - $categoryContent->setContentType($contentType); - $categoryContent->setInstanceName('CategoryContentName'); - - $hydrator = new CategoryContentHydrator(); - $data = $hydrator->extract($categoryContent); - - $this->assertEquals('CategoryContentName', $data['instanceName']); - $this->assertEquals('ContentTypeName', $data['contentTypeName']); - } - - public function testHydrate(): void { - $categoryContent = new CategoryContent(); - $data = [ - 'instanceName' => 'CategoryContentName', - ]; - - $hydrator = new CategoryContentHydrator(); - $hydrator->hydrate($data, $categoryContent); - - $this->assertEquals('CategoryContentName', $categoryContent->getInstanceName()); - } -} diff --git a/backend/module/eCampCore/test/Hydrator/CategoryContentTemplateHydratorTest.php b/backend/module/eCampCore/test/Hydrator/CategoryContentTemplateHydratorTest.php deleted file mode 100644 index b5b12b5264..0000000000 --- a/backend/module/eCampCore/test/Hydrator/CategoryContentTemplateHydratorTest.php +++ /dev/null @@ -1,42 +0,0 @@ -setName('ContentTypeName'); - $categoryContentTemplate = new CategoryContentTemplate(); - $categoryContentTemplate->setCategoryTemplate($categoryTemplate); - $categoryContentTemplate->setContentType($contentType); - $categoryContentTemplate->setInstanceName('CategoryContentName'); - - $hydrator = new CategoryContentTemplateHydrator(); - $data = $hydrator->extract($categoryContentTemplate); - - $this->assertEquals('CategoryContentName', $data['instanceName']); - $this->assertEquals('ContentTypeName', $data['contentTypeName']); - } - - public function testHydrate(): void { - $categoryContentTemplate = new CategoryContentTemplate(); - $data = [ - 'instanceName' => 'CategoryContentName', - ]; - - $hydrator = new CategoryContentTemplateHydrator(); - $hydrator->hydrate($data, $categoryContentTemplate); - - $this->assertEquals('CategoryContentName', $categoryContentTemplate->getInstanceName()); - } -} diff --git a/backend/module/eCampCore/test/Hydrator/CategoryTemplateHydratorTest.php b/backend/module/eCampCore/test/Hydrator/CategoryTemplateHydratorTest.php deleted file mode 100644 index fc911b7be7..0000000000 --- a/backend/module/eCampCore/test/Hydrator/CategoryTemplateHydratorTest.php +++ /dev/null @@ -1,46 +0,0 @@ -setShort('n'); - $categoryTemplate->setName('name'); - $categoryTemplate->setColor('#ff0000'); - $categoryTemplate->setNumberingStyle('i'); - - $hydrator = new CategoryTemplateHydrator(); - $data = $hydrator->extract($categoryTemplate); - - $this->assertEquals('n', $data['short']); - $this->assertEquals('name', $data['name']); - $this->assertEquals('#ff0000', $data['color']); - $this->assertEquals('i', $data['numberingStyle']); - } - - public function testHydrate(): void { - $categoryTemplate = new CategoryTemplate(); - $data = [ - 'short' => 'n', - 'name' => 'name', - 'color' => '#00ff00', - 'numberingStyle' => 'a', - ]; - - $hydrator = new CategoryTemplateHydrator(); - $hydrator->hydrate($data, $categoryTemplate); - - $this->assertEquals('n', $categoryTemplate->getShort()); - $this->assertEquals('name', $categoryTemplate->getName()); - $this->assertEquals('#00ff00', $categoryTemplate->getColor()); - $this->assertEquals('a', $categoryTemplate->getNumberingStyle()); - } -} diff --git a/backend/module/eCampCore/test/Hydrator/MaterialListTemplateHydratorTest.php b/backend/module/eCampCore/test/Hydrator/MaterialListTemplateHydratorTest.php deleted file mode 100644 index 1acea40ac5..0000000000 --- a/backend/module/eCampCore/test/Hydrator/MaterialListTemplateHydratorTest.php +++ /dev/null @@ -1,34 +0,0 @@ -setName('name'); - - $hydrator = new MaterialListTemplateHydrator(); - $data = $hydrator->extract($materialListTemplate); - - $this->assertEquals('name', $data['name']); - } - - public function testHydrate(): void { - $materialListTemplate = new MaterialListTemplate(); - $data = [ - 'name' => 'name', - ]; - - $hydrator = new MaterialListTemplateHydrator(); - $hydrator->hydrate($data, $materialListTemplate); - - $this->assertEquals('name', $materialListTemplate->getName()); - } -} diff --git a/backend/module/eCampCore/test/Service/ActivityServiceTest.php b/backend/module/eCampCore/test/Service/ActivityServiceTest.php index fafd23e676..75fb80517d 100644 --- a/backend/module/eCampCore/test/Service/ActivityServiceTest.php +++ b/backend/module/eCampCore/test/Service/ActivityServiceTest.php @@ -10,9 +10,9 @@ use eCamp\Core\Entity\User; use eCamp\Core\EntityService\ActivityService; use eCamp\CoreTest\Data\CampTestData; -use eCamp\CoreTest\Data\CategoryContentTestData; use eCamp\CoreTest\Data\CategoryContentTypeTestData; use eCamp\CoreTest\Data\CategoryTestData; +use eCamp\CoreTest\Data\ContentNodeTestData; use eCamp\CoreTest\Data\UserTestData; use eCamp\LibTest\PHPUnit\AbstractApiControllerTestCase; @@ -31,19 +31,20 @@ class ActivityServiceTest extends AbstractApiControllerTestCase { public function setUp(): void { parent::setUp(); + $container = $this->getApplicationServiceLocator(); $userLoader = new UserTestData(); $campLoader = new CampTestData(); $categoryLoader = new CategoryTestData(); $categoryContentTypeLoader = new CategoryContentTypeTestData(); - $categoryContentLoader = new CategoryContentTestData(); + $contentNodeLoader = new ContentNodeTestData($container); $loader = new Loader(); $loader->addFixture($userLoader); $loader->addFixture($campLoader); $loader->addFixture($categoryLoader); $loader->addFixture($categoryContentTypeLoader); - $loader->addFixture($categoryContentLoader); + $loader->addFixture($contentNodeLoader); $this->loadFixtures($loader); $this->user = $userLoader->getReference(UserTestData::$USER1); @@ -57,7 +58,6 @@ public function testCreateActivity(): void { /** @var ActivityService $activityService */ $activityService = $this->getApplicationServiceLocator()->get(ActivityService::class); - $this->assertCount(1, $this->category->getCategoryContents()); $this->assertCount(1, $this->category->getCategoryContentTypes()); /** @var Activity $activity */ diff --git a/backend/module/eCampCore/test/Service/CampServiceTest.php b/backend/module/eCampCore/test/Service/CampServiceTest.php index 03df584606..1b6ed8af2f 100644 --- a/backend/module/eCampCore/test/Service/CampServiceTest.php +++ b/backend/module/eCampCore/test/Service/CampServiceTest.php @@ -4,16 +4,13 @@ use Doctrine\Common\DataFixtures\Loader; use eCamp\Core\Entity\Camp; -use eCamp\Core\Entity\CampTemplate; use eCamp\Core\Entity\Category; -use eCamp\Core\Entity\CategoryContent; use eCamp\Core\Entity\MaterialList; use eCamp\Core\Entity\User; use eCamp\Core\EntityService\CampService; -use eCamp\CoreTest\Data\CampTemplateTestData; -use eCamp\CoreTest\Data\CategoryContentTemplateTestData; -use eCamp\CoreTest\Data\CategoryTemplateTestData; -use eCamp\CoreTest\Data\MaterialListTemplateTestData; +use eCamp\CoreTest\Data\CampPrototypeTestData; +use eCamp\CoreTest\Data\CategoryPrototypeTestData; +use eCamp\CoreTest\Data\MaterialListPrototypeTestData; use eCamp\CoreTest\Data\UserTestData; use eCamp\LibTest\PHPUnit\AbstractApiControllerTestCase; @@ -24,28 +21,26 @@ class CampServiceTest extends AbstractApiControllerTestCase { /** @var User */ protected $user; - /** @var CampTemplate */ - protected $campTemplate; + /** @var Camp */ + protected $campPrototype; public function setUp(): void { parent::setUp(); $userLoader = new UserTestData(); - $campTemplateLoader = new CampTemplateTestData(); - $materialListTemplateLoader = new MaterialListTemplateTestData(); - $categoryTemplateLoader = new CategoryTemplateTestData(); - $categoryContentTemplateLoader = new CategoryContentTemplateTestData(); + $campPrototypeLoader = new CampPrototypeTestData(); + $materialListPrototypeLoader = new MaterialListPrototypeTestData(); + $categoryPrototypeLoader = new CategoryPrototypeTestData(); $loader = new Loader(); $loader->addFixture($userLoader); - $loader->addFixture($campTemplateLoader); - $loader->addFixture($materialListTemplateLoader); - $loader->addFixture($categoryTemplateLoader); - $loader->addFixture($categoryContentTemplateLoader); + $loader->addFixture($campPrototypeLoader); + $loader->addFixture($materialListPrototypeLoader); + $loader->addFixture($categoryPrototypeLoader); $this->loadFixtures($loader); $this->user = $userLoader->getReference(UserTestData::$USER1); - $this->campTemplate = $campTemplateLoader->getReference(CampTemplateTestData::$TEMPLATE1); + $this->campPrototype = $campPrototypeLoader->getReference(CampPrototypeTestData::$PROTOTYPE1); $this->authenticateUser($this->user); } @@ -59,34 +54,27 @@ public function testCreateCampFromTemplate(): void { 'name' => 'CampName', 'title' => 'CampTitle', 'motto' => 'CampMotto', - 'campTemplateId' => $this->campTemplate->getId(), + 'campPrototypeId' => $this->campPrototype->getId(), ]); $this->assertNotNull($camp); - $this->assertNotNull($camp->getCampTemplateId()); + $this->assertNotNull($camp->getCampPrototypeId()); $this->assertEquals('CampName', $camp->getName()); $this->assertCount(2, $camp->getMaterialLists()); /** @var MaterialList $materialList */ $materialList = $camp->getMaterialLists() - ->filter(fn ($ml) => ('MaterialListTemplate1' == $ml->getName())) + ->filter(fn ($ml) => ('MaterialListPrototype1' == $ml->getName())) ->first() ; $this->assertNotNull($materialList); - $this->assertNotNull($materialList->getMaterialListTemplateId()); + $this->assertNotNull($materialList->getMaterialListPrototypeId()); $this->assertCount(1, $camp->getCategories()); /** @var Category $category */ $category = $camp->getCategories()->first(); $this->assertNotNull($category); - $this->assertNotNull($category->getCategoryTemplateId()); + $this->assertNotNull($category->getCategoryPrototypeId()); $this->assertEquals('ActivityCategory1', $category->getName()); - - $this->assertCount(1, $category->getCategoryContents()); - /** @var CategoryContent $categoryContent */ - $categoryContent = $category->getCategoryContents()->first(); - $this->assertNotNull($categoryContent); - $this->assertNotNull($categoryContent->getCategoryContentTemplateId()); - $this->assertEquals('Storyboard', $categoryContent->getContentType()->getName()); } } From 7a143822eef5013de616424dfb5ebf4e0e0fd474 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Sun, 28 Feb 2021 15:28:14 +0100 Subject: [PATCH 02/19] more unittests --- .../module/eCampCore/src/Acl/AclFactory.php | 1 + .../CategoryContentTypePrototypeTestData.php | 3 +- .../Data/ContentNodePrototypeTestData.php | 46 +++++++++++++++++ .../eCampCore/test/Entity/ActivityTest.php | 12 +++++ .../test/Entity/CategoryContentTypeTest.php | 2 + .../test/Service/CampServiceTest.php | 13 +++++ .../src/Acl/AclAssertion.php | 10 ++-- .../eCampLib/test/Acl/AclAssertionTest.php | 51 +++++++++++++++++++ 8 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php rename backend/module/{eCampCore => eCampLib}/src/Acl/AclAssertion.php (83%) create mode 100644 backend/module/eCampLib/test/Acl/AclAssertionTest.php diff --git a/backend/module/eCampCore/src/Acl/AclFactory.php b/backend/module/eCampCore/src/Acl/AclFactory.php index 14f0390c6c..b11d847d33 100644 --- a/backend/module/eCampCore/src/Acl/AclFactory.php +++ b/backend/module/eCampCore/src/Acl/AclFactory.php @@ -22,6 +22,7 @@ use eCamp\Core\Entity\User; use eCamp\Core\Entity\UserIdentity; use eCamp\Lib\Acl\Acl; +use eCamp\Lib\Acl\AclAssertion; use eCamp\Lib\Acl\Guest; use eCamp\Lib\Entity\BaseEntity; use Interop\Container\ContainerInterface; diff --git a/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php b/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php index b42fded06a..5ca2d1d733 100644 --- a/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php +++ b/backend/module/eCampCore/test/Data/CategoryContentTypePrototypeTestData.php @@ -7,7 +7,6 @@ use Doctrine\Persistence\ObjectManager; use eCamp\Core\Entity\Category; use eCamp\Core\Entity\CategoryContentType; -use eCamp\CoreData\CategoryPrototypeData; class CategoryContentTypePrototypeTestData extends AbstractFixture implements DependentFixtureInterface { public static $PROTOTYPE1 = CategoryContentTypePrototypeTestData::class.':Prototype1'; @@ -28,6 +27,6 @@ public function load(ObjectManager $manager): void { } public function getDependencies() { - return [CategoryPrototypeData::class, ContentTypeTestData::class]; + return [CategoryPrototypeTestData::class, ContentTypeTestData::class]; } } diff --git a/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php b/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php new file mode 100644 index 0000000000..706bf78625 --- /dev/null +++ b/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php @@ -0,0 +1,46 @@ +container = $container; + } + + public function load(ObjectManager $manager): void { + /** @var Category $category */ + $category = $this->getReference(CategoryPrototypeTestData::$PROTOTYPE1); + /** @var ContentType $storyboard */ + $storyboard = $this->getReference(ContentTypeTestData::$TYPE1); + $contentTypeStrategyProvider = new ContentTypeStrategyProvider($this->container); + + $contentNode = new ContentNode(); + $contentNode->setInstanceName('Programm'); + $contentNode->setContentType($storyboard); + $contentNode->setContentTypeStrategyProvider($contentTypeStrategyProvider); + $category->addContentNode($contentNode); + $category->setRootContentNode($contentNode); + + $manager->persist($contentNode); + $manager->flush(); + + $this->addReference(self::$CATEGORY_CONTENT1, $contentNode); + } + + public function getDependencies() { + return [CategoryPrototypeTestData::class, ContentTypeTestData::class]; + } +} diff --git a/backend/module/eCampCore/test/Entity/ActivityTest.php b/backend/module/eCampCore/test/Entity/ActivityTest.php index dc6555923f..91924cbc68 100644 --- a/backend/module/eCampCore/test/Entity/ActivityTest.php +++ b/backend/module/eCampCore/test/Entity/ActivityTest.php @@ -3,6 +3,7 @@ namespace eCamp\CoreTest\Entity; use eCamp\Core\Entity\Activity; +use eCamp\Core\Entity\ActivityResponsible; use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\Category; use eCamp\Core\Entity\ContentNode; @@ -48,4 +49,15 @@ public function testScheduleEntry(): void { $activity->removeScheduleEntry($scheduleEntry); $this->assertEquals(0, $activity->getScheduleEntries()->count()); } + + public function testActivityResponsible(): void { + $activity = new Activity(); + $activityResponsible = new ActivityResponsible(); + + $this->assertEquals(0, $activity->getActivityResponsibles()->count()); + $activity->addActivityResponsible($activityResponsible); + $this->assertContains($activityResponsible, $activity->getActivityResponsibles()); + $activity->removeActivityResponsible($activityResponsible); + $this->assertEquals(0, $activity->getActivityResponsibles()->count()); + } } diff --git a/backend/module/eCampCore/test/Entity/CategoryContentTypeTest.php b/backend/module/eCampCore/test/Entity/CategoryContentTypeTest.php index dc16f10d7d..ce62becb6b 100644 --- a/backend/module/eCampCore/test/Entity/CategoryContentTypeTest.php +++ b/backend/module/eCampCore/test/Entity/CategoryContentTypeTest.php @@ -24,9 +24,11 @@ public function testCategoryContentType(): void { $categoryContentType = new CategoryContentType(); $categoryContentType->setCategory($category); $categoryContentType->setContentType($contentType); + $categoryContentType->setCategoryContentTypePrototypeId('prototypeId'); $this->assertEquals($category, $categoryContentType->getCategory()); $this->assertEquals($contentType, $categoryContentType->getContentType()); $this->assertEquals($camp, $categoryContentType->getCamp()); + $this->assertEquals('prototypeId', $categoryContentType->getCategoryContentTypePrototypeId()); } } diff --git a/backend/module/eCampCore/test/Service/CampServiceTest.php b/backend/module/eCampCore/test/Service/CampServiceTest.php index 1b6ed8af2f..b119b8afae 100644 --- a/backend/module/eCampCore/test/Service/CampServiceTest.php +++ b/backend/module/eCampCore/test/Service/CampServiceTest.php @@ -9,7 +9,9 @@ use eCamp\Core\Entity\User; use eCamp\Core\EntityService\CampService; use eCamp\CoreTest\Data\CampPrototypeTestData; +use eCamp\CoreTest\Data\CategoryContentTypePrototypeTestData; use eCamp\CoreTest\Data\CategoryPrototypeTestData; +use eCamp\CoreTest\Data\ContentNodePrototypeTestData; use eCamp\CoreTest\Data\MaterialListPrototypeTestData; use eCamp\CoreTest\Data\UserTestData; use eCamp\LibTest\PHPUnit\AbstractApiControllerTestCase; @@ -26,17 +28,22 @@ class CampServiceTest extends AbstractApiControllerTestCase { public function setUp(): void { parent::setUp(); + $container = $this->getApplicationServiceLocator(); $userLoader = new UserTestData(); $campPrototypeLoader = new CampPrototypeTestData(); $materialListPrototypeLoader = new MaterialListPrototypeTestData(); $categoryPrototypeLoader = new CategoryPrototypeTestData(); + $categoryContentTypePrototypeLoader = new CategoryContentTypePrototypeTestData(); + $contentNodePrototypeLoader = new ContentNodePrototypeTestData($container); $loader = new Loader(); $loader->addFixture($userLoader); $loader->addFixture($campPrototypeLoader); $loader->addFixture($materialListPrototypeLoader); $loader->addFixture($categoryPrototypeLoader); + $loader->addFixture($categoryContentTypePrototypeLoader); + $loader->addFixture($contentNodePrototypeLoader); $this->loadFixtures($loader); $this->user = $userLoader->getReference(UserTestData::$USER1); @@ -76,5 +83,11 @@ public function testCreateCampFromTemplate(): void { $this->assertNotNull($category); $this->assertNotNull($category->getCategoryPrototypeId()); $this->assertEquals('ActivityCategory1', $category->getName()); + + // CategoryContentTypes have been copied + $this->assertCount(1, $category->getCategoryContentTypes()); + + // ContentNode have been copied + $this->assertNotNull($category->getRootContentNode()); } } diff --git a/backend/module/eCampCore/src/Acl/AclAssertion.php b/backend/module/eCampLib/src/Acl/AclAssertion.php similarity index 83% rename from backend/module/eCampCore/src/Acl/AclAssertion.php rename to backend/module/eCampLib/src/Acl/AclAssertion.php index 0f4d7616a2..f4fb1655f7 100644 --- a/backend/module/eCampCore/src/Acl/AclAssertion.php +++ b/backend/module/eCampLib/src/Acl/AclAssertion.php @@ -1,6 +1,6 @@ operand = self::OR; $assertion->assertions = $assertions; @@ -22,7 +22,7 @@ public static function or(...$assertions): AclAssertion { return $assertion; } - public static function and(...$assertions): AclAssertion { + public static function and(AssertionInterface ...$assertions): AclAssertion { $assertion = new AclAssertion(); $assertion->operand = self::AND; $assertion->assertions = $assertions; @@ -33,7 +33,7 @@ public static function and(...$assertions): AclAssertion { public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $resource = null, $privilege = null): bool { if (self::OR == $this->operand) { for ($i = 0; $i < count($this->assertions); ++$i) { - /** @var AclAssertion $assertion */ + /** @var AssertionInterface $assertion */ $assertion = $this->assertions[$i]; if ($assertion->assert($acl, $role, $resource, $privilege)) { return true; @@ -44,7 +44,7 @@ public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $ } if (self::AND == $this->operand) { for ($i = 0; $i < count($this->assertions); ++$i) { - /** @var AclAssertion $assertion */ + /** @var AssertionInterface $assertion */ $assertion = $this->assertions[$i]; if (!$assertion->assert($acl, $role, $resource, $privilege)) { return false; diff --git a/backend/module/eCampLib/test/Acl/AclAssertionTest.php b/backend/module/eCampLib/test/Acl/AclAssertionTest.php new file mode 100644 index 0000000000..c122a6b244 --- /dev/null +++ b/backend/module/eCampLib/test/Acl/AclAssertionTest.php @@ -0,0 +1,51 @@ +acl = new Acl(); + $this->true = new AssertionMock(true); + $this->false = new AssertionMock(false); + } + + public function testAndAssertion(): void { + $this->assertTrue(AclAssertion::and($this->true, $this->true)->assert($this->acl)); + $this->assertFalse(AclAssertion::and($this->true, $this->false)->assert($this->acl)); + $this->assertFalse(AclAssertion::and($this->false, $this->false)->assert($this->acl)); + } + + public function testOrAssertion(): void { + $this->assertTrue(AclAssertion::or($this->true, $this->true)->assert($this->acl)); + $this->assertTrue(AclAssertion::or($this->true, $this->false)->assert($this->acl)); + $this->assertFalse(AclAssertion::or($this->false, $this->false)->assert($this->acl)); + } +} + +class AssertionMock implements AssertionInterface { + private bool $result; + + public function __construct(bool $result) { + $this->result = $result; + } + + public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $resource = null, $privilege = null) { + return $this->result; + } +} From 825b465378769324f5beae3788ed4617851300a8 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Sun, 28 Feb 2021 22:13:14 +0100 Subject: [PATCH 03/19] ContentNodeHydrator fix and unittest --- .../ContentTypeStrategyProvider.php | 2 +- .../src/Hydrator/ContentNodeHydrator.php | 1 + .../test/Hydrator/ContentNodeHydratorTest.php | 69 +++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php diff --git a/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProvider.php b/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProvider.php index 24b763c980..752f3ea68e 100644 --- a/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProvider.php +++ b/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProvider.php @@ -21,7 +21,7 @@ public function __construct(ContainerInterface $container) { * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ - public function get($contentTypeOrStrategyClass): ContentTypeStrategyInterface { + public function get($contentTypeOrStrategyClass): ?ContentTypeStrategyInterface { $strategyClass = $contentTypeOrStrategyClass; if ($contentTypeOrStrategyClass instanceof ContentType) { diff --git a/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php b/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php index 9cf9c3020e..5a8a3a7a70 100644 --- a/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/ContentNodeHydrator.php @@ -40,6 +40,7 @@ public function extract($object): array { $data = [ 'id' => $contentNode->getId(), 'instanceName' => $contentNode->getInstanceName(), + 'slot' => $contentNode->getSlot(), 'position' => $contentNode->getPosition(), 'contentTypeName' => $contentType->getName(), diff --git a/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php b/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php new file mode 100644 index 0000000000..0dc9c3aaca --- /dev/null +++ b/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php @@ -0,0 +1,69 @@ +setName('type-name'); + + $contentNode = new ContentNode(); + $contentNode->setInstanceName('my-name'); + $contentNode->setSlot('my-slot'); + $contentNode->setPosition(2); + $contentNode->setContentType($contentType); + $contentNode->setOwner(new Activity()); + + $contentNodeParent = new ContentNode(); + $contentNodeParent->setContentType($contentType); + $contentNodeParent->addChild($contentNode); + $contentNodeParent->setOwner(new Category()); + + $container = new ServiceManager(); + $contentTypeStrategyProvider = new ContentTypeStrategyProvider($container); + $hydrator = new ContentNodeHydrator($contentTypeStrategyProvider); + $data = $hydrator->extract($contentNode); + + $this->assertEquals('my-name', $data['instanceName']); + $this->assertEquals('my-slot', $data['slot']); + $this->assertEquals(2, $data['position']); + $this->assertEquals('type-name', $data['contentTypeName']); + $this->assertNotNull($data['parent']); + $this->assertNotNull($data['contentType']); + $this->assertNotNull($data['owner']); + + $data = $hydrator->extract($contentNodeParent); + $this->assertNull($data['parent']); + $this->assertNotNull($data['owner']); + } + + public function testHydrate(): void { + $contentNode = new ContentNode(); + $data = [ + 'instanceName' => 'my-name', + 'slot' => 'top', + 'position' => 3, + ]; + + $container = new ServiceManager(); + $contentTypeStrategyProvider = new ContentTypeStrategyProvider($container); + $hydrator = new ContentNodeHydrator($contentTypeStrategyProvider); + $hydrator->hydrate($data, $contentNode); + + $this->assertEquals('my-name', $contentNode->getInstanceName()); + $this->assertEquals('top', $contentNode->getSlot()); + $this->assertEquals(3, $contentNode->getPosition()); + } +} From 098be89de20561a72e111b73c019d78c4fcb1c60 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Tue, 2 Mar 2021 23:54:47 +0100 Subject: [PATCH 04/19] ContentNode as closed tree --- .../eCampCore/src/Acl/CampIsPrototype.php | 7 +- .../eCampCore/src/Acl/UserIsCollaborator.php | 11 +- .../src/Entity/AbstractContentNodeOwner.php | 45 +++---- .../eCampCore/src/Entity/ContentNode.php | 120 +++++++++++------- .../src/EntityService/ContentNodeService.php | 44 +++---- .../src/Hydrator/ActivityHydrator.php | 2 +- .../src/Hydrator/CategoryHydrator.php | 2 +- .../src/Hydrator/ScheduleEntryHydrator.php | 2 +- .../Data/ContentNodePrototypeTestData.php | 11 -- .../test/Data/ContentNodeTestData.php | 11 -- .../test/Data/MaterialItemTestData.php | 13 +- .../eCampCore/test/Entity/ActivityTest.php | 15 ++- .../eCampCore/test/Entity/ContentNodeTest.php | 97 ++++++++++++-- .../test/Hydrator/ContentNodeHydratorTest.php | 10 +- .../test/Service/ActivityServiceTest.php | 4 +- 15 files changed, 229 insertions(+), 165 deletions(-) diff --git a/backend/module/eCampCore/src/Acl/CampIsPrototype.php b/backend/module/eCampCore/src/Acl/CampIsPrototype.php index 4fb449cf4c..f9ccaf2ce3 100644 --- a/backend/module/eCampCore/src/Acl/CampIsPrototype.php +++ b/backend/module/eCampCore/src/Acl/CampIsPrototype.php @@ -4,6 +4,7 @@ use eCamp\Core\Entity\BelongsToCampInterface; use eCamp\Core\Entity\BelongsToContentNodeInterface; +use eCamp\Core\Entity\Camp; use Laminas\Permissions\Acl\Acl; use Laminas\Permissions\Acl\Assertion\AssertionInterface; use Laminas\Permissions\Acl\Resource\ResourceInterface; @@ -16,9 +17,11 @@ public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $ } if ($resource instanceof BelongsToCampInterface) { - $camp = $resource->getCamp(); + $resource = $resource->getCamp(); + } - return $camp->getIsTemplate(); + if ($resource instanceof Camp) { + return $resource->getIsTemplate(); } return false; diff --git a/backend/module/eCampCore/src/Acl/UserIsCollaborator.php b/backend/module/eCampCore/src/Acl/UserIsCollaborator.php index 4f0505587b..ab836c5553 100644 --- a/backend/module/eCampCore/src/Acl/UserIsCollaborator.php +++ b/backend/module/eCampCore/src/Acl/UserIsCollaborator.php @@ -4,6 +4,7 @@ use eCamp\Core\Entity\BelongsToCampInterface; use eCamp\Core\Entity\BelongsToContentNodeInterface; +use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\CampCollaboration; use eCamp\Core\Entity\User; use Laminas\Permissions\Acl\Acl; @@ -27,15 +28,17 @@ public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $ } if ($resource instanceof BelongsToCampInterface) { - $camp = $resource->getCamp(); + $resource = $resource->getCamp(); + } - if ($camp->getCreator() === $user) { + if ($resource instanceof Camp) { + if ($resource->getCreator() === $user) { return true; } - if ($camp->getOwner() === $user) { + if ($resource->getOwner() === $user) { return true; } - if ($camp->getCampCollaborations()->exists(function ($key, CampCollaboration $cc) use ($user) { + if ($resource->getCampCollaborations()->exists(function ($key, CampCollaboration $cc) use ($user) { return ($cc->getUser() === $user) && ($cc->isEstablished()) && (in_array($cc->getRole(), $this->collaborationRoles)); diff --git a/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php b/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php index dbdcb43287..9505e3c0c4 100644 --- a/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php +++ b/backend/module/eCampCore/src/Entity/AbstractContentNodeOwner.php @@ -12,42 +12,37 @@ * @ORM\InheritanceType("JOINED") * @ORM\DiscriminatorColumn(name="entityType", type="string") */ -abstract class AbstractContentNodeOwner extends BaseEntity implements BelongsToCampInterface { +abstract class AbstractContentNodeOwner extends BaseEntity { /** - * @ORM\OneToOne(targetEntity="ContentNode") + * @ORM\OneToOne(targetEntity="ContentNode", inversedBy="owner") + * @ORM\JoinColumn(nullable=true) */ private ?ContentNode $rootContentNode = null; - /** - * @ORM\OneToMany(targetEntity="ContentNode", mappedBy="owner") - */ - private Collection $contentNodes; - - public function __construct() { - parent::__construct(); - - $this->contentNodes = new ArrayCollection(); - } - public function getRootContentNode(): ?ContentNode { return $this->rootContentNode; } public function setRootContentNode(?ContentNode $rootContentNode) { - $this->rootContentNode = $rootContentNode; - } - - public function getContentNodes(): Collection { - return $this->contentNodes; + if ($this->rootContentNode !== $rootContentNode) { + if (null != $this->rootContentNode) { + $this->rootContentNode->setOwner(null); + } + $this->rootContentNode = $rootContentNode; + if (null != $this->rootContentNode) { + $this->rootContentNode->setOwner($this); + } + } } - public function addContentNode(ContentNode $contentNode) { - $contentNode->setOwner($this); - $this->contentNodes->add($contentNode); - } + public function getAllContentNodes(): Collection { + if (null != $this->rootContentNode) { + return new ArrayCollection(array_merge( + [$this->rootContentNode], + $this->rootContentNode->getAllChildren()->toArray() + )); + } - public function removeContentNode(ContentNode $contentNode) { - $contentNode->setOwner(null); - $this->contentNodes->removeElement($contentNode); + return new ArrayCollection(); } } diff --git a/backend/module/eCampCore/src/Entity/ContentNode.php b/backend/module/eCampCore/src/Entity/ContentNode.php index 2ed30c7363..48d44cd7eb 100644 --- a/backend/module/eCampCore/src/Entity/ContentNode.php +++ b/backend/module/eCampCore/src/Entity/ContentNode.php @@ -5,24 +5,29 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; -use eCamp\Core\ContentType\ContentTypeStrategyInterface; -use eCamp\Core\ContentType\ContentTypeStrategyProviderAware; -use eCamp\Core\ContentType\ContentTypeStrategyProviderTrait; use eCamp\Lib\Entity\BaseEntity; /** * @ORM\Entity * @ORM\HasLifecycleCallbacks */ -class ContentNode extends BaseEntity implements BelongsToCampInterface, ContentTypeStrategyProviderAware { - use ContentTypeStrategyProviderTrait; - +class ContentNode extends BaseEntity implements BelongsToCampInterface { /** - * @ORM\ManyToOne(targetEntity="AbstractContentNodeOwner", inversedBy="contentNodes") - * @ORM\JoinColumn(nullable=false) + * @ORM\OneToOne(targetEntity="AbstractContentNodeOwner", mappedBy="rootContentNode") */ private ?AbstractContentNodeOwner $owner = null; + /** + * @ORM\ManyToOne(targetEntity="ContentNode") + * @ORM\JoinColumn(nullable=true) + */ + private ?ContentNode $root = null; + + /** + * @ORM\OneToMany(targetEntity="ContentNode", mappedBy="root") + */ + private Collection $allChildren; + /** * @ORM\ManyToOne(targetEntity="ContentNode") * @ORM\JoinColumn(nullable=true) @@ -32,7 +37,7 @@ class ContentNode extends BaseEntity implements BelongsToCampInterface, ContentT /** * @ORM\OneToMany(targetEntity="ContentNode", mappedBy="parent") */ - private Collection $children; + private Collection $myChildren; /** * @ORM\Column(type="string", length=64, nullable=true) @@ -63,7 +68,9 @@ class ContentNode extends BaseEntity implements BelongsToCampInterface, ContentT public function __construct() { parent::__construct(); - $this->children = new ArrayCollection(); + $this->root = $this; + $this->myChildren = new ArrayCollection(); + $this->allChildren = new ArrayCollection(); } public function getOwner(): ?AbstractContentNodeOwner { @@ -75,25 +82,22 @@ public function setOwner(?AbstractContentNodeOwner $owner): void { } public function getCamp(): ?Camp { - return (null != $this->owner) ? $this->owner->getCamp() : null; - } + $root = $this->getRoot(); + $owner = $root->getOwner(); - public function isRoot(): bool { - return null == $this->parent; - } + if ($owner instanceof BelongsToCampInterface) { + return $owner->getCamp(); + } - public function getParent(): ?ContentNode { - return $this->parent; + return null; } - public function setParent(?ContentNode $parent): void { - $origParentOwner = isset($this->parent) ? $this->parent->getOwner() : null; - $newParentOwner = isset($parent) ? $parent->getOwner() : null; + public function getMyChildren(): Collection { + return $this->myChildren; + } - if ($origParentOwner != $newParentOwner) { - $this->setOwner($newParentOwner); - } - $this->parent = $parent; + public function getAllChildren(): Collection { + return $this->allChildren; } public function getContentType(): ?ContentType { @@ -112,20 +116,6 @@ public function setInstanceName(?string $instanceName): void { $this->instanceName = $instanceName; } - public function getChildren(): Collection { - return $this->children; - } - - public function addChild(ContentNode $contentNode): void { - $contentNode->setParent($this); - $this->children->add($contentNode); - } - - public function removeChild(ContentNode $contentNode): void { - $contentNode->setParent(null); - $this->children->removeElement($contentNode); - } - public function getSlot(): ?string { return $this->slot; } @@ -150,15 +140,53 @@ public function setConfig($config): void { $this->config = $config; } - /** - * Returns the strategy class of the content-type. - */ - public function getContentTypeStrategy(): ContentTypeStrategyInterface { - return $this->getContentTypeStrategyProvider()->get($this->getContentType()); + public function isRoot(): bool { + return null == $this->parent; + } + + public function getRoot(): ContentNode { + return $this->root ?? $this; } - /** @ORM\PrePersist */ - public function PrePersist(): void { - $this->getContentTypeStrategy()->contentNodeCreated($this); + public function getParent(): ?ContentNode { + return $this->parent; + } + + public function setParent(?ContentNode $newParent) { + if ($this->parent !== $newParent) { + $newRoot = (null != $newParent) ? $newParent->getRoot() : null; + + // if different root, update root. + $this->setRoot($newRoot); + + // update parent + if (null != $this->parent) { + $this->parent->myChildren->removeElement($this); + } + $this->parent = $newParent; + if (null != $this->parent) { + $this->parent->myChildren->add($this); + } + } + } + + private function setRoot(?ContentNode $newRoot) { + if ($this->root !== $newRoot) { + // remove me from old root + if (null != $this->root) { + $this->root->allChildren->removeElement($this); + } + // update my root + $this->root = $newRoot; + // update my children + foreach ($this->myChildren as $child) { + // if my new root is null, i'm the new root of my children + $child->setRoot($newRoot ?? $this); + } + // add me to the new root + if (null != $this->root) { + $this->root->allChildren->add($this); + } + } } } diff --git a/backend/module/eCampCore/src/EntityService/ContentNodeService.php b/backend/module/eCampCore/src/EntityService/ContentNodeService.php index 2fcbef5ca6..eaef4a4d7a 100644 --- a/backend/module/eCampCore/src/EntityService/ContentNodeService.php +++ b/backend/module/eCampCore/src/EntityService/ContentNodeService.php @@ -3,11 +3,9 @@ namespace eCamp\Core\EntityService; use Doctrine\ORM\ORMException; -use Doctrine\ORM\QueryBuilder; use eCamp\Core\ContentType\ContentTypeStrategyProvider; use eCamp\Core\ContentType\ContentTypeStrategyProviderTrait; use eCamp\Core\Entity\AbstractContentNodeOwner; -use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; use eCamp\Core\Hydrator\ContentNodeHydrator; @@ -43,9 +41,9 @@ public function createFromPrototype(AbstractContentNodeOwner $owner, ContentNode 'config' => $prototype->getConfig(), ]); - foreach ($prototype->getChildren() as $childPrototype) { + foreach ($prototype->getMyChildren() as $childPrototype) { $childContentNode = $this->createFromPrototype($owner, $childPrototype); - $contentNode->addChild($childContentNode); + $childContentNode->setParent($contentNode); } return $contentNode; @@ -67,9 +65,20 @@ protected function createEntity($data): ContentNode { /** @var ContentType $contentType */ $contentType = $this->findRelatedEntity(ContentType::class, $data, 'contentTypeId'); - $owner->addContentNode($contentNode); + $owner->setRootContentNode($contentNode); $contentNode->setContentType($contentType); - $contentNode->setContentTypeStrategyProvider($this->getContentTypeStrategyProvider()); + + return $contentNode; + } + + protected function createEntityPost(BaseEntity $entity, $data): BaseEntity { + /** @var ContentNode $contentNode */ + $contentNode = parent::createEntityPost($entity, $data); + + $strategy = $this->getContentTypeStrategyProvider()->get($contentNode); + if (null != $strategy) { + $strategy->contentNodeCreated($contentNode); + } return $contentNode; } @@ -81,30 +90,9 @@ protected function patchEntity(BaseEntity $entity, $data): ContentNode { if (isset($data->parentId)) { /** @var ContentNode $parent */ $parent = $this->findRelatedEntity(ContentNode::class, $data, 'parentId'); - $parent->addChild($contentNode); + $contentNode->setParent($parent); } return $entity; } - - protected function fetchAllQueryBuilder($params = []): QueryBuilder { - $q = parent::fetchAllQueryBuilder($params); - $q->join('row.activity', 'e'); - $q->andWhere($this->createFilter($q, Camp::class, 'e', 'camp')); - - if (isset($params['activityId'])) { - $q->andWhere('row.activity = :activityId'); - $q->setParameter('activityId', $params['activityId']); - } - - return $q; - } - - protected function fetchQueryBuilder($id): QueryBuilder { - $q = parent::fetchQueryBuilder($id); - $q->join('row.activity', 'e'); - $q->andWhere($this->createFilter($q, Camp::class, 'e', 'camp')); - - return $q; - } } diff --git a/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php b/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php index 2f647b9d3d..5488ee5ee9 100644 --- a/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/ActivityHydrator.php @@ -53,7 +53,7 @@ public function extract($object): array { 'scheduleEntries' => new EntityLinkCollection($activity->getScheduleEntries()), - 'contentNodes' => new EntityLinkCollection($activity->getContentNodes()), + 'contentNodes' => new EntityLinkCollection($activity->getAllContentNodes()), ]; } diff --git a/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php b/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php index 801beec49d..d61543f88b 100644 --- a/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/CategoryHydrator.php @@ -29,7 +29,7 @@ public function extract($object): array { 'numberingStyle' => $category->getNumberingStyle(), 'camp' => EntityLink::Create($category->getCamp()), - 'contentNodes' => new EntityLinkCollection($category->getContentNodes()), + 'contentNodes' => new EntityLinkCollection($category->getAllContentNodes()), 'categoryContentTypes' => new CategoryContentTypeCollection($category->getCategoryContentTypes()), ]; } diff --git a/backend/module/eCampCore/src/Hydrator/ScheduleEntryHydrator.php b/backend/module/eCampCore/src/Hydrator/ScheduleEntryHydrator.php index 9c57242467..a921ddc99f 100644 --- a/backend/module/eCampCore/src/Hydrator/ScheduleEntryHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/ScheduleEntryHydrator.php @@ -19,7 +19,7 @@ function (ScheduleEntry $ei) { }, [ 'contentNodes' => Util::Collection(function (Activity $e) { - return new ContentNodeCollection($e->getContentNodes()); + return new ContentNodeCollection($e->getAllContentNodes()); }, null), ] ), diff --git a/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php b/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php index 706bf78625..0dbee47921 100644 --- a/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php +++ b/backend/module/eCampCore/test/Data/ContentNodePrototypeTestData.php @@ -5,33 +5,22 @@ use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Persistence\ObjectManager; -use eCamp\Core\ContentType\ContentTypeStrategyProvider; use eCamp\Core\Entity\Category; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; -use Interop\Container\ContainerInterface; class ContentNodePrototypeTestData extends AbstractFixture implements DependentFixtureInterface { public static $CATEGORY_CONTENT1 = ContentNodePrototypeTestData::class.':CategoryContent1'; - private ContainerInterface $container; - - public function __construct(ContainerInterface $container) { - $this->container = $container; - } - public function load(ObjectManager $manager): void { /** @var Category $category */ $category = $this->getReference(CategoryPrototypeTestData::$PROTOTYPE1); /** @var ContentType $storyboard */ $storyboard = $this->getReference(ContentTypeTestData::$TYPE1); - $contentTypeStrategyProvider = new ContentTypeStrategyProvider($this->container); $contentNode = new ContentNode(); $contentNode->setInstanceName('Programm'); $contentNode->setContentType($storyboard); - $contentNode->setContentTypeStrategyProvider($contentTypeStrategyProvider); - $category->addContentNode($contentNode); $category->setRootContentNode($contentNode); $manager->persist($contentNode); diff --git a/backend/module/eCampCore/test/Data/ContentNodeTestData.php b/backend/module/eCampCore/test/Data/ContentNodeTestData.php index dbdceb8c39..88b7040a9e 100644 --- a/backend/module/eCampCore/test/Data/ContentNodeTestData.php +++ b/backend/module/eCampCore/test/Data/ContentNodeTestData.php @@ -5,33 +5,22 @@ use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Persistence\ObjectManager; -use eCamp\Core\ContentType\ContentTypeStrategyProvider; use eCamp\Core\Entity\Category; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; -use Interop\Container\ContainerInterface; class ContentNodeTestData extends AbstractFixture implements DependentFixtureInterface { public static $CATEGORY_CONTENT1 = ContentNodeTestData::class.':CategoryContent1'; - private ContainerInterface $container; - - public function __construct(ContainerInterface $container) { - $this->container = $container; - } - public function load(ObjectManager $manager): void { /** @var Category $category */ $category = $this->getReference(CategoryTestData::$CATEGORY1); /** @var ContentType $storyboard */ $storyboard = $this->getReference(ContentTypeTestData::$TYPE1); - $contentTypeStrategyProvider = new ContentTypeStrategyProvider($this->container); $contentNode = new ContentNode(); $contentNode->setInstanceName('Programm'); $contentNode->setContentType($storyboard); - $contentNode->setContentTypeStrategyProvider($contentTypeStrategyProvider); - $category->addContentNode($contentNode); $category->setRootContentNode($contentNode); $manager->persist($contentNode); diff --git a/backend/module/eCampCore/test/Data/MaterialItemTestData.php b/backend/module/eCampCore/test/Data/MaterialItemTestData.php index 87799cf29d..835bce87c7 100644 --- a/backend/module/eCampCore/test/Data/MaterialItemTestData.php +++ b/backend/module/eCampCore/test/Data/MaterialItemTestData.php @@ -5,27 +5,17 @@ use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Persistence\ObjectManager; -use eCamp\Core\ContentType\ContentTypeStrategyProvider; use eCamp\Core\Entity\Activity; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; use eCamp\Core\Entity\MaterialItem; use eCamp\Core\Entity\MaterialList; -use Interop\Container\ContainerInterface; class MaterialItemTestData extends AbstractFixture implements DependentFixtureInterface { public static $MATERIALITEM1 = MaterialItem::class.':MATERIALITEM1'; public static $CONTENTNODE1 = ContentNode::class.':CONTENTNODE1'; - protected $container; - - public function __construct(ContainerInterface $container) { - $this->container = $container; - } - public function load(ObjectManager $manager): void { - $contentTypeStrategyProvider = new ContentTypeStrategyProvider($this->container); - /** @var Activity $activity */ $activity = $this->getReference(ActivityTestData::$ACTIVITY1); @@ -36,9 +26,8 @@ public function load(ObjectManager $manager): void { $materialList = $this->getReference(MaterialListTestData::$MATERIALLIST1); $contentNode = new ContentNode(); - $contentNode->setOwner($activity); $contentNode->setContentType($contentType); - $contentNode->setContentTypeStrategyProvider($contentTypeStrategyProvider); + $activity->setRootContentNode($contentNode); $materialItem = new MaterialItem(); $materialItem->setQuantity(2); diff --git a/backend/module/eCampCore/test/Entity/ActivityTest.php b/backend/module/eCampCore/test/Entity/ActivityTest.php index 91924cbc68..bc4dd631c9 100644 --- a/backend/module/eCampCore/test/Entity/ActivityTest.php +++ b/backend/module/eCampCore/test/Entity/ActivityTest.php @@ -30,13 +30,16 @@ public function testCategory(): void { public function testContentNode(): void { $activity = new Activity(); - $contentnode = new ContentNode(); + $root = new ContentNode(); + $node = new ContentNode(); + $node->setParent($root); - $this->assertEquals(0, $activity->getContentNodes()->count()); - $activity->addContentNode($contentnode); - $this->assertContains($contentnode, $activity->getContentNodes()); - $activity->removeContentNode($contentnode); - $this->assertEquals(0, $activity->getContentNodes()->count()); + $this->assertCount(0, $activity->getAllContentNodes()); + $activity->setRootContentNode($root); + $this->assertContains($root, $activity->getAllContentNodes()); + $this->assertContains($node, $activity->getAllContentNodes()); + $activity->setRootContentNode(null); + $this->assertCount(0, $activity->getAllContentNodes()); } public function testScheduleEntry(): void { diff --git a/backend/module/eCampCore/test/Entity/ContentNodeTest.php b/backend/module/eCampCore/test/Entity/ContentNodeTest.php index 08cc1453ab..b3a3ba07e4 100644 --- a/backend/module/eCampCore/test/Entity/ContentNodeTest.php +++ b/backend/module/eCampCore/test/Entity/ContentNodeTest.php @@ -36,18 +36,95 @@ public function testContentNode(): void { $this->assertEquals($camp, $contentNode->getCamp()); } - public function testContentNodeHierarchy(): void { + public function testSingleContentNode(): void { $contentNode = new ContentNode(); - $childContentNode = new ContentNode(); - // Add Child-ContentNode - $contentNode->addChild($childContentNode); - $this->assertCount(1, $contentNode->getChildren()); - $this->assertEquals($contentNode, $childContentNode->getParent()); + $this->assertTrue($contentNode->isRoot()); + $this->assertNull($contentNode->getParent()); + $this->assertEquals($contentNode, $contentNode->getRoot()); + $this->assertCount(0, $contentNode->getMyChildren()); + $this->assertCount(0, $contentNode->getAllChildren()); + } + + public function testContentNodeHirarchy(): void { + $root = new ContentNode(); + $node = new ContentNode(); + $child = new ContentNode(); + + $node->setParent($root); + $child->setParent($node); + + $this->assertTrue($root->isRoot()); + + $this->assertNull($root->getParent()); + $this->assertCount(1, $root->getMyChildren()); + $this->assertContains($node, $root->getMyChildren()); + + $this->assertCount(2, $root->getAllChildren()); + $this->assertContains($node, $root->getAllChildren()); + $this->assertContains($child, $root->getAllChildren()); + $this->assertEquals($root, $node->getRoot()); + $this->assertEquals($root, $child->getRoot()); + } + + public function testChangeParent(): void { + $root = new ContentNode(); + $node1 = new ContentNode(); + $node2 = new ContentNode(); + $child = new ContentNode(); + + $node1->setParent($root); + $node2->setParent($root); + $child->setParent($node1); + + $this->assertEquals($root, $child->getRoot()); + $this->assertEquals($node1, $child->getParent()); + $this->assertContains($child, $node1->getMyChildren()); + $this->assertNotContains($child, $node2->getMyChildren()); + + $child->setParent($node2); + + $this->assertEquals($root, $child->getRoot()); + $this->assertEquals($node2, $child->getParent()); + $this->assertNotContains($child, $node1->getMyChildren()); + $this->assertContains($child, $node2->getMyChildren()); + } + + public function testChangeRoot(): void { + $root1 = new ContentNode(); + $root2 = new ContentNode(); + $node = new ContentNode(); + $child = new ContentNode(); + + $node->setParent($root1); + $child->setParent($node); + + $this->assertEquals($root1, $node->getRoot()); + $this->assertEquals($root1, $child->getRoot()); + $this->assertContains($child, $root1->getallChildren()); + $this->assertNotContains($child, $root2->getAllChildren()); + + $node->setParent($root2); + + $this->assertEquals($root2, $node->getRoot()); + $this->assertEquals($root2, $child->getRoot()); + $this->assertNotContains($child, $root1->getallChildren()); + $this->assertContains($child, $root2->getAllChildren()); + } + + public function testDetachNode(): void { + $root = new ContentNode(); + $node = new ContentNode(); + $child = new ContentNode(); + + $node->setParent($root); + $child->setParent($node); + $this->assertEquals($root, $child->getRoot()); + + $node->setParent(null); + $this->assertEquals($node, $child->getRoot()); - // Remove Child-ContentNode - $contentNode->removeChild($childContentNode); - $this->assertCount(0, $contentNode->getChildren()); - $this->assertNull($childContentNode->getParent()); + $child->setParent(null); + $this->assertEquals($child, $child->getRoot()); } } diff --git a/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php b/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php index 0dc9c3aaca..b424d550cb 100644 --- a/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php +++ b/backend/module/eCampCore/test/Hydrator/ContentNodeHydratorTest.php @@ -19,17 +19,17 @@ public function testExtract(): void { $contentType = new ContentType(); $contentType->setName('type-name'); + $contentNodeParent = new ContentNode(); + $contentNodeParent->setContentType($contentType); + $contentNodeParent->setOwner(new Category()); + $contentNode = new ContentNode(); $contentNode->setInstanceName('my-name'); $contentNode->setSlot('my-slot'); $contentNode->setPosition(2); $contentNode->setContentType($contentType); $contentNode->setOwner(new Activity()); - - $contentNodeParent = new ContentNode(); - $contentNodeParent->setContentType($contentType); - $contentNodeParent->addChild($contentNode); - $contentNodeParent->setOwner(new Category()); + $contentNode->setParent($contentNodeParent); $container = new ServiceManager(); $contentTypeStrategyProvider = new ContentTypeStrategyProvider($container); diff --git a/backend/module/eCampCore/test/Service/ActivityServiceTest.php b/backend/module/eCampCore/test/Service/ActivityServiceTest.php index 75fb80517d..c56cabbe4a 100644 --- a/backend/module/eCampCore/test/Service/ActivityServiceTest.php +++ b/backend/module/eCampCore/test/Service/ActivityServiceTest.php @@ -70,9 +70,9 @@ public function testCreateActivity(): void { $this->assertNotNull($activity); $this->assertEquals('ActivityTitle', $activity->getTitle()); - $this->assertCount(1, $activity->getContentNodes()); + $this->assertCount(1, $activity->getAllContentNodes()); /** @var ContentNode $contentNode */ - $contentNode = $activity->getContentNodes()->first(); + $contentNode = $activity->getAllContentNodes()->first(); $this->assertEquals('Storyboard', $contentNode->getContentType()->getName()); } } From 3cfa32edc39fd1e7003e539258d81c0614c7da17 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Wed, 3 Mar 2021 17:25:57 +0100 Subject: [PATCH 05/19] root is never null --- .../eCampCore/src/Entity/ContentNode.php | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/backend/module/eCampCore/src/Entity/ContentNode.php b/backend/module/eCampCore/src/Entity/ContentNode.php index 48d44cd7eb..24673fbb3e 100644 --- a/backend/module/eCampCore/src/Entity/ContentNode.php +++ b/backend/module/eCampCore/src/Entity/ContentNode.php @@ -21,7 +21,7 @@ class ContentNode extends BaseEntity implements BelongsToCampInterface { * @ORM\ManyToOne(targetEntity="ContentNode") * @ORM\JoinColumn(nullable=true) */ - private ?ContentNode $root = null; + private ContentNode $root; /** * @ORM\OneToMany(targetEntity="ContentNode", mappedBy="root") @@ -145,48 +145,50 @@ public function isRoot(): bool { } public function getRoot(): ContentNode { - return $this->root ?? $this; + return $this->root; } public function getParent(): ?ContentNode { return $this->parent; } - public function setParent(?ContentNode $newParent) { - if ($this->parent !== $newParent) { - $newRoot = (null != $newParent) ? $newParent->getRoot() : null; + public function setParent(?ContentNode $parent) { + // if different parent, update parent + if ($this->parent !== $parent) { + $root = (null != $parent) ? $parent->getRoot() : $this; + $this->setRoot($root); - // if different root, update root. - $this->setRoot($newRoot); - - // update parent + // remove me from old parent if (null != $this->parent) { $this->parent->myChildren->removeElement($this); } - $this->parent = $newParent; + + // update parent + $this->parent = $parent; + + // add me to the new parent if (null != $this->parent) { $this->parent->myChildren->add($this); } } } - private function setRoot(?ContentNode $newRoot) { - if ($this->root !== $newRoot) { + private function setRoot(ContentNode $root) { + // if different root, update root + if ($this->root !== $root) { // remove me from old root - if (null != $this->root) { - $this->root->allChildren->removeElement($this); - } + $this->root->allChildren->removeElement($this); + // update my root - $this->root = $newRoot; + $this->root = $root; // update my children foreach ($this->myChildren as $child) { // if my new root is null, i'm the new root of my children - $child->setRoot($newRoot ?? $this); + $child->setRoot($root); } + // add me to the new root - if (null != $this->root) { - $this->root->allChildren->add($this); - } + $this->root->allChildren->add($this); } } } From fcbee7eb4b039d2d782ef85af8b00d71c22981e4 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Wed, 3 Mar 2021 17:32:55 +0100 Subject: [PATCH 06/19] remove ContentTypeStrategyProviderInjector; use ContentTypeStrategy in service --- .../BaseContentTypeServiceFactory.php | 24 ---------------- .../ContentTypeStrategyProviderAware.php | 9 ------ .../ContentTypeStrategyProviderFactory.php | 15 ---------- .../ContentTypeStrategyProviderInjector.php | 28 ------------------- .../ContentTypeStrategyProviderTrait.php | 15 ---------- .../DefaultContentTypeServiceFactory.php | 14 ---------- .../src/EntityService/ContentNodeService.php | 13 +++++---- backend/module/eCampCore/src/Module.php | 5 ---- 8 files changed, 8 insertions(+), 115 deletions(-) delete mode 100644 backend/module/eCampCore/src/ContentType/BaseContentTypeServiceFactory.php delete mode 100644 backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderAware.php delete mode 100644 backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderFactory.php delete mode 100644 backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderInjector.php delete mode 100644 backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderTrait.php delete mode 100644 backend/module/eCampCore/src/ContentType/DefaultContentTypeServiceFactory.php diff --git a/backend/module/eCampCore/src/ContentType/BaseContentTypeServiceFactory.php b/backend/module/eCampCore/src/ContentType/BaseContentTypeServiceFactory.php deleted file mode 100644 index 3b4a3eaaaf..0000000000 --- a/backend/module/eCampCore/src/ContentType/BaseContentTypeServiceFactory.php +++ /dev/null @@ -1,24 +0,0 @@ -get('Application'); - - $mvcEvent = $app->getMvcEvent(); - $routeMatch = $mvcEvent->getRouteMatch(); - - return $routeMatch->getParam('contentNodeId'); - } -} diff --git a/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderAware.php b/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderAware.php deleted file mode 100644 index 06be56e50a..0000000000 --- a/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderAware.php +++ /dev/null @@ -1,9 +0,0 @@ -contentTypeStrategyProvider = $contentTypeStrategyProvider; - } - - public function postLoad(LifecycleEventArgs $eventArgs): void { - $this->inject($eventArgs); - } - - public function prePersist(LifecycleEventArgs $eventArgs): void { - $this->inject($eventArgs); - } - - private function inject(LifecycleEventArgs $eventArgs): void { - $entity = $eventArgs->getEntity(); - if ($entity instanceof ContentTypeStrategyProviderAware) { - $entity->setContentTypeStrategyProvider($this->contentTypeStrategyProvider); - } - } -} diff --git a/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderTrait.php b/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderTrait.php deleted file mode 100644 index d00459051a..0000000000 --- a/backend/module/eCampCore/src/ContentType/ContentTypeStrategyProviderTrait.php +++ /dev/null @@ -1,15 +0,0 @@ -contentTypeStrategyProvider = $contentTypeStrategyProvider; - } - - public function getContentTypeStrategyProvider(): ContentTypeStrategyProvider { - return $this->contentTypeStrategyProvider; - } -} diff --git a/backend/module/eCampCore/src/ContentType/DefaultContentTypeServiceFactory.php b/backend/module/eCampCore/src/ContentType/DefaultContentTypeServiceFactory.php deleted file mode 100644 index f606a6bc38..0000000000 --- a/backend/module/eCampCore/src/ContentType/DefaultContentTypeServiceFactory.php +++ /dev/null @@ -1,14 +0,0 @@ -getContentNodeId($container); - - return new $requestedName($contentNodeId); - } -} diff --git a/backend/module/eCampCore/src/EntityService/ContentNodeService.php b/backend/module/eCampCore/src/EntityService/ContentNodeService.php index eaef4a4d7a..83a3150180 100644 --- a/backend/module/eCampCore/src/EntityService/ContentNodeService.php +++ b/backend/module/eCampCore/src/EntityService/ContentNodeService.php @@ -4,7 +4,6 @@ use Doctrine\ORM\ORMException; use eCamp\Core\ContentType\ContentTypeStrategyProvider; -use eCamp\Core\ContentType\ContentTypeStrategyProviderTrait; use eCamp\Core\Entity\AbstractContentNodeOwner; use eCamp\Core\Entity\ContentNode; use eCamp\Core\Entity\ContentType; @@ -17,9 +16,13 @@ use Psr\Container\NotFoundExceptionInterface; class ContentNodeService extends AbstractEntityService { - use ContentTypeStrategyProviderTrait; + private ContentTypeStrategyProvider $contentTypeStrategyProvider; - public function __construct(ServiceUtils $serviceUtils, AuthenticationService $authenticationService, ContentTypeStrategyProvider $contentTypeStrategyProvider) { + public function __construct( + ServiceUtils $serviceUtils, + AuthenticationService $authenticationService, + ContentTypeStrategyProvider $contentTypeStrategyProvider + ) { parent::__construct( $serviceUtils, ContentNode::class, @@ -27,7 +30,7 @@ public function __construct(ServiceUtils $serviceUtils, AuthenticationService $a $authenticationService ); - $this->setContentTypeStrategyProvider($contentTypeStrategyProvider); + $this->contentTypeStrategyProvider = $contentTypeStrategyProvider; } public function createFromPrototype(AbstractContentNodeOwner $owner, ContentNode $prototype): ContentNode { @@ -75,7 +78,7 @@ protected function createEntityPost(BaseEntity $entity, $data): BaseEntity { /** @var ContentNode $contentNode */ $contentNode = parent::createEntityPost($entity, $data); - $strategy = $this->getContentTypeStrategyProvider()->get($contentNode); + $strategy = $this->contentTypeStrategyProvider->get($contentNode); if (null != $strategy) { $strategy->contentNodeCreated($contentNode); } diff --git a/backend/module/eCampCore/src/Module.php b/backend/module/eCampCore/src/Module.php index d8881d6401..b831b946fc 100644 --- a/backend/module/eCampCore/src/Module.php +++ b/backend/module/eCampCore/src/Module.php @@ -4,7 +4,6 @@ use Doctrine\DBAL\Logging\EchoSQLLogger; use Doctrine\ORM\EntityManager; -use eCamp\Core\ContentType\ContentTypeStrategyProviderInjector; use Laminas\ApiTools\ApiProblem\ApiProblemResponse; use Laminas\Mvc\Application; use Laminas\Mvc\MvcEvent; @@ -46,9 +45,5 @@ public function onBootstrap(MvcEvent $e): void { } } }, 10); - - // inject ContentTypeStrategyProvider into Doctrine entities (mainly ContentNode entity) - $em->getEventManager()->addEventListener([\Doctrine\ORM\Events::postLoad], $sm->get(ContentTypeStrategyProviderInjector::class)); - $em->getEventManager()->addEventListener([\Doctrine\ORM\Events::prePersist], $sm->get(ContentTypeStrategyProviderInjector::class)); } } From fdaed1f9af8a5a70d98fe9a8b9cfb286554ba0f1 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Wed, 3 Mar 2021 20:25:39 +0100 Subject: [PATCH 07/19] additional unittests --- .../test/Rest/CategoryContentTypeTest.php | 62 +++++++++++++++++++ .../eCampApi/test/Rest/CategoryTest.php | 5 +- .../eCampLib/test/Acl/AclAssertionTest.php | 6 ++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 backend/module/eCampApi/test/Rest/CategoryContentTypeTest.php diff --git a/backend/module/eCampApi/test/Rest/CategoryContentTypeTest.php b/backend/module/eCampApi/test/Rest/CategoryContentTypeTest.php new file mode 100644 index 0000000000..1e2604d6d2 --- /dev/null +++ b/backend/module/eCampApi/test/Rest/CategoryContentTypeTest.php @@ -0,0 +1,62 @@ +addFixture($userLoader); + $loader->addFixture($categoryContentTypeLoader); + $this->loadFixtures($loader); + + $this->user = $userLoader->getReference(UserTestData::$USER1); + $this->categoryContentType = $categoryContentTypeLoader->getReference(CategoryContentTypeTestData::$CATEGORY_CONTENT_TYPE1); + + $this->authenticateUser($this->user); + } + + public function testFetch(): void { + $this->dispatch("{$this->apiEndpoint}/{$this->categoryContentType->getId()}", 'GET'); + + $this->assertResponseStatusCode(200); + + $expectedBody = <<categoryContentType->getId()}" + } +JSON; + + $expectedLinks = <<host}{$this->apiEndpoint}/{$this->categoryContentType->getId()}" + } + } +JSON; + $expectedEmbeddedObjects = ['contentType']; + + $this->verifyHalResourceResponse($expectedBody, $expectedLinks, $expectedEmbeddedObjects); + } +} diff --git a/backend/module/eCampApi/test/Rest/CategoryTest.php b/backend/module/eCampApi/test/Rest/CategoryTest.php index 25ed0baac9..937ac6cd03 100644 --- a/backend/module/eCampApi/test/Rest/CategoryTest.php +++ b/backend/module/eCampApi/test/Rest/CategoryTest.php @@ -5,6 +5,7 @@ use Doctrine\Common\DataFixtures\Loader; use eCamp\Core\Entity\Category; use eCamp\Core\Entity\User; +use eCamp\CoreTest\Data\CategoryContentTypeTestData; use eCamp\CoreTest\Data\CategoryTestData; use eCamp\CoreTest\Data\UserTestData; use eCamp\LibTest\PHPUnit\AbstractApiControllerTestCase; @@ -26,10 +27,12 @@ public function setUp(): void { $userLoader = new UserTestData(); $categoryLoader = new CategoryTestData(); + $categoryContentTypeLoader = new CategoryContentTypeTestData(); $loader = new Loader(); $loader->addFixture($userLoader); $loader->addFixture($categoryLoader); + $loader->addFixture($categoryContentTypeLoader); $this->loadFixtures($loader); $this->user = $userLoader->getReference(UserTestData::$USER1); @@ -60,7 +63,7 @@ public function testFetch(): void { } } JSON; - $expectedEmbeddedObjects = ['camp']; + $expectedEmbeddedObjects = ['camp', 'contentNodes', 'categoryContentTypes']; $this->verifyHalResourceResponse($expectedBody, $expectedLinks, $expectedEmbeddedObjects); } diff --git a/backend/module/eCampLib/test/Acl/AclAssertionTest.php b/backend/module/eCampLib/test/Acl/AclAssertionTest.php index c122a6b244..2c9e330c30 100644 --- a/backend/module/eCampLib/test/Acl/AclAssertionTest.php +++ b/backend/module/eCampLib/test/Acl/AclAssertionTest.php @@ -36,6 +36,12 @@ public function testOrAssertion(): void { $this->assertTrue(AclAssertion::or($this->true, $this->false)->assert($this->acl)); $this->assertFalse(AclAssertion::or($this->false, $this->false)->assert($this->acl)); } + + public function testEmptyAssertion(): void { + $assertion = new AclAssertion(); + + $this->assertFalse($assertion->assert($this->acl)); + } } class AssertionMock implements AssertionInterface { From a190705c90601de5079c2ef2ec851708fa30480a Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Thu, 4 Mar 2021 18:23:54 +0100 Subject: [PATCH 08/19] fix activity-view --- .../src/ContentType/BaseContentTypeService.php | 15 --------------- .../src/EntityService/ContentNodeService.php | 9 +-------- frontend/src/views/activity/Activity.vue | 2 +- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/backend/module/eCampCore/src/ContentType/BaseContentTypeService.php b/backend/module/eCampCore/src/ContentType/BaseContentTypeService.php index 4352609554..247ec100b2 100644 --- a/backend/module/eCampCore/src/ContentType/BaseContentTypeService.php +++ b/backend/module/eCampCore/src/ContentType/BaseContentTypeService.php @@ -4,7 +4,6 @@ use Doctrine\ORM\ORMException; use Doctrine\ORM\QueryBuilder; -use eCamp\Core\Entity\Camp; use eCamp\Core\Entity\ContentNode; use eCamp\Core\EntityService\AbstractEntityService; use eCamp\Lib\Acl\NoAccessException; @@ -67,8 +66,6 @@ protected function fetchAllQueryBuilder($params = []): QueryBuilder { if (is_subclass_of($this->entityClass, BaseContentTypeEntity::class)) { $q->join('row.contentNode', 'cn'); - $q->join('cn.activity', 'a'); - $q->andWhere($this->createFilter($q, Camp::class, 'a', 'camp')); if (isset($params['contentNodeId'])) { $q->andWhere('row.contentNode = :contentNodeId'); @@ -78,16 +75,4 @@ protected function fetchAllQueryBuilder($params = []): QueryBuilder { return $q; } - - protected function fetchQueryBuilder($id): QueryBuilder { - $q = parent::fetchQueryBuilder($id); - - if (is_subclass_of($this->entityClass, BaseContentTypeEntity::class)) { - $q->join('row.contentNode', 'cn'); - $q->join('cn.activity', 'a'); - $q->andWhere($this->createFilter($q, Camp::class, 'a', 'camp')); - } - - return $q; - } } diff --git a/backend/module/eCampCore/src/EntityService/ContentNodeService.php b/backend/module/eCampCore/src/EntityService/ContentNodeService.php index 83a3150180..7d380f4be1 100644 --- a/backend/module/eCampCore/src/EntityService/ContentNodeService.php +++ b/backend/module/eCampCore/src/EntityService/ContentNodeService.php @@ -71,14 +71,7 @@ protected function createEntity($data): ContentNode { $owner->setRootContentNode($contentNode); $contentNode->setContentType($contentType); - return $contentNode; - } - - protected function createEntityPost(BaseEntity $entity, $data): BaseEntity { - /** @var ContentNode $contentNode */ - $contentNode = parent::createEntityPost($entity, $data); - - $strategy = $this->contentTypeStrategyProvider->get($contentNode); + $strategy = $this->contentTypeStrategyProvider->get($contentType); if (null != $strategy) { $strategy->contentNodeCreated($contentNode); } diff --git a/frontend/src/views/activity/Activity.vue b/frontend/src/views/activity/Activity.vue index 7990ca6037..b162f01c65 100644 --- a/frontend/src/views/activity/Activity.vue +++ b/frontend/src/views/activity/Activity.vue @@ -197,7 +197,7 @@ export default { }, async addContentNode (ctId) { await this.api.post('/content-nodes', { - activityId: this.activity.id, + ownerId: this.activity.id, contentTypeId: ctId }) await this.refreshActivity() From 10b99404462ad36a232d33892b0908a5bd3b3e12 Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Thu, 4 Mar 2021 22:49:51 +0100 Subject: [PATCH 09/19] add xdebug explicitly --- .github/workflows/continuous-integration.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 2df2e343cc..3ec71b8ea8 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -67,6 +67,7 @@ jobs: - uses: shivammathur/setup-php@v2 with: php-version: '7.4' + coverage: xdebug - name: Get Composer Cache Directory id: composer-cache From 0089b453dc71a3ae059e93aeb9ca065199879e9e Mon Sep 17 00:00:00 2001 From: Pirmin Mattmann Date: Fri, 5 Mar 2021 20:47:10 +0100 Subject: [PATCH 10/19] fix camp-creation --- backend/module/eCampApi/config/Rest/camp.config.php | 1 + backend/module/eCampApi/test/Rest/CampTest.php | 3 ++- backend/module/eCampApi/test/Rpc/RootTest.php | 2 +- backend/module/eCampCore/src/Acl/CampIsPrototype.php | 2 +- backend/module/eCampCore/src/Entity/Camp.php | 10 +++++----- .../module/eCampCore/src/EntityFilter/CampFilter.php | 2 +- .../module/eCampCore/src/EntityService/CampService.php | 5 +++++ backend/module/eCampCore/src/Hydrator/CampHydrator.php | 4 ++++ .../eCampCore/test/Data/CampPrototypeTestData.php | 2 +- .../eCampCore/test/Hydrator/CampHydratorTest.php | 4 ++++ frontend/src/locales/de.json | 6 ++---- frontend/src/locales/en.json | 8 +++----- frontend/src/locales/fr.json | 6 ++---- frontend/src/locales/it.json | 6 ++---- frontend/src/views/CampCreate.vue | 6 +++--- 15 files changed, 37 insertions(+), 30 deletions(-) diff --git a/backend/module/eCampApi/config/Rest/camp.config.php b/backend/module/eCampApi/config/Rest/camp.config.php index 413d1801b5..279bc98694 100644 --- a/backend/module/eCampApi/config/Rest/camp.config.php +++ b/backend/module/eCampApi/config/Rest/camp.config.php @@ -4,6 +4,7 @@ use eCampApi\V1\Factory\InputFilter; return Config::Create('Camp') + ->addCollectionQueryWhitelist('isPrototype') ->addInputFilterFactory( InputFilter::Create('name', true) ->addFilterStringTrim() diff --git a/backend/module/eCampApi/test/Rest/CampTest.php b/backend/module/eCampApi/test/Rest/CampTest.php index 406c7604f0..ead31cae5a 100644 --- a/backend/module/eCampApi/test/Rest/CampTest.php +++ b/backend/module/eCampApi/test/Rest/CampTest.php @@ -48,7 +48,8 @@ public function testFetch(): void { "name": "CampName", "title": "CampTitle", "motto": "CampMotto", - "role": "manager" + "role": "manager", + "isPrototype": false } JSON; diff --git a/backend/module/eCampApi/test/Rpc/RootTest.php b/backend/module/eCampApi/test/Rpc/RootTest.php index d321fa2a99..188e2d3789 100644 --- a/backend/module/eCampApi/test/Rpc/RootTest.php +++ b/backend/module/eCampApi/test/Rpc/RootTest.php @@ -66,7 +66,7 @@ public function testApiResponse(): void { "templated": true }, "camps": { - "href": "http://{$host}/api/camps{/campId}{?page_size,page}", + "href": "http://{$host}/api/camps{/campId}{?page_size,page,isPrototype}", "templated": true }, "campCollaborations": { diff --git a/backend/module/eCampCore/src/Acl/CampIsPrototype.php b/backend/module/eCampCore/src/Acl/CampIsPrototype.php index f9ccaf2ce3..b0c1f59638 100644 --- a/backend/module/eCampCore/src/Acl/CampIsPrototype.php +++ b/backend/module/eCampCore/src/Acl/CampIsPrototype.php @@ -21,7 +21,7 @@ public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $ } if ($resource instanceof Camp) { - return $resource->getIsTemplate(); + return $resource->getIsPrototype(); } return false; diff --git a/backend/module/eCampCore/src/Entity/Camp.php b/backend/module/eCampCore/src/Entity/Camp.php index 9940788092..ecb83df3b1 100644 --- a/backend/module/eCampCore/src/Entity/Camp.php +++ b/backend/module/eCampCore/src/Entity/Camp.php @@ -56,7 +56,7 @@ class Camp extends BaseEntity implements BelongsToCampInterface { /** * @ORM\Column(type="boolean", nullable=false) */ - private bool $isTemplate = false; + private bool $isPrototype = false; /** * @ORM\Column(type="string", length=32, nullable=false) @@ -104,12 +104,12 @@ public function setCampPrototypeId(?string $campPrototypeId): void { $this->campPrototypeId = $campPrototypeId; } - public function getIsTemplate(): bool { - return $this->isTemplate; + public function getIsPrototype(): bool { + return $this->isPrototype; } - public function setIsTemplate(bool $isTemplate) { - $this->isTemplate = $isTemplate; + public function setIsPrototype(bool $isPrototype) { + $this->isPrototype = $isPrototype; } public function getName(): ?string { diff --git a/backend/module/eCampCore/src/EntityFilter/CampFilter.php b/backend/module/eCampCore/src/EntityFilter/CampFilter.php index 5ff4b948e0..e0a7618452 100644 --- a/backend/module/eCampCore/src/EntityFilter/CampFilter.php +++ b/backend/module/eCampCore/src/EntityFilter/CampFilter.php @@ -19,7 +19,7 @@ public function create(QueryBuilder $q, $alias, $field): Expr\Func { //$campQ->expr()->eq('1', '1'), $campQ->expr()->in('c.id', $collQ->getDQL()), $campQ->expr()->eq('c.owner', ':f_auth_user'), - $campQ->expr()->eq('c.isTemplate', 1) + $campQ->expr()->eq('c.isPrototype', 1) ); $authUser = $this->authUserProvider->getAuthUser(); diff --git a/backend/module/eCampCore/src/EntityService/CampService.php b/backend/module/eCampCore/src/EntityService/CampService.php index 7c270b4d31..c9ecdc3eb1 100644 --- a/backend/module/eCampCore/src/EntityService/CampService.php +++ b/backend/module/eCampCore/src/EntityService/CampService.php @@ -123,6 +123,11 @@ protected function createEntityPost(BaseEntity $entity, $data): Camp { protected function fetchAllQueryBuilder($params = []): QueryBuilder { $q = parent::fetchAllQueryBuilder($params); + if (isset($params['isPrototype'])) { + $q->andWhere('row.isPrototype = :isPrototype'); + $q->setParameter('isPrototype', (bool) $params['isPrototype']); + } + if (isset($params['group'])) { $q->andWhere('row.owner = :group'); $q->setParameter('group', $params['group']); diff --git a/backend/module/eCampCore/src/Hydrator/CampHydrator.php b/backend/module/eCampCore/src/Hydrator/CampHydrator.php index aa3ee3839d..b5d495e402 100644 --- a/backend/module/eCampCore/src/Hydrator/CampHydrator.php +++ b/backend/module/eCampCore/src/Hydrator/CampHydrator.php @@ -64,6 +64,7 @@ public function extract($object): array { 'title' => $camp->getTitle(), 'motto' => $camp->getMotto(), 'role' => $camp->getRole($auth->getIdentity()), + 'isPrototype' => $camp->getIsPrototype(), // 'owner' => EntityLink::Create($camp->getOwner()), 'creator' => EntityLink::Create($camp->getCreator()), @@ -97,6 +98,9 @@ public function hydrate(array $data, $object): Camp { /** @var Camp $camp */ $camp = $object; + if (isset($data['isPrototype'])) { + $camp->setIsPrototype($data['isPrototype']); + } if (isset($data['title'])) { $camp->setTitle($data['title']); } diff --git a/backend/module/eCampCore/test/Data/CampPrototypeTestData.php b/backend/module/eCampCore/test/Data/CampPrototypeTestData.php index 22f4216e7a..b1ab3ba92f 100644 --- a/backend/module/eCampCore/test/Data/CampPrototypeTestData.php +++ b/backend/module/eCampCore/test/Data/CampPrototypeTestData.php @@ -20,7 +20,7 @@ public function load(ObjectManager $manager): void { $camp->setTitle('CampPrototype1'); $camp->setCreator($admin); $camp->setOwner($admin); - $camp->setIsTemplate(true); + $camp->setIsPrototype(true); $manager->persist($camp); $manager->flush(); diff --git a/backend/module/eCampCore/test/Hydrator/CampHydratorTest.php b/backend/module/eCampCore/test/Hydrator/CampHydratorTest.php index 0b880ab5e6..afb2e575e4 100644 --- a/backend/module/eCampCore/test/Hydrator/CampHydratorTest.php +++ b/backend/module/eCampCore/test/Hydrator/CampHydratorTest.php @@ -15,6 +15,7 @@ public function testExtract(): void { $camp->setName('name'); $camp->setTitle('title'); $camp->setMotto('motto'); + $camp->setIsPrototype(true); $hydrator = new CampHydrator(); $data = $hydrator->extract($camp); @@ -22,6 +23,7 @@ public function testExtract(): void { $this->assertEquals('name', $data['name']); $this->assertEquals('title', $data['title']); $this->assertEquals('motto', $data['motto']); + $this->assertTrue($data['isPrototype']); } public function testHydrate(): void { @@ -30,6 +32,7 @@ public function testHydrate(): void { 'name' => 'name', 'title' => 'title', 'motto' => 'motto', + 'isPrototype' => true, ]; $hydrator = new CampHydrator(); @@ -39,5 +42,6 @@ public function testHydrate(): void { $this->assertEquals(null, $camp->getName()); $this->assertEquals('title', $camp->getTitle()); $this->assertEquals('motto', $camp->getMotto()); + $this->assertTrue($camp->getIsPrototype()); } } diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 0fb7a6a2d9..20c0c7f9b3 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -196,14 +196,12 @@ "name": "Name", "title": "Titel" }, - "name": "Lager" + "name": "Lager", + "prototype": "Lagervorlage" }, "campCollaboration": { "campLeft": "Lager verlassen" }, - "campTemplate": { - "name": "Lagervorlage" - }, "period": { "defaultDescription": "Hauptlager", "fields": { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 5eff7a4c88..072688c3ec 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -139,7 +139,7 @@ }, "leftCampCollaboratorListItem": { "inviteAgain": "Invite again", - "delete" : "Do you really want to remove this collaborator from the camp?" + "delete": "Do you really want to remove this collaborator from the camp?" }, "periodMaterialLists": { "addNewItem": "Add new item" @@ -246,14 +246,12 @@ "name": "Name", "title": "Title" }, - "name": "Camp | Camps" + "name": "Camp | Camps", + "prototype": "Camp prototype" }, "campCollaboration": { "campLeft": "left camp" }, - "campTemplate": { - "name": "Camp template" - }, "materialItem": { "fields": { "article": "Article", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index d31f16e6f0..468f43e02e 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -192,14 +192,12 @@ "name": "Nom", "title": "Titre" }, - "name": "Camp" + "name": "Camp", + "prototype": "Modèle de camp" }, "campCollaboration": { "campLeft": "quitter le camp" }, - "campTemplate": { - "name": "Modèle de camp" - }, "period": { "defaultDescription": "Camp principal", "fields": { diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 1d5ba6f00d..6c486ce972 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -192,14 +192,12 @@ "name": "Nome", "title": "Titolo" }, - "name": "Campo" + "name": "Campo", + "prototype": "Modello di campo" }, "campCollaboration": { "campLeft": "lasciato il campo" }, - "campTemplate": { - "name": "Modello di campo" - }, "period": { "defaultDescription": "Campo principale", "fields": { diff --git a/frontend/src/views/CampCreate.vue b/frontend/src/views/CampCreate.vue index 57d2ec08cc..5a43e99cb1 100644 --- a/frontend/src/views/CampCreate.vue +++ b/frontend/src/views/CampCreate.vue @@ -22,8 +22,8 @@ vee-rules="required" required />