1- <?php namespace App \Http \Controllers \Api \OAuth2 ;
1+ <?php
2+ namespace App \Http \Controllers \Api \OAuth2 ;
23/**
34 * Copyright 2025 OpenStack Foundation
45 * Licensed under the Apache License, Version 2.0 (the "License");
1415
1516use App \Http \Controllers \GetAllTrait ;
1617use App \libs \Auth \Repositories \IGroupRepository ;
18+ use App \libs \OAuth2 \IGroupScopes ;
1719use App \ModelSerializers \SerializerRegistry ;
1820use OAuth2 \IResourceServerContext ;
21+ use OpenApi \Attributes as OA ;
22+ use Symfony \Component \HttpFoundation \Response ;
1923use Utils \Services \ILogService ;
2024
2125/**
@@ -27,7 +31,7 @@ final class OAuth2GroupApiController extends OAuth2ProtectedController
2731 use GetAllTrait;
2832
2933 /**
30- * OAuth2UserApiController constructor.
34+ * OAuth2GroupApiController constructor.
3135 * @param IGroupRepository $repository
3236 * @param IResourceServerContext $resource_server_context
3337 * @param ILogService $log_service
@@ -37,12 +41,61 @@ public function __construct
3741 IGroupRepository $ repository ,
3842 IResourceServerContext $ resource_server_context ,
3943 ILogService $ log_service ,
40- )
41- {
44+ ) {
4245 parent ::__construct ($ resource_server_context , $ log_service );
4346 $ this ->repository = $ repository ;
4447 }
4548
49+ #[OA \Get(
50+ path: '/api/v1/groups ' ,
51+ operationId: 'getGroups ' ,
52+ summary: 'Get all groups ' ,
53+ description: 'Retrieves a paginated list of groups with optional filtering and ordering. No route-level middleware enforcement; requires valid OAuth2 bearer token only. ' ,
54+ security: [['OAuth2GroupsSecurity ' => [IGroupScopes::ReadAll]]],
55+ tags: ['Groups ' ],
56+ parameters: [
57+ new OA \Parameter (
58+ name: 'page ' ,
59+ in: 'query ' ,
60+ description: 'Page number for pagination ' ,
61+ required: false ,
62+ schema: new OA \Schema (type: 'integer ' , minimum: 1 , default: 1 , example: 1 )
63+ ),
64+ new OA \Parameter (
65+ name: 'per_page ' ,
66+ in: 'query ' ,
67+ description: 'Number of items per page ' ,
68+ required: false ,
69+ schema: new OA \Schema (type: 'integer ' , minimum: 5 , maximum: 100 , default: 5 , example: 10 )
70+ ),
71+ new OA \Parameter (
72+ name: 'filter ' ,
73+ in: 'query ' ,
74+ description: 'Filter criteria. Supported filters: slug== (exact match). Example: filter=slug==administrators ' ,
75+ required: false ,
76+ schema: new OA \Schema (type: 'string ' , example: 'slug==administrators ' )
77+ ),
78+ new OA \Parameter (
79+ name: 'order ' ,
80+ in: 'query ' ,
81+ description: 'Ordering criteria. Supported fields: id, name, slug. Use + for ascending, - for descending. Example: +name or -id ' ,
82+ required: false ,
83+ schema: new OA \Schema (type: 'string ' , example: '+name ' )
84+ )
85+ ],
86+ responses: [
87+ new OA \Response (
88+ response: Response::HTTP_OK ,
89+ description: 'Successful response with paginated groups ' ,
90+ content: new OA \JsonContent (ref: '#/components/schemas/PaginatedGroupResponse ' )
91+ ),
92+ new OA \Response (response: Response::HTTP_UNAUTHORIZED , description: 'Unauthorized ' ),
93+ new OA \Response (response: Response::HTTP_FORBIDDEN , description: 'Forbidden - insufficient scope ' ),
94+ new OA \Response (response: Response::HTTP_NOT_FOUND , description: 'Not Found ' ),
95+ new OA \Response (response: Response::HTTP_PRECONDITION_FAILED , description: 'Validation failed, invalid filter or order parameter ' ),
96+ new OA \Response (response: Response::HTTP_INTERNAL_SERVER_ERROR , description: 'Server error ' )
97+ ]
98+ )]
4699 protected function getAllSerializerType (): string
47100 {
48101 return SerializerRegistry::SerializerType_Public;
0 commit comments