Skip to content

Commit 3542180

Browse files
committed
feat: Enhance OpenAPI documentation for Members API with OAuth2 security and request schemas
1 parent 6652539 commit 3542180

File tree

4 files changed

+220
-41
lines changed

4 files changed

+220
-41
lines changed

app/Http/Controllers/Apis/Protected/Main/OAuth2MembersApiController.php

Lines changed: 125 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
* limitations under the License.
1414
**/
1515

16+
use App\Models\Foundation\Main\IGroup;
1617
use App\ModelSerializers\SerializerUtils;
18+
use App\Security\MemberScopes;
1719
use App\Services\Model\IMemberService;
1820
use Illuminate\Http\Response;
1921
use models\exceptions\EntityNotFoundException;
@@ -59,9 +61,9 @@ public function __construct
5961

6062
#[OA\Get(
6163
path: '/api/public/v1/members',
64+
operationId: 'getAllMembersPublic',
6265
summary: 'Get all members',
6366
description: 'Returns a paginated list of members with optional filtering, sorting and search capabilities',
64-
security: [['bearer' => []]],
6567
tags: ['Members (Public)'],
6668
parameters: [
6769
new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)),
@@ -82,10 +84,13 @@ public function __construct
8284
)]
8385
#[OA\Get(
8486
path: '/api/v1/members',
87+
operationId: 'getAllMembers',
8588
summary: 'Get all members',
8689
description: 'Returns a paginated list of members with optional filtering, sorting and search capabilities',
87-
security: [['bearer' => []]],
88-
tags: ['members'],
90+
tags: ['Members'],
91+
security: [['members_oauth2' => [
92+
MemberScopes::ReadMemberData,
93+
]]],
8994
parameters: [
9095
new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)),
9196
new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10, maximum: 100)),
@@ -171,11 +176,11 @@ function () use ($current_member, $application_type) {
171176
}
172177

173178
#[OA\Get(
174-
path: '/api/v1/members/companies',
179+
path: '/api/public/v1/members/all/companies',
180+
operationId: 'getAllMemberCompanies',
175181
summary: 'Get all member companies',
176182
description: 'Returns a paginated list of companies from member profiles',
177-
security: [['bearer' => []]],
178-
tags: ['members'],
183+
tags: ['Members (Public)'],
179184
parameters: [
180185
new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)),
181186
new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10, maximum: 100)),
@@ -230,10 +235,13 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) {
230235
}
231236
#[OA\Get(
232237
path: '/api/v1/members/me',
238+
operationId: 'getCurrentMember',
233239
summary: 'Get current authenticated member',
234240
description: 'Returns the profile of the currently authenticated member',
235-
security: [['bearer' => []]],
236-
tags: ['members'],
241+
tags: ['Members'],
242+
security: [['members_oauth2' => [
243+
MemberScopes::ReadMyMemberData,
244+
]]],
237245
parameters: [
238246
new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (groups, affiliations, all_affiliations, ccla_teams, election_applications, candidate_profile, election_nominations)', schema: new OA\Schema(type: 'string')),
239247
],
@@ -275,10 +283,13 @@ public function getMyMember()
275283

276284
#[OA\Put(
277285
path: '/api/v1/members/me',
286+
operationId: 'updateCurrentMember',
278287
summary: 'Update current authenticated member',
279288
description: 'Updates the profile of the currently authenticated member',
280-
security: [['bearer' => []]],
281-
tags: ['members'],
289+
tags: ['Members'],
290+
security: [['members_oauth2' => [
291+
MemberScopes::WriteMyMemberData,
292+
]]],
282293
requestBody: new OA\RequestBody(
283294
required: true,
284295
content: new OA\JsonContent(ref: '#/components/schemas/MemberUpdateRequest')
@@ -326,11 +337,11 @@ public function updateMyMember()
326337
}
327338

