From 64d5483736554238e4ebd471b70b8cb7508ceee5 Mon Sep 17 00:00:00 2001
From: Tobias Gross-Vogt <tgros@tugraz.at>
Date: Tue, 12 Apr 2022 09:20:46 +0200
Subject: [PATCH] added include parameter to all endpoints, unified base-entity
 parameter names

---
 .../CourseCollectionDataProvider.php          | 27 +++++++++++++------
 .../DbpRelayBaseCourseExtension.php           |  6 +++++
 src/Entity/Course.php                         |  9 ++++---
 src/Entity/CourseAttendee.php                 |  2 +-
 4 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/src/DataProvider/CourseCollectionDataProvider.php b/src/DataProvider/CourseCollectionDataProvider.php
index 421d1fd..62f0d34 100644
--- a/src/DataProvider/CourseCollectionDataProvider.php
+++ b/src/DataProvider/CourseCollectionDataProvider.php
@@ -8,8 +8,10 @@ use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
 use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
 use Dbp\Relay\BaseCourseBundle\API\CourseProviderInterface;
 use Dbp\Relay\BaseCourseBundle\Entity\Course;
+use Dbp\Relay\CoreBundle\Exception\ApiError;
 use Dbp\Relay\CoreBundle\Helpers\ArrayFullPaginator;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\Response;
 
 final class CourseCollectionDataProvider extends AbstractController implements CollectionDataProviderInterface, RestrictedDataProviderInterface
 {
@@ -29,24 +31,33 @@ final class CourseCollectionDataProvider extends AbstractController implements C
     {
         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
 
-        $options = [];
         $filters = $context['filters'] ?? [];
+
+        $options = [];
         $options['lang'] = $filters['lang'] ?? 'de';
-        $term = $filters['term'] ?? null;
-        if ($term !== null) {
+
+        if ($term = ($filters['term'] ?? null)) {
             $options['term'] = $term;
         }
 
-        $organizationId = $filters['organizationId'] ?? null;
-        $personId = $filters['personId'] ?? null;
+        if ($include = ($filters['include'] ?? null)) {
+            if ($include === 'localData') {
+                $options['includeLocalData'] = true;
+            } else {
+                throw new ApiError(Response::HTTP_BAD_REQUEST, 'requested inclusion of unknown resource '.$include);
+            }
+        }
+
+        $organizationId = $filters['organization'] ?? null;
+        $lecturerId = $filters['lecturer'] ?? null;
 
         $courses = null;
-        if (!empty($organizationId) || !empty($personId)) {
+        if (!empty($organizationId) || !empty($lecturerId)) {
             if (!empty($organizationId)) {
                 $courses = $this->courseProvider->getCoursesByOrganization($organizationId, $options);
             }
-            if (!empty($personId)) {
-                $coursesByPerson = $this->courseProvider->getCoursesByPerson($personId, $options);
+            if (!empty($lecturerId)) {
+                $coursesByPerson = $this->courseProvider->getCoursesByPerson($lecturerId, $options);
                 if (!empty($organizationId)) {
                     $courses = array_uintersect($courses, $coursesByPerson,
                         'Dbp\Relay\BaseCourseBundle\DataProvider\CourseCollectionDataProvider::compareCourses');
diff --git a/src/DependencyInjection/DbpRelayBaseCourseExtension.php b/src/DependencyInjection/DbpRelayBaseCourseExtension.php
index fcc750d..38c2e02 100644
--- a/src/DependencyInjection/DbpRelayBaseCourseExtension.php
+++ b/src/DependencyInjection/DbpRelayBaseCourseExtension.php
@@ -16,6 +16,12 @@ class DbpRelayBaseCourseExtension extends ConfigurableExtension
         $this->extendArrayParameter(
             $container, 'api_platform.resource_class_directories', [__DIR__.'/../Entity']);
 
+        $this->extendArrayParameter(
+            $container, 'dbp_api.paths_to_hide', [
+            '/course_attendees',
+            '/course_attendees/{identifier}',
+        ]);
+
         $loader = new YamlFileLoader(
             $container,
             new FileLocator(__DIR__.'/../Resources/config')
diff --git a/src/Entity/Course.php b/src/Entity/Course.php
index 7b419e8..258a4c6 100644
--- a/src/Entity/Course.php
+++ b/src/Entity/Course.php
@@ -17,8 +17,9 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *                 "parameters" = {
  *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
  *                     {"name" = "term", "in" = "query", "description" = "Teaching term", "type" = "string", "enum" = {"W", "S"}, "example" = "W"},
- *                     {"name" = "organizationId", "in" = "query", "description" = "ID of organization", "required" = false, "type" = "string", "example" = "1190"},
- *                     {"name" = "personId", "in" = "query", "description" = "ID of lecturer", "required" = false, "type" = "string", "example" = "woody007"},
+ *                     {"name" = "organization", "in" = "query", "description" = "Get courses of an organization (ID of BaseOrganization resource)", "required" = false, "type" = "string", "example" = "1190"},
+ *                     {"name" = "lecturer", "in" = "query", "description" = "Get courses of a lecturer", "required" = false, "type" = "string", "example" = "woody007"},
+ *                     {"name" = "include", "in" = "query", "description" = "Optional resources to include", "type" = "string", "example" = "localData"}
  *                 }
  *             }
  *         }
@@ -29,9 +30,9 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *             "openapi_context" = {
  *                 "tags" = {"BaseCourse"},
  *                 "parameters" = {
- *                     {"name" = "identifier", "in" = "path", "description" = "Id of course", "required" = true, "type" = "string", "example" = "257571"},
+ *                     {"name" = "identifier", "in" = "path", "description" = "Resource identifier", "required" = true, "type" = "string", "example" = "257571"},
  *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
- *                     {"name" = "include", "in" = "query", "description" = "Optional resources to include ", "type" = "string", "example" = "localData"}
+ *                     {"name" = "include", "in" = "query", "description" = "Optional resources to include", "type" = "string", "example" = "localData"}
  *                 }
  *             }
  *         }
diff --git a/src/Entity/CourseAttendee.php b/src/Entity/CourseAttendee.php
index 676e608..9723dde 100644
--- a/src/Entity/CourseAttendee.php
+++ b/src/Entity/CourseAttendee.php
@@ -34,7 +34,7 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *                 "tags" = {"BaseCourse"},
  *                 "summary" = "Get the attendees of a course.",
  *                 "parameters" = {
- *                     {"name" = "identifier", "in" = "path", "description" = "Id of course", "required" = true, "type" = "string", "example" = "123456"},
+ *                     {"name" = "identifier", "in" = "path", "description" = "Resource identifier", "required" = true, "type" = "string", "example" = "257571"},
  *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"}
  *                 }
  *             }
-- 
GitLab