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