diff --git a/config/lists/event_registrations.xml b/config/lists/event_registrations.xml new file mode 100644 index 0000000..19e96b6 --- /dev/null +++ b/config/lists/event_registrations.xml @@ -0,0 +1,31 @@ + + + event_registrations + + + + id + App\Entity\EventRegistration + + + + firstName + App\Entity\EventRegistration + + + + lastName + App\Entity\EventRegistration + + + + email + App\Entity\EventRegistration + + + + event + App\Entity\EventRegistration + + + diff --git a/config/packages/sulu_admin.yaml b/config/packages/sulu_admin.yaml index 22635d7..e0afa07 100644 --- a/config/packages/sulu_admin.yaml +++ b/config/packages/sulu_admin.yaml @@ -14,6 +14,10 @@ sulu_admin: list: app.get_event_list detail: app.get_event + event_registrations: + routes: + list: app.get_event_registration_list + # Registering Selection Field Types in this section field_type_options: selection: diff --git a/src/Admin/EventAdmin.php b/src/Admin/EventAdmin.php index 55b6605..8592371 100644 --- a/src/Admin/EventAdmin.php +++ b/src/Admin/EventAdmin.php @@ -5,6 +5,7 @@ namespace App\Admin; use App\Entity\Event; +use App\Entity\EventRegistration; use Sulu\Bundle\AdminBundle\Admin\Admin; use Sulu\Bundle\AdminBundle\Admin\Navigation\NavigationItem; use Sulu\Bundle\AdminBundle\Admin\Navigation\NavigationItemCollection; @@ -22,6 +23,8 @@ class EventAdmin extends Admin const EVENT_LIST_VIEW = 'app.events_list'; + const EVENT_REGISTRATION_LIST_KEY = 'event_registrations'; + const EVENT_ADD_FORM_VIEW = 'app.event_add_form'; const EVENT_EDIT_FORM_VIEW = 'app.event_edit_form'; @@ -119,5 +122,16 @@ public function configureViews(ViewCollection $viewCollection): void ->addToolbarActions($formToolbarActions) ->setParent(static::EVENT_EDIT_FORM_VIEW); $viewCollection->add($editDetailsFormView); + + $editDetailsFormView = $this->viewBuilderFactory->createListViewBuilder(static::EVENT_EDIT_FORM_VIEW . '.registrations', '/registrations') + ->setResourceKey(EventRegistration::RESOURCE_KEY) + ->setListKey(self::EVENT_REGISTRATION_LIST_KEY) + ->setTabTitle('app.registrations') + ->addRouterAttributesToListRequest(['id' => 'eventId']) + ->addListAdapters(['table']) + ->addToolbarActions([]) + ->setUserSettingsKey(EventRegistration::RESOURCE_KEY) + ->setParent(static::EVENT_EDIT_FORM_VIEW); + $viewCollection->add($editDetailsFormView); } } diff --git a/src/Controller/Admin/EventRegistrationController.php b/src/Controller/Admin/EventRegistrationController.php new file mode 100644 index 0000000..a4d444d --- /dev/null +++ b/src/Controller/Admin/EventRegistrationController.php @@ -0,0 +1,38 @@ +doctrineListRepresentationFactory = $doctrineListRepresentationFactory; + } + + /** + * @Route("/admin/api/events/{eventId}/registrations", methods={"GET"}, name="app.get_event_registration_list") + */ + public function getListAction(int $eventId): Response + { + $listRepresentation = $this->doctrineListRepresentationFactory->createDoctrineListRepresentation( + EventRegistration::RESOURCE_KEY, + ['eventId' => $eventId] + ); + + return $this->json($listRepresentation->toArray()); + } +} diff --git a/src/Entity/EventRegistration.php b/src/Entity/EventRegistration.php index db9338a..4c457e1 100644 --- a/src/Entity/EventRegistration.php +++ b/src/Entity/EventRegistration.php @@ -12,6 +12,8 @@ */ class EventRegistration { + const RESOURCE_KEY = 'event_registrations'; + /** * @var int|null * diff --git a/tests/Functional/Controller/Admin/EventRegistrationControllerTest.php b/tests/Functional/Controller/Admin/EventRegistrationControllerTest.php new file mode 100644 index 0000000..9ee3605 --- /dev/null +++ b/tests/Functional/Controller/Admin/EventRegistrationControllerTest.php @@ -0,0 +1,54 @@ +client = $this->createAuthenticatedClient(); + $this->purgeDatabase(); + } + + public function testCGet(): void + { + $event1 = $this->createEvent('Sulu is awesome', 'de'); + $event2 = $this->createEvent('Symfony live is awesome', 'de'); + + $registration1 = $this->createEventRegistration($event1, 'Max', 'Mustermann'); + $registration2 = $this->createEventRegistration($event2, 'Mira', 'Musterfrau'); + + $this->client->jsonRequest('GET', '/admin/api/events/' . $event1->getId() . '/registrations'); + + $response = $this->client->getResponse(); + $this->assertInstanceOf(Response::class, $response); + $result = json_decode($response->getContent() ?: '', true); + $this->assertHttpStatusCode(200, $response); + + $this->assertSame(1, $result['total']); + $this->assertCount(1, $result['_embedded']['event_registrations']); + $items = $result['_embedded']['event_registrations']; + + $this->assertSame($registration1->getId(), $items[0]['id']); + + $this->assertSame($registration1->getFirstName(), $items[0]['firstName']); + $this->assertSame($registration1->getLastName(), $items[0]['lastName']); + $this->assertArrayHasKey('email', $items[0]); + } +} diff --git a/tests/Functional/Traits/EventRegistrationTrait.php b/tests/Functional/Traits/EventRegistrationTrait.php index 895fd07..362bae4 100644 --- a/tests/Functional/Traits/EventRegistrationTrait.php +++ b/tests/Functional/Traits/EventRegistrationTrait.php @@ -11,6 +11,20 @@ trait EventRegistrationTrait { + public function createEventRegistration(Event $event, string $firstName, string $lastName): EventRegistration + { + $event = $this->getEventRegistrationRepository()->create($event); + $event->setFirstName($firstName); + $event->setLastName($lastName); + $event->setEmail($firstName . '@' . $lastName . '.at'); + $event->setMessage(''); + + static::getEntityManager()->persist($event); + static::getEntityManager()->flush(); + + return $event; + } + /** * @return EventRegistration[] */ diff --git a/translations/admin.de.json b/translations/admin.de.json index a6ebdbc..54fd06f 100644 --- a/translations/admin.de.json +++ b/translations/admin.de.json @@ -1,6 +1,7 @@ { "app.events": "Veranstaltungen", "app.image": "Bild", + "app.registrations": "Registrierungen", "app.teaser": "Kurzbeschreibung", "app.start_date": "Start", "app.end_date": "Ende", diff --git a/translations/admin.en.json b/translations/admin.en.json index e063dcb..293fa2d 100644 --- a/translations/admin.en.json +++ b/translations/admin.en.json @@ -1,6 +1,7 @@ { "app.events": "Events", "app.image": "Image", + "app.registrations": "Registrations", "app.teaser": "Teaser", "app.start_date": "Start", "app.end_date": "Ende",