From 51e57a03622dba76422482145f6ad47a68db56b4 Mon Sep 17 00:00:00 2001
From: Tobias Gross-Vogt <tgros@tugraz.at>
Date: Mon, 14 Feb 2022 10:06:08 +0100
Subject: [PATCH] reintroduced get courses by person

---
 src/API/CourseProviderInterface.php           |  5 +++
 src/Controller/GetAttendeesByCourse.php       |  7 ++-
 src/Controller/GetCoursesByOrganization.php   | 14 ++++--
 src/Controller/GetCoursesByPerson.php         | 44 +++++++++++++++++++
 .../CourseCollectionDataProvider.php          |  5 +++
 src/Entity/Course.php                         | 26 +++++++++--
 src/Entity/CourseAttendee.php                 | 10 +++--
 src/Service/DummyCourseProvider.php           |  5 +++
 8 files changed, 101 insertions(+), 15 deletions(-)
 create mode 100644 src/Controller/GetCoursesByPerson.php

diff --git a/src/API/CourseProviderInterface.php b/src/API/CourseProviderInterface.php
index 00c9856..bb27f20 100644
--- a/src/API/CourseProviderInterface.php
+++ b/src/API/CourseProviderInterface.php
@@ -21,6 +21,11 @@ interface CourseProviderInterface
      */
     public function getCoursesByOrganization(string $orgUnitId, array $options = []): array;
 
+    /**
+     * @return Course[]
+     */
+    public function getCoursesByPerson(string $personId, array $options = []): array;
+
     /**
      * @return CourseAttendee[]
      */
diff --git a/src/Controller/GetAttendeesByCourse.php b/src/Controller/GetAttendeesByCourse.php
index 66a382e..31f5a4a 100644
--- a/src/Controller/GetAttendeesByCourse.php
+++ b/src/Controller/GetAttendeesByCourse.php
@@ -9,7 +9,7 @@ use Dbp\Relay\CourseBundle\API\CourseProviderInterface;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 use Symfony\Component\HttpFoundation\Request;
 
-class GetStudentsByCourse extends AbstractController
+class GetAttendeesByCourse extends AbstractController
 {
     public const ITEMS_PER_PAGE = 250;
 
@@ -28,9 +28,8 @@ class GetStudentsByCourse extends AbstractController
         $perPage = (int) $request->query->get('perPage', self::ITEMS_PER_PAGE);
 
         $options = [];
-        if ($request->query->has('lang')) {
-            $options['lang'] = (string) $request->query->get('lang');
-        }
+        $lang = $request->query->get('lang', 'de');
+        $options['lang'] = $lang;
 
         $courses = $this->coursesProvider->getAttendeesByCourse($identifier, $options);
 
diff --git a/src/Controller/GetCoursesByOrganization.php b/src/Controller/GetCoursesByOrganization.php
index ef9e2ab..c093f49 100644
--- a/src/Controller/GetCoursesByOrganization.php
+++ b/src/Controller/GetCoursesByOrganization.php
@@ -21,15 +21,23 @@ class GetCoursesByOrganization extends AbstractController
         $this->coursesProvider = $coursesProvider;
     }
 
-    public function __invoke(string $id, Request $request): PaginatorInterface
+    public function __invoke(string $identifier, Request $request): PaginatorInterface
     {
         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
 
         $page = (int) $request->query->get('page', 1);
         $perPage = (int) $request->query->get('perPage', self::ITEMS_PER_PAGE);
-        $options = ['lang' => $request->query->get('lang', 'de')];
 
-        $courses = $this->coursesProvider->getCoursesByOrganization($id, $options);
+        $options = [];
+        $lang = $request->query->get('lang', 'de');
+        $options['lang'] = $lang;
+
+        $term = $request->query->get('term');
+        if ($term !== null) {
+            $options['term'] = $term;
+        }
+
+        $courses = $this->coursesProvider->getCoursesByOrganization($identifier, $options);
 
         return new ArrayFullPaginator($courses, $page, $perPage);
     }
diff --git a/src/Controller/GetCoursesByPerson.php b/src/Controller/GetCoursesByPerson.php
new file mode 100644
index 0000000..6fa8ca7
--- /dev/null
+++ b/src/Controller/GetCoursesByPerson.php
@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Dbp\Relay\CourseBundle\Controller;
+
+use ApiPlatform\Core\DataProvider\PaginatorInterface;
+use Dbp\Relay\CoreBundle\Helpers\ArrayFullPaginator;
+use Dbp\Relay\CourseBundle\API\CourseProviderInterface;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\Request;
+
+class GetCoursesByPerson extends AbstractController
+{
+    public const ITEMS_PER_PAGE = 250;
+
+    protected $coursesProvider;
+
+    public function __construct(CourseProviderInterface $coursesProvider)
+    {
+        $this->coursesProvider = $coursesProvider;
+    }
+
+    public function __invoke(string $identifier, Request $request): PaginatorInterface
+    {
+        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
+
+        $page = (int) $request->query->get('page', 1);
+        $perPage = (int) $request->query->get('perPage', self::ITEMS_PER_PAGE);
+
+        $options = [];
+        $lang = $request->query->get('lang', 'de');
+        $options['lang'] = $lang;
+
+        $term = $request->query->get('term');
+        if ($term !== null) {
+            $options['term'] = $term;
+        }
+
+        $courses = $this->coursesProvider->getCoursesByPerson($identifier, $options);
+
+        return new ArrayFullPaginator($courses, $page, $perPage);
+    }
+}
diff --git a/src/DataProvider/CourseCollectionDataProvider.php b/src/DataProvider/CourseCollectionDataProvider.php
index d4a01d0..9d386f8 100644
--- a/src/DataProvider/CourseCollectionDataProvider.php
+++ b/src/DataProvider/CourseCollectionDataProvider.php
@@ -32,6 +32,11 @@ final class CourseCollectionDataProvider extends AbstractController implements C
         $filters = $context['filters'] ?? [];
         $options = ['lang' => $filters['lang'] ?? 'de'];
 
