From 071c890103cb8eba373ae4a9a930c563c39de8cc Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 23 Oct 2025 16:51:08 -0300 Subject: [PATCH 1/7] feat: Extend Swagger Coverage for controller `OAuth2SummitAttendeesApiController` --- .../OAuth2SummitAttendeesApiController.php | 457 ++++++++++++++---- app/Swagger/SummitRegistrationSchemas.php | 30 +- 2 files changed, 393 insertions(+), 94 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php index 592c991d6..973e5197c 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php @@ -26,8 +26,10 @@ use App\Services\Model\IAttendeeService; use App\Services\Model\ISummitOrderService; use Exception; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Request; +use OpenApi\Attributes as OA; use models\exceptions\EntityNotFoundException; use models\exceptions\ValidationException; use models\main\IMemberRepository; @@ -142,10 +144,26 @@ public function __construct * Attendees endpoints */ - /** - * @param $summit_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/attendees/me', + summary: 'Get current user attendee profile', + description: 'Returns the attendee profile for the currently authenticated user in the specified summit', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (extra_questions, tickets, presentation_votes, ticket_types, allowed_access_levels, allowed_features, tags)', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendee') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + ] + )] public function getOwnAttendee($summit_id) { try { @@ -170,11 +188,27 @@ public function getOwnAttendee($summit_id) } } - /** - * @param $summit_id - * @param $attendee_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}', + summary: 'Get attendee by ID', + description: 'Returns a specific attendee profile from the summit', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendee') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + ] + )] public function getAttendee($summit_id, $attendee_id) { return $this->processRequest(function() use($summit_id, $attendee_id){ @@ -201,11 +235,29 @@ public function getAttendee($summit_id, $attendee_id) }); } - /** - * @param $summit_id - * @param $attendee_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule', + summary: 'Get attendee schedule', + description: 'Returns the personal schedule for a specific attendee', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent( + type: 'array', + items: new OA\Items(type: 'object') + ) + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + ] + )] public function getAttendeeSchedule($summit_id, $attendee_id) { try { @@ -232,12 +284,24 @@ public function getAttendeeSchedule($summit_id, $attendee_id) } } - /** - * @param $summit_id - * @param $attendee_id - * @param $event_id - * @return mixed - */ + #[OA\Post( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule/{event_id}', + summary: 'Add event to attendee schedule', + description: 'Adds an event to the attendee\'s personal schedule', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Event added to schedule successfully'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, attendee or event not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function addEventToAttendeeSchedule($summit_id, $attendee_id, $event_id) { try { @@ -266,12 +330,24 @@ public function addEventToAttendeeSchedule($summit_id, $attendee_id, $event_id) } } - /** - * @param $summit_id - * @param $attendee_id - * @param $event_id - * @return mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule/{event_id}', + summary: 'Remove event from attendee schedule', + description: 'Removes an event from the attendee\'s personal schedule', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Event removed from schedule successfully'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, attendee or event not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function removeEventFromAttendeeSchedule($summit_id, $attendee_id, $event_id) { try { @@ -301,12 +377,24 @@ public function removeEventFromAttendeeSchedule($summit_id, $attendee_id, $event } } - /** - * @param $summit_id - * @param $attendee_id - * @param $event_id - * @return mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule/{event_id}/rsvp', + summary: 'Delete RSVP for event', + description: 'Deletes the attendee\'s RSVP for a specific event', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'RSVP deleted successfully'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, attendee or event not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function deleteEventRSVP($summit_id, $attendee_id, $event_id) { try { @@ -342,10 +430,31 @@ public function deleteEventRSVP($summit_id, $attendee_id, $event_id) } } - /** - * @param $summit_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/attendees', + summary: 'Get all attendees for a summit', + description: 'Returns a paginated list of attendees for the specified summit with filtering, sorting and search capabilities', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), + new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10, maximum: 100)), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by id, first_name, last_name, full_name, company, email, member_id, ticket_type, badge_type, status, has_member, has_tickets, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by first_name, last_name, email, company, id, status, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitAttendeesResponse') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: 'Bad request'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getAttendeesBySummit($summit_id) { @@ -610,10 +719,31 @@ function () { ); } - /** - * @param int $summit_id - * @return mixed - */ + #[OA\Post( + path: '/api/v1/summits/{summit_id}/attendees', + summary: 'Create a new attendee', + description: 'Creates a new attendee for the specified summit', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AttendeeRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Attendee created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendee') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: 'Bad request'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function addAttendee($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -668,11 +798,22 @@ public function addAttendee($summit_id) }); } - /** - * @param $summit_id - * @param $attendee_id - * @return mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}', + summary: 'Delete an attendee', + description: 'Deletes a specific attendee from the summit', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Attendee deleted successfully'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + ] + )] public function deleteAttendee($summit_id, $attendee_id) { return $this->processRequest(function() use($summit_id, $attendee_id){ @@ -690,11 +831,32 @@ public function deleteAttendee($summit_id, $attendee_id) }); } - /** - * @param int $summit_id - * @param int $attendee_id - * @return mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}', + summary: 'Update an attendee', + description: 'Updates a specific attendee in the summit', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AttendeeRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Attendee updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendee') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: 'Bad request'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function updateAttendee($summit_id, $attendee_id) { return $this->processRequest(function() use($summit_id, $attendee_id){ @@ -752,11 +914,32 @@ public function updateAttendee($summit_id, $attendee_id) }); } - /** - * @param $summit_id - * @param $attendee_id - * @return mixed - */ + #[OA\Post( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets', + summary: 'Add ticket to attendee', + description: 'Creates a new ticket for a specific attendee', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AddAttendeeTicketRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Ticket created successfully', + content: new OA\JsonContent(type: 'object') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: 'Bad request'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function addAttendeeTicket($summit_id, $attendee_id) { return $this->processRequest(function() use($summit_id, $attendee_id){ @@ -808,12 +991,23 @@ public function addAttendeeTicket($summit_id, $attendee_id) }); } - /** - * @param $summit_id - * @param $attendee_id - * @param $ticket_id - * @return mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets/{ticket_id}', + summary: 'Delete attendee ticket', + description: 'Deletes a specific ticket from an attendee', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Ticket deleted successfully'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, attendee or ticket not found'), + ] + )] public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) { return $this->processRequest(function() use($summit_id, $attendee_id, $ticket_id){ @@ -830,13 +1024,28 @@ public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) }); } - /** - * @param $summit_id - * @param $attendee_id - * @param $ticket_id - * @param $other_member_id - * @return mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets/{ticket_id}/reassign/member/{other_member_id}', + summary: 'Reassign ticket to another member', + description: 'Reassigns a ticket from one attendee to another member', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'other_member_id', in: 'path', required: true, description: 'Target Member ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Ticket reassigned successfully', + content: new OA\JsonContent(type: 'object') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, attendee, ticket or member not found'), + ] + )] public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket_id, $other_member_id) { return $this->processRequest(function() use($summit_id, $attendee_id, $ticket_id, $other_member_id){ @@ -862,12 +1071,32 @@ public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket }); } - /** - * @param $summit_id - * @param $attendee_id - * @param $ticket_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets/{ticket_id}/reassign', + summary: 'Reassign ticket to another attendee', + description: 'Reassigns a ticket to a different attendee by email', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/ReassignAttendeeTicketRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Ticket reassigned successfully', + content: new OA\JsonContent(type: 'object') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: 'Bad request'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, attendee or ticket not found'), + ] + )] public function reassignAttendeeTicket($summit_id, $attendee_id, $ticket_id) { return $this->processRequest(function() use($summit_id, $attendee_id, $ticket_id){ @@ -905,10 +1134,28 @@ protected function getSummitRepository(): ISummitRepository return $this->summit_repository; } - /** - * @param $summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Post( + path: '/api/v1/summits/{summit_id}/attendees/send', + summary: 'Send email to attendees', + description: 'Sends email notifications to filtered attendees', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter attendees', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/SendAttendeesEmailRequest') + ), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Email send process initiated successfully'), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: 'Bad request'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function send($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -1035,11 +1282,26 @@ public function send($summit_id) }); } - /** - * @param int $summit_id - * @param int $attendee_id - * @return mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/virtual-check-in', + summary: 'Perform virtual check-in', + description: 'Performs virtual check-in for a specific attendee', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Virtual check-in completed successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendee') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + ] + )] public function doVirtualCheckin($summit_id, $attendee_id) { return $this->processRequest(function() use($summit_id, $attendee_id){ @@ -1060,11 +1322,28 @@ public function doVirtualCheckin($summit_id, $attendee_id) }); } - /** - * @param $summit_id - * @param $attendee_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/me', + summary: 'Get related attendee for current user', + description: 'Returns attendee information if current user owns the tickets or is the attendee', + security: [['bearer' => []]], + tags: ['attendees'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendee') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or attendee not found'), + ] + )] public function getMyRelatedAttendee($summit_id, $attendee_id) { return $this->processRequest(function() use($summit_id, $attendee_id){ @@ -1117,4 +1396,4 @@ public function getMyRelatedAttendee($summit_id, $attendee_id) }); } -} \ No newline at end of file +} diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index 2d2860b2a..0692aee7f 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -57,10 +57,24 @@ class SummitBadgeTypeUpdateRequest { } -// - // Summit Badge Feature Types +#[OA\Schema( + schema: 'SummitBadgeFeatureType', + type: 'object', + properties: [ + new OA\Property(property: 'id', type: 'integer', example: 1), + new OA\Property(property: 'name', type: 'string', example: 'Speaker Ribbon'), + new OA\Property(property: 'description', type: 'string', nullable: true, example: 'Special ribbon indicating speaker status'), + new OA\Property(property: 'template_content', type: 'string', nullable: true, example: '
{{name}}
'), + new OA\Property(property: 'summit_id', type: 'integer', example: 42), + new OA\Property(property: 'image', type: 'string', nullable: true, example: 'https://example.com/images/speaker-ribbon.png'), + ] +)] +class SummitBadgeFeatureTypeSchema +{ +} + #[OA\Schema( schema: 'PaginatedSummitBadgeFeatureTypesResponse', allOf: [ @@ -77,7 +91,9 @@ class SummitBadgeTypeUpdateRequest ) ] )] -class PaginatedSummitBadgeFeatureTypesResponseSchema {} +class PaginatedSummitBadgeFeatureTypesResponseSchema +{ +} #[OA\Schema( schema: 'SummitBadgeFeatureTypeCreateRequest', @@ -89,7 +105,9 @@ class PaginatedSummitBadgeFeatureTypesResponseSchema {} new OA\Property(property: 'template_content', type: 'string', example: '
{{name}}
'), ] )] -class SummitBadgeFeatureTypeCreateRequestSchema {} +class SummitBadgeFeatureTypeCreateRequestSchema +{ +} #[OA\Schema( schema: 'SummitBadgeFeatureTypeUpdateRequest', @@ -100,4 +118,6 @@ class SummitBadgeFeatureTypeCreateRequestSchema {} new OA\Property(property: 'template_content', type: 'string', example: '
{{name}}
'), ] )] -class SummitBadgeFeatureTypeUpdateRequestSchema {} +class SummitBadgeFeatureTypeUpdateRequestSchema +{ +} From db4ebd4a15303332f663ae8b87005ab4aee05f0b Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 3 Dec 2025 22:51:54 +0000 Subject: [PATCH 2/7] feat: Add changes requested in previous PRs --- .../OAuth2SummitAttendeesApiController.php | 347 ++++++++++++++---- app/Http/Controllers/JsonController.php | 7 +- .../Security/SummitAttendeesAuthSchema.php | 29 ++ 3 files changed, 310 insertions(+), 73 deletions(-) create mode 100644 app/Swagger/Security/SummitAttendeesAuthSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php index 973e5197c..990d82033 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php @@ -21,8 +21,10 @@ use App\Jobs\Emails\SummitAttendeeRegistrationIncompleteReminderEmail; use App\Jobs\Emails\SummitAttendeeTicketRegenerateHashEmail; use App\Jobs\SynchAllAttendeesStatus; +use App\Models\Foundation\Main\IGroup; use App\ModelSerializers\SerializerUtils; use App\Rules\Boolean; +use App\Security\SummitScopes; use App\Services\Model\IAttendeeService; use App\Services\Model\ISummitOrderService; use Exception; @@ -145,13 +147,17 @@ public function __construct */ #[OA\Get( - path: '/api/v1/summits/{summit_id}/attendees/me', + path: '/api/v1/summits/{id}/attendees/me', + operationId: 'getCurrentAttendee', summary: 'Get current user attendee profile', description: 'Returns the attendee profile for the currently authenticated user in the specified summit', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (extra_questions, tickets, presentation_votes, ticket_types, allowed_access_levels, allowed_features, tags)', schema: new OA\Schema(type: 'string')), ], responses: [ @@ -189,13 +195,25 @@ public function getOwnAttendee($summit_id) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}', + operationId: 'getAttendee', summary: 'Get attendee by ID', description: 'Returns a specific attendee profile from the summit', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), ], @@ -236,13 +254,17 @@ public function getAttendee($summit_id, $attendee_id) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/schedule', + operationId: 'getAttendeeSchedule', summary: 'Get attendee schedule', description: 'Returns the personal schedule for a specific attendee', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -285,13 +307,16 @@ public function getAttendeeSchedule($summit_id, $attendee_id) } #[OA\Post( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule/{event_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/schedule/{event_id}', + operationId: 'addEventToAttendeeSchedule', summary: 'Add event to attendee schedule', description: 'Adds an event to the attendee\'s personal schedule', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -331,13 +356,16 @@ public function addEventToAttendeeSchedule($summit_id, $attendee_id, $event_id) } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule/{event_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/schedule/{event_id}', + operationId: 'removeEventFromAttendeeSchedule', summary: 'Remove event from attendee schedule', description: 'Removes an event from the attendee\'s personal schedule', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -378,13 +406,17 @@ public function removeEventFromAttendeeSchedule($summit_id, $attendee_id, $event } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/schedule/{event_id}/rsvp', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/schedule/{event_id}/rsvp', + operationId: 'deleteAttendeeEventRsvp', summary: 'Delete RSVP for event', description: 'Deletes the attendee\'s RSVP for a specific event', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::DeleteMyRSVP, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -430,14 +462,49 @@ public function deleteEventRSVP($summit_id, $attendee_id, $event_id) } } + #[OA\Put( + path: '/api/v1/summits/{id}/attendees/{attendee_id}/schedule/{event_id}/check-in', + operationId: 'checkInAttendeeToEvent', + summary: 'Check-in attendee to event', + description: 'Performs check-in for an attendee at a specific event on their schedule', + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + ]]], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID or "me"', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NOT_IMPLEMENTED, description: 'Not Implemented'), + ] + )] + public function checkingAttendeeOnEvent($id, $attendee_id, $event_id) + { + return $this->error501(); + } + #[OA\Get( - path: '/api/v1/summits/{summit_id}/attendees', + path: '/api/v1/summits/{id}/attendees', + operationId: 'getAllAttendees', summary: 'Get all attendees for a summit', description: 'Returns a paginated list of attendees for the specified summit with filtering, sorting and search capabilities', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10, maximum: 100)), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by id, first_name, last_name, full_name, company, email, member_id, ticket_type, badge_type, status, has_member, has_tickets, etc.', schema: new OA\Schema(type: 'string')), @@ -598,10 +665,42 @@ function () { ); } - /** - * @param $summit_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{id}/attendees/csv', + operationId: 'getAllAttendeesCSV', + summary: 'Export attendees to CSV', + description: 'Returns a CSV file with all attendees for the specified summit', + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ]]], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by id, first_name, last_name, full_name, company, email, member_id, ticket_type, badge_type, status, has_member, has_tickets, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by first_name, last_name, email, company, id, status, etc.', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'CSV file with attendees data', + content: new OA\MediaType( + mediaType: 'text/csv', + schema: new OA\Schema(type: 'string', format: 'binary') + ) + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getAttendeesBySummitCSV($summit_id) { @@ -720,13 +819,25 @@ function () { } #[OA\Post( - path: '/api/v1/summits/{summit_id}/attendees', + path: '/api/v1/summits/{id}/attendees', + operationId: 'createAttendee', summary: 'Create a new attendee', description: 'Creates a new attendee for the specified summit', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), ], requestBody: new OA\RequestBody( required: true, @@ -799,13 +910,25 @@ public function addAttendee($summit_id) } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}', + operationId: 'deleteAttendee', summary: 'Delete an attendee', description: 'Deletes a specific attendee from the summit', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -832,13 +955,25 @@ public function deleteAttendee($summit_id, $attendee_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}', + operationId: 'updateAttendee', summary: 'Update an attendee', description: 'Updates a specific attendee in the summit', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -915,13 +1050,25 @@ public function updateAttendee($summit_id, $attendee_id) } #[OA\Post( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/tickets', + operationId: 'addAttendeeTicket', summary: 'Add ticket to attendee', description: 'Creates a new ticket for a specific attendee', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -992,13 +1139,25 @@ public function addAttendeeTicket($summit_id, $attendee_id) } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets/{ticket_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/tickets/{ticket_id}', + operationId: 'deleteAttendeeTicket', summary: 'Delete attendee ticket', description: 'Deletes a specific ticket from an attendee', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], @@ -1025,13 +1184,25 @@ public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets/{ticket_id}/reassign/member/{other_member_id}', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/tickets/{ticket_id}/reassign/{other_member_id}', + operationId: 'reassignAttendeeTicketByMember', summary: 'Reassign ticket to another member', description: 'Reassigns a ticket from one attendee to another member', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'other_member_id', in: 'path', required: true, description: 'Target Member ID', schema: new OA\Schema(type: 'integer')), @@ -1072,13 +1243,25 @@ public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket } #[OA\Put( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/tickets/{ticket_id}/reassign', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/tickets/{ticket_id}/reassign', + operationId: 'reassignAttendeeTicket', summary: 'Reassign ticket to another attendee', description: 'Reassigns a ticket to a different attendee by email', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], @@ -1135,13 +1318,25 @@ protected function getSummitRepository(): ISummitRepository } #[OA\Post( - path: '/api/v1/summits/{summit_id}/attendees/send', + path: '/api/v1/summits/{id}/attendees/all/send', + operationId: 'sendAttendeesEmail', summary: 'Send email to attendees', description: 'Sends email notifications to filtered attendees', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ] + ], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter attendees', schema: new OA\Schema(type: 'string')), ], requestBody: new OA\RequestBody( @@ -1283,13 +1478,17 @@ public function send($summit_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/virtual-check-in', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/virtual-check-in', + operationId: 'doAttendeeVirtualCheckIn', summary: 'Perform virtual check-in', description: 'Performs virtual check-in for a specific attendee', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::DoVirtualCheckIn, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -1323,13 +1522,17 @@ public function doVirtualCheckin($summit_id, $attendee_id) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/attendees/{attendee_id}/me', + path: '/api/v1/summits/{id}/attendees/{attendee_id}/me', + operationId: 'getMyRelatedAttendee', summary: 'Get related attendee for current user', description: 'Returns attendee information if current user owns the tickets or is the attendee', - security: [['bearer' => []]], - tags: ['attendees'], + tags: ['Summit Attendees'], + security: [['summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ]]], parameters: [ - new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), ], diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index 386753eae..2b41aa6b0 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -34,6 +34,11 @@ protected function error500(Exception $ex) return Response::json(array('message' => 'server error'), 500); } + protected function error501() + { + return Response::json(array('message' => 'not implemented'), 501); + } + protected function created($data = 'ok') { @@ -215,4 +220,4 @@ protected function pdf(string $filename, string $content){ return Response::make($content, 200, $headers); } -} \ No newline at end of file +} diff --git a/app/Swagger/Security/SummitAttendeesAuthSchema.php b/app/Swagger/Security/SummitAttendeesAuthSchema.php new file mode 100644 index 000000000..d60dd6349 --- /dev/null +++ b/app/Swagger/Security/SummitAttendeesAuthSchema.php @@ -0,0 +1,29 @@ + 'Read Summit Data', + SummitScopes::ReadAllSummitData => 'Read All Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteAttendeesData => 'Write Attendees Data', + SummitScopes::DoVirtualCheckIn => 'Do Virtual Check-In', + SummitScopes::DeleteMyRSVP => 'Delete My RSVP', + ], + ), + ], + ) +] +class SummitAttendeesAuthSchema {} From 6579d4e1678f172ae1a9bba426bd5e2c984b65c9 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 3 Dec 2025 22:53:05 +0000 Subject: [PATCH 3/7] fix: incorrect description for summit ID --- .../OAuth2SummitAttendeesApiController.php | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php index 990d82033..681de9c6f 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php @@ -157,7 +157,7 @@ public function __construct SummitScopes::ReadAllSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (extra_questions, tickets, presentation_votes, ticket_types, allowed_access_levels, allowed_features, tags)', schema: new OA\Schema(type: 'string')), ], responses: [ @@ -213,7 +213,7 @@ public function getOwnAttendee($summit_id) SummitScopes::ReadAllSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), ], @@ -264,7 +264,7 @@ public function getAttendee($summit_id, $attendee_id) SummitScopes::ReadAllSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -316,7 +316,7 @@ public function getAttendeeSchedule($summit_id, $attendee_id) SummitScopes::WriteSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -365,7 +365,7 @@ public function addEventToAttendeeSchedule($summit_id, $attendee_id, $event_id) SummitScopes::WriteSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -416,7 +416,7 @@ public function removeEventFromAttendeeSchedule($summit_id, $attendee_id, $event SummitScopes::DeleteMyRSVP, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -472,7 +472,7 @@ public function deleteEventRSVP($summit_id, $attendee_id, $event_id) SummitScopes::WriteSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID or "me"', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'event_id', in: 'path', required: true, description: 'Event ID', schema: new OA\Schema(type: 'integer')), ], @@ -504,7 +504,7 @@ public function checkingAttendeeOnEvent($id, $attendee_id, $event_id) SummitScopes::ReadAllSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10, maximum: 100)), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by id, first_name, last_name, full_name, company, email, member_id, ticket_type, badge_type, status, has_member, has_tickets, etc.', schema: new OA\Schema(type: 'string')), @@ -684,7 +684,7 @@ function () { SummitScopes::ReadAllSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by id, first_name, last_name, full_name, company, email, member_id, ticket_type, badge_type, status, has_member, has_tickets, etc.', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by first_name, last_name, email, company, id, status, etc.', schema: new OA\Schema(type: 'string')), ], @@ -837,7 +837,7 @@ function () { SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), ], requestBody: new OA\RequestBody( required: true, @@ -928,7 +928,7 @@ public function addAttendee($summit_id) SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -973,7 +973,7 @@ public function deleteAttendee($summit_id, $attendee_id) SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -1068,7 +1068,7 @@ public function updateAttendee($summit_id, $attendee_id) SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -1157,7 +1157,7 @@ public function addAttendeeTicket($summit_id, $attendee_id) SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], @@ -1202,7 +1202,7 @@ public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'other_member_id', in: 'path', required: true, description: 'Target Member ID', schema: new OA\Schema(type: 'integer')), @@ -1261,7 +1261,7 @@ public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], @@ -1336,7 +1336,7 @@ protected function getSummitRepository(): ISummitRepository SummitScopes::WriteAttendeesData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter attendees', schema: new OA\Schema(type: 'string')), ], requestBody: new OA\RequestBody( @@ -1488,7 +1488,7 @@ public function send($summit_id) SummitScopes::DoVirtualCheckIn, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -1532,7 +1532,7 @@ public function doVirtualCheckin($summit_id, $attendee_id) SummitScopes::ReadAllSummitData, ]]], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), ], From 6cf173142802f695216c01f3ff47d8627ddf101f Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 3 Dec 2025 23:02:26 +0000 Subject: [PATCH 4/7] fix: schemas names and fields --- app/Swagger/Models/SummitAttendeeSchema.php | 49 +++++++++++++++++++++ app/Swagger/SummitRegistrationSchemas.php | 2 - app/Swagger/schemas.php | 19 +------- 3 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 app/Swagger/Models/SummitAttendeeSchema.php diff --git a/app/Swagger/Models/SummitAttendeeSchema.php b/app/Swagger/Models/SummitAttendeeSchema.php new file mode 100644 index 000000000..78e8e95cb --- /dev/null +++ b/app/Swagger/Models/SummitAttendeeSchema.php @@ -0,0 +1,49 @@ + Date: Thu, 4 Dec 2025 17:47:59 +0000 Subject: [PATCH 5/7] feat: Add changes requested in PR --- .../Security/SummitAttendeesAuthSchema.php | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/app/Swagger/Security/SummitAttendeesAuthSchema.php b/app/Swagger/Security/SummitAttendeesAuthSchema.php index d60dd6349..82711cdff 100644 --- a/app/Swagger/Security/SummitAttendeesAuthSchema.php +++ b/app/Swagger/Security/SummitAttendeesAuthSchema.php @@ -1,29 +1,31 @@ 'Read Summit Data', - SummitScopes::ReadAllSummitData => 'Read All Summit Data', - SummitScopes::WriteSummitData => 'Write Summit Data', - SummitScopes::WriteAttendeesData => 'Write Attendees Data', - SummitScopes::DoVirtualCheckIn => 'Do Virtual Check-In', - SummitScopes::DeleteMyRSVP => 'Delete My RSVP', - ], - ), - ], - ) + type: 'oauth2', + securityScheme: 'summit_attendees_oauth2', + flows: [ + new OA\Flow( + authorizationUrl: L5_SWAGGER_CONST_AUTH_URL, + tokenUrl: L5_SWAGGER_CONST_TOKEN_URL, + flow: 'authorizationCode', + scopes: [ + SummitScopes::ReadSummitData => 'Read Summit Data', + SummitScopes::ReadAllSummitData => 'Read All Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteAttendeesData => 'Write Attendees Data', + SummitScopes::DoVirtualCheckIn => 'Do Virtual Check-In', + SummitScopes::DeleteMyRSVP => 'Delete My RSVP', + ], + ), + ], +) ] -class SummitAttendeesAuthSchema {} +class SummitAttendeesAuthSchema +{ +} \ No newline at end of file From d823c38a6c4fd4e5f20b514061c823512c4e9d60 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 17 Dec 2025 21:34:34 +0000 Subject: [PATCH 6/7] fix: issues on rebase --- app/Swagger/SummitRegistrationSchemas.php | 145 +++++++++++++++++++--- 1 file changed, 126 insertions(+), 19 deletions(-) diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index be7090439..c860c7fc8 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -4,6 +4,129 @@ use OpenApi\Attributes as OA; +#[OA\Schema( + schema: 'PaginatedSummitAttendeesResponse', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/SummitAttendee') + ) + ] + ) + ] +)] +class PaginatedSummitAttendeesResponseSchema +{ +} + +#[OA\Schema( + schema: 'AttendeeRequest', + type: 'object', + properties: [ + new OA\Property(property: 'shared_contact_info', type: 'boolean'), + new OA\Property(property: 'summit_hall_checked_in', type: 'boolean'), + new OA\Property(property: 'disclaimer_accepted', type: 'boolean'), + new OA\Property(property: 'first_name', type: 'string', maxLength: 255), + new OA\Property(property: 'surname', type: 'string', maxLength: 255), + new OA\Property(property: 'company', type: 'string', maxLength: 255), + new OA\Property(property: 'email', type: 'string', maxLength: 255), + new OA\Property(property: 'member_id', type: 'integer'), + new OA\Property(property: 'admin_notes', type: 'string', maxLength: 1024), + new OA\Property(property: 'tags', type: 'array', items: new OA\Items(type: 'string')), + new OA\Property(property: 'manager_id', type: 'integer'), + new OA\Property( + property: 'extra_questions', + type: 'array', + items: new OA\Items( + type: 'object', + properties: [ + new OA\Property(property: 'question_id', type: 'integer'), + new OA\Property(property: 'answer', type: 'string') + ] + ) + ), + ] +)] +class AttendeeRequestSchema +{ +} + +#[OA\Schema( + schema: 'AddAttendeeTicketRequest', + type: 'object', + required: ['ticket_type_id'], + properties: [ + new OA\Property(property: 'ticket_type_id', type: 'integer'), + new OA\Property(property: 'promo_code', type: 'string'), + new OA\Property(property: 'external_order_id', type: 'string'), + new OA\Property(property: 'external_attendee_id', type: 'string'), + ] +)] +class AddAttendeeTicketRequestSchema +{ +} + +#[OA\Schema( + schema: 'ReassignAttendeeTicketRequest', + type: 'object', + required: ['attendee_email'], + properties: [ + new OA\Property(property: 'attendee_first_name', type: 'string', maxLength: 255), + new OA\Property(property: 'attendee_last_name', type: 'string', maxLength: 255), + new OA\Property(property: 'attendee_email', type: 'string', maxLength: 255), + new OA\Property(property: 'attendee_company', type: 'string', maxLength: 255), + new OA\Property( + property: 'extra_questions', + type: 'array', + items: new OA\Items( + type: 'object', + properties: [ + new OA\Property(property: 'question_id', type: 'integer'), + new OA\Property(property: 'answer', type: 'string') + ] + ) + ), + ] +)] +class ReassignAttendeeTicketRequestSchema +{ +} + +#[OA\Schema( + schema: 'SendAttendeesEmailRequest', + type: 'object', + required: ['email_flow_event'], + properties: [ + new OA\Property( + property: 'email_flow_event', + type: 'string', + enum: ['SUMMIT_ATTENDEE_TICKET_REGENERATE_HASH', 'SUMMIT_ATTENDEE_INVITE_TICKET_EDITION', 'SUMMIT_ATTENDEE_ALL_TICKETS_EDITION', 'SUMMIT_ATTENDEE_REGISTRATION_INCOMPLETE_REMINDER', 'SUMMIT_ATTENDEE_GENERIC'] + ), + new OA\Property( + property: 'attendees_ids', + type: 'array', + items: new OA\Items(type: 'integer') + ), + new OA\Property( + property: 'excluded_attendees_ids', + type: 'array', + items: new OA\Items(type: 'integer') + ), + new OA\Property(property: 'test_email_recipient', type: 'string', format: 'email'), + new OA\Property(property: 'outcome_email_recipient', type: 'string', format: 'email'), + ] +)] +class SendAttendeesEmailRequestSchema +{ +} + +// Summit Badge Types + #[OA\Schema( schema: "PaginatedSummitBadgeTypesResponse", description: "Paginated list of summit badge types", @@ -20,7 +143,7 @@ ) ] )] -class PaginatedSummitBadgeTypesResponse +class PaginatedSummitBadgeTypesResponseSchema { } @@ -36,7 +159,7 @@ class PaginatedSummitBadgeTypesResponse new OA\Property(property: "is_default", type: "boolean", example: false), ] )] -class SummitBadgeTypeCreateRequest +class SummitBadgeTypeCreateRequestSchema { } @@ -51,28 +174,12 @@ class SummitBadgeTypeCreateRequest new OA\Property(property: "is_default", type: "boolean", nullable: true, example: false), ] )] -class SummitBadgeTypeUpdateRequest +class SummitBadgeTypeUpdateRequestSchema { } // Summit Badge Feature Types -#[OA\Schema( - schema: 'SummitBadgeFeatureType', - type: 'object', - properties: [ - new OA\Property(property: 'id', type: 'integer', example: 1), - new OA\Property(property: 'name', type: 'string', example: 'Speaker Ribbon'), - new OA\Property(property: 'description', type: 'string', nullable: true, example: 'Special ribbon indicating speaker status'), - new OA\Property(property: 'template_content', type: 'string', nullable: true, example: '
{{name}}
'), - new OA\Property(property: 'summit_id', type: 'integer', example: 42), - new OA\Property(property: 'image', type: 'string', nullable: true, example: 'https://example.com/images/speaker-ribbon.png'), - ] -)] -class SummitBadgeFeatureTypeSchema -{ -} - #[OA\Schema( schema: 'PaginatedSummitBadgeFeatureTypesResponse', allOf: [ From 0da6489ecb5fd5655d60d04a753bf1f7a6101c66 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 18 Dec 2025 20:20:51 +0000 Subject: [PATCH 7/7] fix: incorrect path definition --- .../OAuth2SummitAttendeesApiController.php | 464 +++++++++++------- 1 file changed, 288 insertions(+), 176 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php index 681de9c6f..5a1c84107 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitAttendeesApiController.php @@ -1,4 +1,5 @@ -summit_repository = $summit_repository; $this->repository = $attendee_repository; @@ -152,10 +152,14 @@ public function __construct summary: 'Get current user attendee profile', description: 'Returns the attendee profile for the currently authenticated user in the specified summit', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::ReadSummitData, - SummitScopes::ReadAllSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships (extra_questions, tickets, presentation_votes, ticket_types, allowed_access_levels, allowed_features, tags)', schema: new OA\Schema(type: 'string')), @@ -175,11 +179,13 @@ public function getOwnAttendee($summit_id) try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $type = CheckAttendeeStrategyFactory::Me; $attendee = CheckAttendeeStrategyFactory::build($type, $this->resource_server_context)->check('me', $summit); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); return $this->ok(SerializerRegistry::getInstance()->getSerializer($attendee)->serialize( SerializerUtils::getExpand(), SerializerUtils::getFields(), @@ -208,10 +214,14 @@ public function getOwnAttendee($summit_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::ReadSummitData, - SummitScopes::ReadAllSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -229,12 +239,14 @@ public function getOwnAttendee($summit_id) )] public function getAttendee($summit_id, $attendee_id) { - return $this->processRequest(function() use($summit_id, $attendee_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); return $this->ok ( @@ -243,12 +255,12 @@ public function getAttendee($summit_id, $attendee_id) $attendee, SerializerRegistry::SerializerType_Private )->serialize - ( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations(), - ['serializer_type' => SerializerRegistry::SerializerType_Private] - ) + ( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations(), + ['serializer_type' => SerializerRegistry::SerializerType_Private] + ) ); }); } @@ -259,10 +271,14 @@ public function getAttendee($summit_id, $attendee_id) summary: 'Get attendee schedule', description: 'Returns the personal schedule for a specific attendee', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::ReadSummitData, - SummitScopes::ReadAllSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -285,14 +301,17 @@ public function getAttendeeSchedule($summit_id, $attendee_id) try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = CheckAttendeeStrategyFactory::build(CheckAttendeeStrategyFactory::Own, $this->resource_server_context)->check($attendee_id, $summit); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $schedule = []; foreach ($attendee->getSchedule() as $attendee_schedule) { - if (!$summit->isEventOnSchedule($attendee_schedule->getEvent()->getId())) continue; + if (!$summit->isEventOnSchedule($attendee_schedule->getEvent()->getId())) + continue; $schedule[] = SerializerRegistry::getInstance()->getSerializer($attendee_schedule)->serialize(); } @@ -312,9 +331,13 @@ public function getAttendeeSchedule($summit_id, $attendee_id) summary: 'Add event to attendee schedule', description: 'Adds an event to the attendee\'s personal schedule', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -332,10 +355,12 @@ public function addEventToAttendeeSchedule($summit_id, $attendee_id, $event_id) try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = CheckAttendeeStrategyFactory::build(CheckAttendeeStrategyFactory::Own, $this->resource_server_context)->check($attendee_id, $summit); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $this->summit_service->addEventToMemberSchedule($summit, $attendee->getMember(), intval($event_id)); @@ -361,9 +386,13 @@ public function addEventToAttendeeSchedule($summit_id, $attendee_id, $event_id) summary: 'Remove event from attendee schedule', description: 'Removes an event from the attendee\'s personal schedule', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -381,10 +410,12 @@ public function removeEventFromAttendeeSchedule($summit_id, $attendee_id, $event try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = CheckAttendeeStrategyFactory::build(CheckAttendeeStrategyFactory::Own, $this->resource_server_context)->check($attendee_id, $summit); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $this->summit_service->removeEventFromMemberSchedule($summit, $attendee->getMember(), intval($event_id)); @@ -411,10 +442,14 @@ public function removeEventFromAttendeeSchedule($summit_id, $attendee_id, $event summary: 'Delete RSVP for event', description: 'Deletes the attendee\'s RSVP for a specific event', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::DeleteMyRSVP, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::DeleteMyRSVP, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -432,7 +467,8 @@ public function deleteEventRSVP($summit_id, $attendee_id, $event_id) try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $event = $summit->getScheduleEvent(intval($event_id)); @@ -441,7 +477,8 @@ public function deleteEventRSVP($summit_id, $attendee_id, $event_id) } $attendee = CheckAttendeeStrategyFactory::build(CheckAttendeeStrategyFactory::Own, $this->resource_server_context)->check($attendee_id, $summit); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $this->summit_service->unRSVPEvent($summit, $attendee->getMember(), $event_id); @@ -468,9 +505,13 @@ public function deleteEventRSVP($summit_id, $attendee_id, $event_id) summary: 'Check-in attendee to event', description: 'Performs check-in for an attendee at a specific event on their schedule', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID or "me"', schema: new OA\Schema(type: 'string')), @@ -499,10 +540,14 @@ public function checkingAttendeeOnEvent($id, $attendee_id, $event_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::ReadSummitData, - SummitScopes::ReadAllSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), @@ -526,11 +571,12 @@ public function getAttendeesBySummit($summit_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $filter = null; - $filterRules = [ + $filterRules = [ 'id' => ['=='], 'not_id' => ['=='], 'first_name' => ['=@', '=='], @@ -559,7 +605,7 @@ public function getAttendeesBySummit($summit_id) 'presentation_votes_date' => ['==', '>=', '<=', '>', '<'], 'presentation_votes_count' => ['==', '>=', '<=', '>', '<'], 'presentation_votes_track_group_id' => ['=='], - 'summit_hall_checked_in_date' => ['==', '>=', '<=', '>', '<','[]'], + 'summit_hall_checked_in_date' => ['==', '>=', '<=', '>', '<', '[]'], 'tags' => ['=@', '==', '@@'], 'tags_id' => ['=='], 'notes' => ['=@', '@@'], @@ -571,11 +617,12 @@ public function getAttendeesBySummit($summit_id) $filter = FilterParser::parse(Request::get('filter'), $filterRules); } - if (is_null($filter)) $filter = new Filter(); + if (is_null($filter)) + $filter = new Filter(); - $params = []; + $params = []; - if(!is_null($filter)) { + if (!is_null($filter)) { $votingDateFilter = $filter->getFilter('presentation_votes_date'); if ($votingDateFilter != null) { $params['begin_attendee_voting_period_date'] = $votingDateFilter[0]->getValue(); @@ -590,7 +637,7 @@ public function getAttendeesBySummit($summit_id) } return $this->_getAll( - function () use($filterRules){ + function () use ($filterRules) { return $filterRules; }, function () { @@ -612,16 +659,16 @@ function () { 'access_levels' => 'sometimes|string', 'status' => 'sometimes|string', 'has_member' => 'sometimes|required|string|in:true,false', - 'has_tickets'=> 'sometimes|required|string|in:true,false', - 'has_virtual_checkin'=> 'sometimes|required|string|in:true,false', - 'has_checkin'=> 'sometimes|required|string|in:true,false', + 'has_tickets' => 'sometimes|required|string|in:true,false', + 'has_virtual_checkin' => 'sometimes|required|string|in:true,false', + 'has_checkin' => 'sometimes|required|string|in:true,false', 'tickets_count' => 'sometimes|integer', 'presentation_votes_date' => 'sometimes|date_format:U|epoch_seconds', 'presentation_votes_count' => 'sometimes|integer', 'presentation_votes_track_group_id' => 'sometimes|integer', 'ticket_type_id' => 'sometimes|integer', 'badge_type_id' => 'sometimes|integer', - 'features_id'=> 'sometimes|integer', + 'features_id' => 'sometimes|integer', 'access_levels_id' => 'sometimes|integer', 'summit_hall_checked_in_date' => 'sometimes|date_format:U|epoch_seconds', 'tags' => 'sometimes|string', @@ -679,10 +726,14 @@ function () { IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::ReadSummitData, - SummitScopes::ReadAllSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by id, first_name, last_name, full_name, company, email, member_id, ticket_type, badge_type, status, has_member, has_tickets, etc.', schema: new OA\Schema(type: 'string')), @@ -705,7 +756,8 @@ public function getAttendeesBySummitCSV($summit_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); return $this->_getAllCSV( function () { @@ -735,7 +787,7 @@ function () { 'features_id' => ['=='], 'access_levels' => ['=@', '==', '@@'], 'access_levels_id' => ['=='], - 'summit_hall_checked_in_date' => ['==', '>=', '<=', '>', '<', '[]'], + 'summit_hall_checked_in_date' => ['==', '>=', '<=', '>', '<', '[]'], 'tags' => ['=@', '==', '@@'], 'tags_id' => ['=='], 'notes' => ['=@', '@@'], @@ -768,7 +820,7 @@ function () { 'access_levels' => 'sometimes|string', 'ticket_type_id' => 'sometimes|integer', 'badge_type_id' => 'sometimes|integer', - 'features_id'=> 'sometimes|integer', + 'features_id' => 'sometimes|integer', 'access_levels_id' => 'sometimes|integer', 'summit_hall_checked_in_date' => 'sometimes|date_format:U|epoch_seconds', 'tags' => 'sometimes|string', @@ -832,10 +884,14 @@ function () { IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), ], @@ -857,12 +913,14 @@ function () { )] public function addAttendee($summit_id) { - return $this->processRequest(function() use($summit_id){ - if (!Request::isJson()) return $this->error400(); + return $this->processRequest(function () use ($summit_id) { + if (!Request::isJson()) + return $this->error400(); $data = Request::json(); $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $rules = [ 'shared_contact_info' => 'sometimes|boolean', @@ -899,12 +957,12 @@ public function addAttendee($summit_id) $attendee, SerializerRegistry::SerializerType_Private )->serialize - ( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations(), - ['serializer_type' => SerializerRegistry::SerializerType_Private] - ) + ( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations(), + ['serializer_type' => SerializerRegistry::SerializerType_Private] + ) ); }); } @@ -923,10 +981,14 @@ public function addAttendee($summit_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -939,13 +1001,15 @@ public function addAttendee($summit_id) )] public function deleteAttendee($summit_id, $attendee_id) { - return $this->processRequest(function() use($summit_id, $attendee_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $this->attendee_service->deleteAttendee($summit, $attendee->getIdentifier()); @@ -968,10 +1032,14 @@ public function deleteAttendee($summit_id, $attendee_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -994,15 +1062,18 @@ public function deleteAttendee($summit_id, $attendee_id) )] public function updateAttendee($summit_id, $attendee_id) { - return $this->processRequest(function() use($summit_id, $attendee_id){ - if (!Request::isJson()) return $this->error400(); + return $this->processRequest(function () use ($summit_id, $attendee_id) { + if (!Request::isJson()) + return $this->error400(); $data = Request::json(); $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $rules = [ 'shared_contact_info' => 'sometimes|boolean', @@ -1039,12 +1110,12 @@ public function updateAttendee($summit_id, $attendee_id) $attendee, SerializerRegistry::SerializerType_Private )->serialize - ( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations(), - ['serializer_type' => SerializerRegistry::SerializerType_Private] - ) + ( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations(), + ['serializer_type' => SerializerRegistry::SerializerType_Private] + ) ); }); } @@ -1063,10 +1134,14 @@ public function updateAttendee($summit_id, $attendee_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -1089,15 +1164,18 @@ public function updateAttendee($summit_id, $attendee_id) )] public function addAttendeeTicket($summit_id, $attendee_id) { - return $this->processRequest(function() use($summit_id, $attendee_id){ - if (!Request::isJson()) return $this->error400(); + return $this->processRequest(function () use ($summit_id, $attendee_id) { + if (!Request::isJson()) + return $this->error400(); $data = Request::json(); $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee) || !$attendee instanceof SummitAttendee) return $this->error404(); + if (is_null($attendee) || !$attendee instanceof SummitAttendee) + return $this->error404(); $rules = [ 'ticket_type_id' => 'required|integer', @@ -1152,10 +1230,14 @@ public function addAttendeeTicket($summit_id, $attendee_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -1169,13 +1251,15 @@ public function addAttendeeTicket($summit_id, $attendee_id) )] public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) { - return $this->processRequest(function() use($summit_id, $attendee_id, $ticket_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id, $ticket_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $this->attendee_service->deleteAttendeeTicket($attendee, $ticket_id); @@ -1197,10 +1281,14 @@ public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -1219,17 +1307,20 @@ public function deleteAttendeeTicket($summit_id, $attendee_id, $ticket_id) )] public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket_id, $other_member_id) { - return $this->processRequest(function() use($summit_id, $attendee_id, $ticket_id, $other_member_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id, $ticket_id, $other_member_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee) || !$attendee instanceof SummitAttendee) return $this->error404(); + if (is_null($attendee) || !$attendee instanceof SummitAttendee) + return $this->error404(); $other_member = $this->member_repository->getById($other_member_id); - if (is_null($other_member) || !$other_member instanceof Member) return $this->error404(); + if (is_null($other_member) || !$other_member instanceof Member) + return $this->error404(); $ticket = $this->attendee_service->reassignAttendeeTicketByMember($summit, $attendee, $other_member, intval($ticket_id)); @@ -1256,10 +1347,14 @@ public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -1282,13 +1377,15 @@ public function reassignAttendeeTicketByMember($summit_id, $attendee_id, $ticket )] public function reassignAttendeeTicket($summit_id, $attendee_id, $ticket_id) { - return $this->processRequest(function() use($summit_id, $attendee_id, $ticket_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id, $ticket_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee) || !$attendee instanceof SummitAttendee) return $this->error404(); + if (is_null($attendee) || !$attendee instanceof SummitAttendee) + return $this->error404(); $payload = $this->getJsonPayload([ 'attendee_first_name' => 'nullable|string|max:255', @@ -1317,7 +1414,7 @@ protected function getSummitRepository(): ISummitRepository return $this->summit_repository; } - #[OA\Post( + #[OA\Put( path: '/api/v1/summits/{id}/attendees/all/send', operationId: 'sendAttendeesEmail', summary: 'Send email to attendees', @@ -1331,10 +1428,14 @@ protected function getSummitRepository(): ISummitRepository IGroup::SummitRegistrationAdmins, ] ], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteAttendeesData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteAttendeesData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter attendees', schema: new OA\Schema(type: 'string')), @@ -1353,7 +1454,7 @@ protected function getSummitRepository(): ISummitRepository )] public function send($summit_id) { - return $this->processRequest(function() use($summit_id){ + return $this->processRequest(function () use ($summit_id) { if (!Request::isJson()) return $this->error400(); @@ -1368,15 +1469,15 @@ public function send($summit_id) // Creates a Validator instance and validates the data. $validation = Validator::make($payload, [ 'email_flow_event' => 'required|string|in:' . join(',', [ - SummitAttendeeTicketRegenerateHashEmail::EVENT_SLUG, - InviteAttendeeTicketEditionMail::EVENT_SLUG, - SummitAttendeeAllTicketsEditionEmail::EVENT_SLUG, - SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG, - GenericSummitAttendeeEmail::EVENT_SLUG, - ]), + SummitAttendeeTicketRegenerateHashEmail::EVENT_SLUG, + InviteAttendeeTicketEditionMail::EVENT_SLUG, + SummitAttendeeAllTicketsEditionEmail::EVENT_SLUG, + SummitAttendeeRegistrationIncompleteReminderEmail::EVENT_SLUG, + GenericSummitAttendeeEmail::EVENT_SLUG, + ]), 'attendees_ids' => 'sometimes|int_array', - 'excluded_attendees_ids' => 'sometimes|int_array', - 'test_email_recipient' => 'sometimes|email', + 'excluded_attendees_ids' => 'sometimes|int_array', + 'test_email_recipient' => 'sometimes|email', 'outcome_email_recipient' => 'sometimes|email', ]); @@ -1421,7 +1522,7 @@ public function send($summit_id) 'presentation_votes_date' => ['==', '>=', '<=', '>', '<'], 'presentation_votes_count' => ['==', '>=', '<=', '>', '<'], 'presentation_votes_track_group_id' => ['=='], - 'summit_hall_checked_in_date' => ['==', '>=', '<=', '>', '<','[]'], + 'summit_hall_checked_in_date' => ['==', '>=', '<=', '>', '<', '[]'], 'tags' => ['=@', '==', '@@'], 'tags_id' => ['=='], 'notes' => ['=@', '@@'], @@ -1451,16 +1552,16 @@ public function send($summit_id) 'access_levels' => 'sometimes|string', 'status' => 'sometimes|string', 'has_member' => 'sometimes|required|string|in:true,false', - 'has_tickets'=> 'sometimes|required|string|in:true,false', - 'has_virtual_checkin'=> 'sometimes|required|string|in:true,false', - 'has_checkin'=> 'sometimes|required|string|in:true,false', + 'has_tickets' => 'sometimes|required|string|in:true,false', + 'has_virtual_checkin' => 'sometimes|required|string|in:true,false', + 'has_checkin' => 'sometimes|required|string|in:true,false', 'tickets_count' => 'sometimes|integer', 'presentation_votes_date' => 'sometimes|date_format:U|epoch_seconds', 'presentation_votes_count' => 'sometimes|integer', 'presentation_votes_track_group_id' => 'sometimes|integer', 'ticket_type_id' => 'sometimes|integer', 'badge_type_id' => 'sometimes|integer', - 'features_id'=> 'sometimes|integer', + 'features_id' => 'sometimes|integer', 'access_levels_id' => 'sometimes|integer', 'summit_hall_checked_in_date' => 'sometimes|date_format:U|epoch_seconds', 'tags' => 'sometimes|string', @@ -1483,10 +1584,14 @@ public function send($summit_id) summary: 'Perform virtual check-in', description: 'Performs virtual check-in for a specific attendee', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::DoVirtualCheckIn, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::DoVirtualCheckIn, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -1503,13 +1608,15 @@ public function send($summit_id) )] public function doVirtualCheckin($summit_id, $attendee_id) { - return $this->processRequest(function() use($summit_id, $attendee_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $attendee = $this->repository->getById($attendee_id); - if (is_null($attendee)) return $this->error404(); + if (is_null($attendee)) + return $this->error404(); $attendee = $this->attendee_service->doVirtualCheckin($summit, $attendee_id); return $this->updated(SerializerRegistry::getInstance()->getSerializer($attendee)->serialize( @@ -1527,10 +1634,14 @@ public function doVirtualCheckin($summit_id, $attendee_id) summary: 'Get related attendee for current user', description: 'Returns attendee information if current user owns the tickets or is the attendee', tags: ['Summit Attendees'], - security: [['summit_attendees_oauth2' => [ - SummitScopes::ReadSummitData, - SummitScopes::ReadAllSummitData, - ]]], + security: [ + [ + 'summit_attendees_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'attendee_id', in: 'path', required: true, description: 'Attendee ID', schema: new OA\Schema(type: 'integer')), @@ -1549,7 +1660,7 @@ public function doVirtualCheckin($summit_id, $attendee_id) )] public function getMyRelatedAttendee($summit_id, $attendee_id) { - return $this->processRequest(function() use($summit_id, $attendee_id){ + return $this->processRequest(function () use ($summit_id, $attendee_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) @@ -1568,18 +1679,19 @@ public function getMyRelatedAttendee($summit_id, $attendee_id) // check ownership $isOrderOwner = false; - foreach($attendee->getTickets() as $ticket) { - if(!$ticket->isPaid() || !$ticket->isActive()) continue; + foreach ($attendee->getTickets() as $ticket) { + if (!$ticket->isPaid() || !$ticket->isActive()) + continue; $order = $ticket->getOrder(); if ($order->getOwnerEmail() === $current_user->getEmail()) $isOrderOwner = true; } $isAttendeeOwner = true; - if($attendee->getEmail() != $current_user->getEmail()) + if ($attendee->getEmail() != $current_user->getEmail()) $isAttendeeOwner = false; - if(!$isOrderOwner && !$isAttendeeOwner) + if (!$isOrderOwner && !$isAttendeeOwner) throw new EntityNotFoundException("Attendee not found."); return $this->ok @@ -1589,14 +1701,14 @@ public function getMyRelatedAttendee($summit_id, $attendee_id) $attendee, SerializerRegistry::SerializerType_Private )->serialize - ( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations(), - ['serializer_type' => SerializerRegistry::SerializerType_Private] - ) + ( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations(), + ['serializer_type' => SerializerRegistry::SerializerType_Private] + ) ); }); } -} +} \ No newline at end of file