328339
#[OA\Get(
329-
path: '/api/v1/members/{member_id}',
340+
path: '/api/public/v1/members/{member_id}',
341+
operationId: 'getMemberById',
330342
summary: 'Get member by ID',
331343
description: 'Returns a member profile by ID',
332-
security: [['bearer' => []]],
333-
tags: ['members'],
344+
tags: ['Members (Public)'],
334345
parameters: [
335346
new OA\Parameter(name: 'member_id', in: 'path', required: true, description: 'Member ID', schema: new OA\Schema(type: 'integer')),
336347
new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')),
@@ -376,10 +387,13 @@ public function getById($member_id)
376387

377388
#[OA\Get(
378389
path: '/api/v1/members/me/affiliations',
390+
operationId: 'getCurrentMemberAffiliations',
379391
summary: 'Get current member affiliations',
380392
description: 'Returns all affiliations for the currently authenticated member',
381-
security: [['bearer' => []]],
382-
tags: ['members'],
393+
tags: ['Members'],
394+
security: [['members_oauth2' => [
395+
MemberScopes::ReadMyMemberData,
396+
]]],
383397
parameters: [
384398
new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (organization)', schema: new OA\Schema(type: 'string')),
385399
],
@@ -400,10 +414,20 @@ public function getMyMemberAffiliations()
400414

401415
#[OA\Get(
402416
path: '/api/v1/members/{member_id}/affiliations',
417+
operationId: 'getMemberAffiliations',
403418
summary: 'Get member affiliations',
404419
description: 'Returns all affiliations for a specific member',
405-
security: [['bearer' => []]],
406-
tags: ['members'],
420+
tags: ['Members'],
421+
x: [
422+
'required-groups' => [
423+
IGroup::SuperAdmins,
424+
IGroup::Administrators,
425+
IGroup::SummitAdministrators,
426+
]
427+
],
428+
security: [['members_oauth2' => [
429+
MemberScopes::ReadMemberData,
430+
]]],
407431
parameters: [
408432
new OA\Parameter(name: 'member_id', in: 'path', required: true, description: 'Member ID', schema: new OA\Schema(type: 'integer')),
409433
new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (organization)', schema: new OA\Schema(type: 'string')),
@@ -450,10 +474,13 @@ public function getMemberAffiliations($member_id)
450474

451475
#[OA\Post(
452476
path: '/api/v1/members/me/affiliations',
477+
operationId: 'addCurrentMemberAffiliation',
453478
summary: 'Add affiliation to current member',
454479
description: 'Creates a new affiliation for the currently authenticated member',
455-
security: [['bearer' => []]],
456-
tags: ['members'],
480+
tags: ['Members'],
481+
security: [['members_oauth2' => [
482+
MemberScopes::WriteMyMemberData,
483+
]]],
457484
requestBody: new OA\RequestBody(
458485
required: true,
459486
content: new OA\JsonContent(ref: '#/components/schemas/AffiliationRequest')
@@ -476,10 +503,20 @@ public function addMyAffiliation()
476503

477504
#[OA\Post(
478505
path: '/api/v1/members/{member_id}/affiliations',
506+
operationId: 'addMemberAffiliation',
479507
summary: 'Add affiliation to member',
480508
description: 'Creates a new affiliation for a specific member',
481-
security: [['bearer' => []]],
482-
tags: ['members'],
509+
tags: ['Members'],
510+
x: [
511+
'required-groups' => [
512+
IGroup::SuperAdmins,
513+
IGroup::Administrators,
514+
IGroup::SummitAdministrators,
515+
]
516+
],
517+
security: [['members_oauth2' => [
518+
MemberScopes::WriteMemberData,
519+
]]],
483520
parameters: [
484521
new OA\Parameter(name: 'member_id', in: 'path', required: true, description: 'Member ID', schema: new OA\Schema(type: 'integer')),
485522
],
@@ -531,10 +568,13 @@ public function addAffiliation($member_id)
531568

532569
#[OA\Put(
533570
path: '/api/v1/members/me/affiliations/{affiliation_id}',
571+
operationId: 'updateCurrentMemberAffiliation',
534572
summary: 'Update current member affiliation',
535573
description: 'Updates an affiliation for the currently authenticated member',
536-
security: [['bearer' => []]],
537-
tags: ['members'],
574+
tags: ['Members'],
575+
security: [['members_oauth2' => [
576+
MemberScopes::WriteMyMemberData,
577+
]]],
538578
parameters: [
539579
new OA\Parameter(name: 'affiliation_id', in: 'path', required: true, description: 'Affiliation ID', schema: new OA\Schema(type: 'integer')),
540580
],
@@ -560,10 +600,20 @@ public function updateMyAffiliation($affiliation_id)
560600

561601
#[OA\Put(
562602
path: '/api/v1/members/{member_id}/affiliations/{affiliation_id}',
603+
operationId: 'updateMemberAffiliation',
563604
summary: 'Update member affiliation',
564605
description: 'Updates an affiliation for a specific member',
565-
security: [['bearer' => []]],
566-
tags: ['members'],
606+
tags: ['Members'],
607+
x: [
608+
'required-groups' => [
609+
IGroup::SuperAdmins,
610+
IGroup::Administrators,
611+
IGroup::SummitAdministrators,
612+
]
613+
],
614+
security: [['members_oauth2' => [
615+
MemberScopes::WriteMemberData,
616+
]]],
567617
parameters: [
568618
new OA\Parameter(name: 'member_id', in: 'path', required: true, description: 'Member ID', schema: new OA\Schema(type: 'integer')),
569619
new OA\Parameter(name: 'affiliation_id', in: 'path', required: true, description: 'Affiliation ID', schema: new OA\Schema(type: 'integer')),
@@ -616,10 +666,13 @@ public function updateAffiliation($member_id, $affiliation_id)
616666

617667
#[OA\Delete(
618668
path: '/api/v1/members/me/affiliations/{affiliation_id}',
669+
operationId: 'deleteCurrentMemberAffiliation',
619670
summary: 'Delete current member affiliation',
620671
description: 'Deletes an affiliation for the currently authenticated member',
621-
security: [['bearer' => []]],
622-
tags: ['members'],
672+
tags: ['Members'],
673+
security: [['members_oauth2' => [
674+
MemberScopes::WriteMyMemberData,
675+
]]],
623676
parameters: [
624677
new OA\Parameter(name: 'affiliation_id', in: 'path', required: true, description: 'Affiliation ID', schema: new OA\Schema(type: 'integer')),
625678
],
@@ -636,10 +689,20 @@ public function deleteMyAffiliation($affiliation_id)
636689

637690
#[OA\Delete(
638691
path: '/api/v1/members/{member_id}/affiliations/{affiliation_id}',
692+
operationId: 'deleteMemberAffiliation',
639693
summary: 'Delete member affiliation',
640694
description: 'Deletes an affiliation for a specific member',
641-
security: [['bearer' => []]],
642-
tags: ['members'],
695+
tags: ['Members'],
696+
x: [
697+
'required-groups' => [
698+
IGroup::SuperAdmins,
699+
IGroup::Administrators,
700+
IGroup::SummitAdministrators,
701+
]
702+
],
703+
security: [['members_oauth2' => [
704+
MemberScopes::WriteMemberData,
705+
]]],
643706
parameters: [
644707
new OA\Parameter(name: 'member_id', in: 'path', required: true, description: 'Member ID', schema: new OA\Schema(type: 'integer')),
645708
new OA\Parameter(name: 'affiliation_id', in: 'path', required: true, description: 'Affiliation ID', schema: new OA\Schema(type: 'integer')),
@@ -669,10 +732,20 @@ public function deleteAffiliation($member_id, $affiliation_id)
669732

670733
#[OA\Delete(
671734
path: '/api/v1/members/{member_id}/rsvp/{rsvp_id}',
735+
operationId: 'deleteMemberRsvp',
672736
summary: 'Delete member RSVP',
673737
description: 'Deletes an RSVP for a specific member',
674-
security: [['bearer' => []]],
675-
tags: ['members'],
738+
tags: ['Members'],
739+
x: [
740+
'required-groups' => [
741+
IGroup::SuperAdmins,
742+
IGroup::Administrators,
743+
IGroup::SummitAdministrators,
744+
]
745+
],
746+
security: [['members_oauth2' => [
747+
MemberScopes::WriteMemberData,
748+
]]],
676749
parameters: [
677750
new OA\Parameter(name: 'member_id', in: 'path', required: true, description: 'Member ID', schema: new OA\Schema(type: 'integer')),
678751
new OA\Parameter(name: 'rsvp_id', in: 'path', required: true, description: 'RSVP ID', schema: new OA\Schema(type: 'integer')),
@@ -699,10 +772,13 @@ public function deleteRSVP($member_id, $rsvp_id)
699772

700773
#[OA\Put(
701774
path: '/api/v1/members/me/membership/foundation',
775+
operationId: 'signFoundationMembership',
702776
summary: 'Sign foundation membership',
703777
description: 'Signs the currently authenticated member up for foundation membership',
704-
security: [['bearer' => []]],
705-
tags: ['members'],
778+
tags: ['Members'],
779+
security: [['members_oauth2' => [
780+
MemberScopes::WriteMyMemberData,
781+
]]],
706782
responses: [
707783
new OA\Response(
708784
response: Response::HTTP_OK,
@@ -738,10 +814,13 @@ public function signFoundationMembership()
738814

739815
#[OA\Put(
740816
path: '/api/v1/members/me/membership/community',
817+
operationId: 'signCommunityMembership',
741818
summary: 'Sign community membership',
742819
description: 'Signs the currently authenticated member up for community membership',
743-
security: [['bearer' => []]],
744-
tags: ['members'],
820+
tags: ['Members'],
821+
security: [['members_oauth2' => [
822+
MemberScopes::WriteMyMemberData,
823+
]]],
745824
responses: [
746825
new OA\Response(
747826
response: Response::HTTP_OK,
@@ -777,10 +856,13 @@ public function signCommunityMembership()
777856

778857
#[OA\Delete(
779858
path: '/api/v1/members/me/membership/resign',
859+
operationId: 'resignMembership',
780860
summary: 'Resign membership',
781861
description: 'Resigns the currently authenticated member from their membership',
782-
security: [['bearer' => []]],
783-
tags: ['members'],
862+
tags: ['Members'],
863+
security: [['members_oauth2' => [
864+
MemberScopes::WriteMyMemberData,
865+
]]],
784866
responses: [
785867
new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Membership resigned successfully'),
786868
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'),
@@ -803,10 +885,13 @@ public function resignMembership()
803885

804886
#[OA\Put(
805887
path: '/api/v1/members/me/membership/individual',
888+
operationId: 'signIndividualMembership',
806889
summary: 'Sign individual membership',
807890
description: 'Signs the currently authenticated member up for individual membership',
808-
security: [['bearer' => []]],
809-
tags: ['members'],
891+
tags: ['Members'],
892+
security: [['members_oauth2' => [
893+
MemberScopes::WriteMyMemberData,
894+
]]],
810895
responses: [
811896
new OA\Response(
812897
response: Response::HTTP_OK,
@@ -840,4 +925,4 @@ public function signIndividualMembership()
840925
});
841926
}
842927

843-
}
928+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Swagger\schemas;
4+
5+
use OpenApi\Attributes as OA;
6+
7+
8+
#[OA\Schema(
9+
schema: "PresentationTrackChairScoreType",
10+
type: "object",
11+
properties: [
12+
new OA\Property(property: "id", type: "integer", example: 1),
13+
new OA\Property(property: "created", type: "integer", description: "Unix timestamp", example: 1640995200),
14+
new OA\Property(property: "last_edited", type: "integer", description: "Unix timestamp", example: 1640995200),
15+
new OA\Property(property: "score", type: "integer", example: 5),
16+
new OA\Property(property: "name", type: "string", example: "Excellent"),
17+
new OA\Property(property: "description", type: "string", example: "This presentation is excellent"),
18+
new OA\Property(property: "type_id", type: "integer", description: "PresentationTrackChairRatingType ID, if ?expand=type a full PresentationTrackChairRatingType object will be returned in a field called 'type'"),
19+
],
20+
)]
21+
class PresentationTrackChairScoreTypeSchema {}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace App\Swagger\schemas;
4+
5+
use App\Security\MemberScopes;
6+
use OpenApi\Attributes as OA;
7+
8+
#[
9+
OA\SecurityScheme(
10+
type: 'oauth2',
11+
securityScheme: 'members_oauth2',
12+
flows: [
13+
new OA\Flow(
14+
authorizationUrl: L5_SWAGGER_CONST_AUTH_URL,
15+
tokenUrl: L5_SWAGGER_CONST_TOKEN_URL,
16+
flow: 'authorizationCode',
17+
scopes: [
18+
MemberScopes::ReadMemberData => 'Read Member Data',
19+
MemberScopes::ReadMyMemberData => 'Read My Member Data',
20+
MemberScopes::WriteMemberData => 'Write Member Data',
21+
MemberScopes::WriteMyMemberData => 'Write My Member Data',
22+
],
23+
),
24+
],
25+
)
26+
]
27+
class MembersAuthSchema {}

0 commit comments

Comments
 (0)