+        $term = $filters['term'] ?? null;
+        if ($term !== null) {
+            $options['term'] = $term;
+        }
+
         $page = 1;
         if (isset($filters['page'])) {
             $page = (int) $filters['page'];
diff --git a/src/Entity/Course.php b/src/Entity/Course.php
index 3daaa07..ca4b802 100644
--- a/src/Entity/Course.php
+++ b/src/Entity/Course.php
@@ -6,6 +6,7 @@ namespace Dbp\Relay\CourseBundle\Entity;
 
 use ApiPlatform\Core\Annotation\ApiResource;
 use Dbp\Relay\CourseBundle\Controller\GetCoursesByOrganization;
+use Dbp\Relay\CourseBundle\Controller\GetCoursesByPerson;
 use Symfony\Component\Serializer\Annotation\Groups;
 
 /**
@@ -15,13 +16,14 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *             "openapi_context" = {
  *                 "tags" = {"Courses"},
  *                 "parameters" = {
- *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"}
+ *                     {"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"},
  *                 }
  *             }
  *         },
- *         "get_byorganization" = {
+ *         "get_by_organization" = {
  *             "method" = "GET",
- *             "path" = "/base/organizations/{id}/courses",
+ *             "path" = "/base/organizations/{identifier}/courses",
  *             "controller" = GetCoursesByOrganization::class,
  *             "read" = false,
  *             "openapi_context" = {
@@ -29,7 +31,23 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *                 "summary" = "Get the Courses related to an organization.",
  *                 "parameters" = {
  *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
- *                     {"name" = "id", "in" = "path", "description" = "Id of Organization", "required" = true, "type" = "string", "example" = "123456"}
+ *                     {"name" = "identifier", "in" = "path", "description" = "Id of Organization", "required" = true, "type" = "string", "example" = "123456"},
+ *                     {"name" = "term", "in" = "query", "description" = "Teaching term", "type" = "string", "enum" = {"W", "S"}, "example" = "W"},
+ *                 }
+ *             },
+ *         },
+ *         "get_by_person" = {
+ *             "method" = "GET",
+ *             "path" = "/base/people/{identifier}/courses",
+ *             "controller" = GetCoursesByPerson::class,
+ *             "read" = false,
+ *             "openapi_context" = {
+ *                 "tags" = {"Courses"},
+ *                 "summary" = "Get the Courses related to a person.",
+ *                 "parameters" = {
+ *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
+ *                     {"name" = "identifier", "in" = "path", "description" = "Id of person", "required" = true, "type" = "string", "example" = "woody007"},
+ *                     {"name" = "term", "in" = "query", "description" = "Teaching term", "type" = "string", "enum" = {"W", "S"}, "example" = "W"},
  *                 }
  *             },
  *         },
diff --git a/src/Entity/CourseAttendee.php b/src/Entity/CourseAttendee.php
index ab23418..f995bfe 100644
--- a/src/Entity/CourseAttendee.php
+++ b/src/Entity/CourseAttendee.php
@@ -5,15 +5,16 @@ declare(strict_types=1);
 namespace Dbp\Relay\CourseBundle\Entity;
 
 use ApiPlatform\Core\Annotation\ApiResource;
-use Dbp\Relay\BasePersonBundle\Controller\GetAtteendeesByCourse;
 use Dbp\Relay\BasePersonBundle\Entity\PersonInterface;
 use Dbp\Relay\BasePersonBundle\Entity\PersonTrait;
+use Dbp\Relay\CourseBundle\Controller\GetAttendeesByCourse;
 use Symfony\Component\Serializer\Annotation\Groups;
 
 /**
  * @ApiResource(
  *     collectionOperations={
  *         "get" = {
+ *             "path" = "/course_attendees",
  *             "openapi_context" = {
  *                 "tags" = {"Courses"}
  *             }
@@ -21,7 +22,7 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *         "get_bycourse" = {
  *             "method" = "GET",
  *             "path" = "/courses/{identifier}/attendees",
- *             "controller" = GetAtteendeesByCourse::class,
+ *             "controller" = GetAttendeesByCourse::class,
  *             "read" = false,
  *             "normalization_context" = {
  *                 "jsonld_embed_context" = true,
@@ -39,14 +40,15 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *     },
  *     itemOperations={
  *         "get" = {
+ *             "path" = "/course_attendees/{identifier}",
  *             "openapi_context" = {
  *                 "tags" = {"Courses"}
  *             }
  *         }
  *     },
  *     iri="http://schema.org/Person",
- *     shortName="BasePerson",
- *     description="A person of the LDAP system",
+ *     shortName="CourseAttendee",
+ *     description="A person attending a course",
  *     normalizationContext={
  *         "groups" = {"BasePerson:output"},
  *         "jsonld_embed_context" = true,
diff --git a/src/Service/DummyCourseProvider.php b/src/Service/DummyCourseProvider.php
index c35056c..3004bdd 100644
--- a/src/Service/DummyCourseProvider.php
+++ b/src/Service/DummyCourseProvider.php
@@ -43,4 +43,9 @@ class DummyCourseProvider implements CourseProviderInterface
 
         return [$attendee];
     }
+
+    public function getCoursesByPerson(string $personId, array $options = []): array
+    {
+        return $this->getCourses($options);
+    }
 }
-- 
GitLab