From ff1bb890fc4ba09eb92023874737f6f5e6b74e49 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Fri, 24 Oct 2025 15:30:13 -0300 Subject: [PATCH 01/13] feat: Extend Swagger Coverage for controller `OAuth2SummitTicketApiController` --- .../OAuth2SummitTicketApiController.php | 608 +++++++++++++++--- app/Swagger/SummitRegistrationSchemas.php | 71 ++ 2 files changed, 589 insertions(+), 90 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index ccb405c34..f4cf18dcf 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -21,8 +21,10 @@ use App\Rules\Boolean; use App\Services\Model\ISummitOrderService; use Illuminate\Http\Request as LaravelRequest; +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\oauth2\IResourceServerContext; @@ -104,10 +106,65 @@ public function __construct } - /** - * @param $summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets', + summary: 'Get all tickets for a summit', + description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', + security: [['bearer' => []]], + tags: ['tickets'], + 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 number, owner_name, owner_email, status, ticket_type_id, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by id, number, status, owner_name, 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')), + new OA\Parameter(name: 'id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'not_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Filter by ticket status, allowed values: Reserved, Cancelled, Confirmed, Paid, Error'), + new OA\Parameter(name: 'number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order_number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_first_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_last_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_email', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_company', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'summit_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'owner_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'order_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'is_active', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'has_requested_refund_requests', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'access_level_type_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'access_level_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'ticket_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'view_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_owner', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'owner_status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Filter by owner status, allowed values: Complete, Incomplete'), + new OA\Parameter(name: 'has_badge', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'promo_code_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'promo_code', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'promo_code_description', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'promo_code_tag_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'promo_code_tag', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'numeric')), + new OA\Parameter(name: 'is_printable', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'badge_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_badge_prints', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'badge_prints_count', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_owner_company', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'exclude_is_printable_free_unassigned', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitAttendeeTicketsResponse') + ), + 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 getAllBySummit($summit_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id); @@ -228,10 +285,28 @@ function () { }); } - /** - * @param $summit_id - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/external', + summary: 'Get external ticket data', + description: 'Returns ticket data from external registration feed by owner email', + security: [['bearer' => []]], + tags: ['tickets'], + 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: true, description: 'Filter by owner_email', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitAttendeeTicketsResponse') + ), + 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: 'Summit has no external feed'), + ] + )] public function getAllBySummitExternal($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -285,10 +360,68 @@ function () { }); } - /** - * @param $summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/csv', + summary: 'Get all tickets for a summit', + description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', + security: [['bearer' => []]], + tags: ['tickets'], + 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 number, owner_name, owner_email, status, ticket_type_id, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by id, number, status, owner_name, 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')), + new OA\Parameter(name: 'id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'not_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Filter by ticket status, allowed values: Reserved, Cancelled, Confirmed, Paid, Error'), + new OA\Parameter(name: 'number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order_number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_first_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_last_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_email', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'owner_company', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'summit_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'owner_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'order_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'is_active', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'has_requested_refund_requests', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'access_level_type_name', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'access_level_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'ticket_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'view_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_owner', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'owner_status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Filter by owner status, allowed values: Complete, Incomplete'), + new OA\Parameter(name: 'has_badge', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'promo_code_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'promo_code', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'promo_code_description', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'promo_code_tag_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'promo_code_tag', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'numeric')), + new OA\Parameter(name: 'is_printable', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'badge_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_badge_prints', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'badge_prints_count', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_owner_company', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'exclude_is_printable_free_unassigned', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\MediaType( + mediaType: 'text/csv', + schema: new OA\Schema(type: 'string', format: 'binary') + ) + ), + 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 getAllBySummitCSV($summit_id) { return $this->withReplica(function() use ($summit_id) { @@ -355,15 +488,15 @@ function () { 'access_level_type_name' => 'sometimes|string', 'access_level_type_id' => 'sometimes|integer', 'ticket_type_id' => 'sometimes|integer', + 'view_type_id' => 'sometimes|integer', 'has_owner' => 'sometimes|boolean', 'owner_status' => 'sometimes|string|in:' . implode(',', SummitAttendee::AllowedStatus), 'has_badge' => 'sometimes|boolean', - 'view_type_id' => 'sometimes|integer', 'promo_code_id' => 'sometimes|integer', 'promo_code' => 'sometimes|string', - 'promo_code_tag' => 'sometimes|string', 'promo_code_description' => 'sometimes|string', 'promo_code_tag_id' => 'sometimes|integer', + 'promo_code_tag' => 'sometimes|string', 'final_amount' => 'sometimes|numeric', 'is_printable' => ['sometimes', new Boolean()], 'badge_type_id' => 'sometimes|integer', @@ -491,10 +624,26 @@ function($data, $serializerParams) use($questions){ }); } - /** - * @param $summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/tickets/ingest', + summary: 'Ingest external ticket data', + description: 'Triggers ingestion of ticket data from external registration feed', + security: [['bearer' => []]], + tags: ['tickets'], + 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: false, + content: new OA\JsonContent(ref: '#/components/schemas/IngestExternalTicketDataRequest') + ), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Ingestion process started successfully'), + 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 not found'), + ] + )] public function ingestExternalTicketData($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -516,10 +665,25 @@ public function ingestExternalTicketData($summit_id) }); } - /** - * @param $summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/import-template', + summary: 'Get ticket import template', + description: 'Returns a CSV template for importing ticket data', + security: [['bearer' => []]], + tags: ['tickets'], + parameters: [ + new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'CSV template', + content: new OA\MediaType(mediaType: 'text/csv', schema: new OA\Schema(type: 'string')) + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getImportTicketDataTemplate($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -581,11 +745,35 @@ public function getImportTicketDataTemplate($summit_id) }); } - /** - * @param LaravelRequest $request - * @param $summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Post( + path: '/api/v1/summits/{summit_id}/tickets/import', + summary: 'Import ticket data from CSV', + description: 'Imports ticket data from a CSV file', + security: [['bearer' => []]], + tags: ['tickets'], + 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\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema( + required: ['file'], + properties: [ + new OA\Property(property: 'file', type: 'string', format: 'binary', description: 'CSV file to import') + ] + ) + ) + ), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Import process started successfully'), + 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 not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'File parameter not set'), + ] + )] public function importTicketData(LaravelRequest $request, $summit_id) { @@ -609,14 +797,70 @@ public function importTicketData(LaravelRequest $request, $summit_id) }); } - /** - * @return mixed - */ + #[OA\Get( + path: '/api/v1/summits/all/tickets/me', + summary: 'Get all my tickets across all summits', + description: 'Returns all tickets owned by the current user across all summits', + security: [['bearer' => []]], + tags: ['tickets'], + parameters: [ + 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 number, order_number, status, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by id, number, status, created', 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/PaginatedSummitAttendeeTicketsResponse') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + ] + )] public function getAllMyTickets() { return $this->getAllMyTicketsBySummit('all'); } + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/me', + summary: 'Get my tickets for a summit', + description: 'Returns all tickets owned by the current user for a specific summit', + security: [['bearer' => []]], + tags: ['tickets'], + 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 number, order_number, status, etc.', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by id, number, status, created', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order_number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order_owner_email', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'summit_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'order_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'order_owner_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'has_order_owner', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), + new OA\Parameter(name: 'status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Valid values: Reserved, Cancelled, Confirmed, Paid, Error'), + new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'numeric')), + new OA\Parameter(name: 'assigned_to', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Valid values: Me, SomeoneElse, Nobody'), + new OA\Parameter(name: 'owner_status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Valid values: Complete, Incomplete'), + new OA\Parameter(name: 'badge_features_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'ticket_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'promo_code', in: 'query', required: false, schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitAttendeeTicketsResponse') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + ] + )] public function getAllMyTicketsBySummit($summit_id) { $owner = $this->getResourceServerContext()->getCurrentUser(); @@ -715,11 +959,32 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity } - /** - * @param $summit_id - * @param $ticket_id - * @return mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/refund', + summary: 'Refund a ticket', + description: 'Processes a refund for a specific ticket', + security: [['bearer' => []]], + tags: ['tickets'], + 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: '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/RefundTicketRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Ticket refunded successfully', + content: new OA\JsonContent(type: 'object') + ), + 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 ticket not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'Validation Error'), + ] + )] public function refundTicket($summit_id, $ticket_id) { return $this->processRequest(function () use ($summit_id, $ticket_id) { @@ -757,11 +1022,27 @@ public function refundTicket($summit_id, $ticket_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + summary: 'Get ticket badge', + description: 'Returns the badge associated with a ticket', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID or number', 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(schema: 'SummitAttendeeBadge') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, ticket or badge not found'), + ] + )] public function getAttendeeBadge($summit_id, $ticket_id) { return $this->processRequest(function () use ($summit_id, $ticket_id) { @@ -784,11 +1065,30 @@ public function getAttendeeBadge($summit_id, $ticket_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Post( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + summary: 'Create ticket badge', + description: 'Creates a badge for a specific ticket', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + ], + requestBody: new OA\RequestBody( + required: false, + content: new OA\JsonContent(ref: '#/components/schemas/CreateBadgeRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Badge created 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 or ticket not found'), + ] + )] public function createAttendeeBadge($summit_id, $ticket_id) { return $this->processRequest(function () use ($summit_id, $ticket_id) { @@ -809,11 +1109,22 @@ public function createAttendeeBadge($summit_id, $ticket_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + summary: 'Delete ticket badge', + description: 'Deletes the badge associated with a ticket', + security: [['bearer' => []]], + tags: ['tickets'], + 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: '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: 'Badge deleted successfully'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, ticket or badge not found'), + ] + )] public function deleteAttendeeBadge($summit_id, $ticket_id) { return $this->processRequest(function () use ($summit_id, $ticket_id) { @@ -824,12 +1135,27 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @param $type_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/type/{type_id}', + summary: 'Update badge type', + description: 'Updates the badge type for a ticket', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Badge Type ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Badge type updated 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, ticket or badge type not found'), + ] + )] public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) { return $this->processRequest(function () use ($summit_id, $ticket_id, $type_id) { @@ -845,12 +1171,27 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @param $feature_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', + summary: 'Add badge feature', + description: 'Adds a feature to a ticket badge', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'feature_id', in: 'path', required: true, description: 'Feature ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Feature added 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, ticket or feature not found'), + ] + )] public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) { return $this->processRequest(function () use ($summit_id, $ticket_id, $feature_id) { @@ -866,12 +1207,27 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @param $feature_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Delete( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', + summary: 'Remove badge feature', + description: 'Removes a feature from a ticket badge', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'feature_id', in: 'path', required: true, description: 'Feature ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Feature removed 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, ticket or feature not found'), + ] + )] public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) { return $this->processRequest(function () use ($summit_id, $ticket_id, $feature_id) { @@ -887,11 +1243,31 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) }); } - /** - * @param $summit_id - * @param $ticket_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/print', + summary: 'Print badge with default view', + description: 'Prints a badge using the summit\'s default view type', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + ], + requestBody: new OA\RequestBody( + required: false, + content: new OA\JsonContent(ref: '#/components/schemas/PrintBadgeRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Badge printed successfully', + content: new OA\JsonContent(type: 'object') + ), + 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, ticket or default view type not found'), + ] + )] public function printAttendeeBadgeDefault($summit_id, $ticket_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id); @@ -904,12 +1280,32 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) return $this->printAttendeeBadge($summit_id, $ticket_id, $viewType->getName()); } - /** - * @param $summit_id - * @param $ticket_id - * @param $view_type - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Put( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/print', + summary: 'Print badge with specific view type', + description: 'Prints a badge using a specific view type', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'view_type', in: 'path', required: true, description: 'View type name', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody( + required: false, + content: new OA\JsonContent(ref: '#/components/schemas/PrintBadgeRequest') + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Badge printed successfully', + content: new OA\JsonContent(type: 'object') + ), + 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, ticket or view type not found'), + ] + )] public function printAttendeeBadge($summit_id, $ticket_id, $view_type) { return $this->processRequest(function () use ($summit_id, $ticket_id, $view_type) { @@ -939,11 +1335,27 @@ public function printAttendeeBadge($summit_id, $ticket_id, $view_type) }); } - /** - * @param $summit_id - * @param $ticket_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/can-print', + summary: 'Check if badge can be printed (default view)', + description: 'Checks if a badge can be printed using the default view type', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Badge printability status', + content: new OA\JsonContent(type: 'object') + ), + 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 ticket not found'), + ] + )] public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id); @@ -956,12 +1368,28 @@ public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) return $this->canPrintAttendeeBadge($summit_id, $ticket_id, $viewType->getName()); } - /** - * @param $summit_id - * @param $ticket_id - * @param $view_type - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Get( + path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/can-print', + summary: 'Check if badge can be printed (specific view)', + description: 'Checks if a badge can be printed using a specific view type', + security: [['bearer' => []]], + tags: ['tickets'], + 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: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'view_type', in: 'path', required: true, description: 'View type name', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Badge printability status', + content: new OA\JsonContent(type: 'object') + ), + 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, ticket or view type not found'), + ] + )] public function canPrintAttendeeBadge($summit_id, $ticket_id, $view_type) { return $this->processRequest(function () use ($summit_id, $ticket_id, $view_type) { diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index 503bcdc41..6ec9d7944 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -1036,6 +1036,77 @@ class SummitBadgeTypeUpdateRequestSchema { } +#[OA\Schema( + schema: 'PaginatedSummitAttendeeTicketsResponse', + 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(type: 'SummitAttendeeTicket') + ) + ] + ) + ] +)] +class PaginatedSummitAttendeeTicketsResponse +{ +} + +#[OA\Schema( + schema: 'RefundTicketRequest', + type: 'object', + required: ['amount'], + properties: [ + new OA\Property(property: 'amount', type: 'number', format: 'float', description: 'Amount to refund'), + new OA\Property(property: 'notes', type: 'string', maxLength: 255, description: 'Refund notes'), + ] +)] +class RefundTicketRequest +{ +} + +#[OA\Schema( + schema: 'CreateBadgeRequest', + type: 'object', + properties: [ + new OA\Property(property: 'badge_type_id', type: 'integer'), + new OA\Property( + property: 'features', + type: 'array', + items: new OA\Items(type: 'integer') + ), + ] +)] +class CreateBadgeRequest +{ +} + +#[OA\Schema( + schema: 'PrintBadgeRequest', + type: 'object', + properties: [ + new OA\Property(property: 'check_in', type: 'boolean'), + ] +)] +class PrintBadgeRequest +{ +} + +#[OA\Schema( + schema: 'IngestExternalTicketDataRequest', + type: 'object', + properties: [ + new OA\Property(property: 'email_to', type: 'string', format: 'email'), + ] +)] +class IngestExternalTicketDataRequest +{ +} + // Summit Registration Invitation Schemas #[OA\Schema( From 052bd6110c37049096e220bf983532dc12609656 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Fri, 5 Dec 2025 19:36:55 +0000 Subject: [PATCH 02/13] fix: Add security schema, also security and x.required-groups fields --- .../OAuth2SummitTicketApiController.php | 199 ++++++++++++++++-- .../Security/SummitTicketsAuthSchema.php | 29 +++ 2 files changed, 209 insertions(+), 19 deletions(-) create mode 100644 app/Swagger/Security/SummitTicketsAuthSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index f4cf18dcf..7dd5e9995 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -15,10 +15,12 @@ use App\Http\Utils\BooleanCellFormatter; use App\Http\Utils\EpochCellFormatter; use App\libs\Utils\Doctrine\ReplicaAwareTrait; +use App\Models\Foundation\Main\IGroup; use App\Models\Foundation\Summit\Registration\ISummitExternalRegistrationFeedType; use App\ModelSerializers\ISummitAttendeeTicketSerializerTypes; use App\ModelSerializers\SerializerUtils; use App\Rules\Boolean; +use App\Security\SummitScopes; use App\Services\Model\ISummitOrderService; use Illuminate\Http\Request as LaravelRequest; use Illuminate\Http\Response; @@ -110,7 +112,17 @@ public function __construct path: '/api/v1/summits/{summit_id}/tickets', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + IGroup::BadgePrinters, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -289,7 +301,13 @@ function () { path: '/api/v1/summits/{summit_id}/tickets/external', summary: 'Get external ticket data', description: 'Returns ticket data from external registration feed by owner email', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::BadgePrinters, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -364,7 +382,16 @@ function () { path: '/api/v1/summits/{summit_id}/tickets/csv', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -628,7 +655,16 @@ function($data, $serializerParams) use($questions){ path: '/api/v1/summits/{summit_id}/tickets/ingest', summary: 'Ingest external ticket data', description: 'Triggers ingestion of ticket data from external registration feed', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteRegistrationData, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -669,7 +705,16 @@ public function ingestExternalTicketData($summit_id) path: '/api/v1/summits/{summit_id}/tickets/import-template', summary: 'Get ticket import template', description: 'Returns a CSV template for importing ticket data', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteRegistrationData, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -749,7 +794,16 @@ public function getImportTicketDataTemplate($summit_id) path: '/api/v1/summits/{summit_id}/tickets/import', summary: 'Import ticket data from CSV', description: 'Imports ticket data from a CSV file', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteRegistrationData, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -801,7 +855,9 @@ public function importTicketData(LaravelRequest $request, $summit_id) path: '/api/v1/summits/all/tickets/me', summary: 'Get all my tickets across all summits', description: 'Returns all tickets owned by the current user across all summits', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadMyRegistrationOrders, + ]]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), @@ -828,7 +884,9 @@ public function getAllMyTickets() path: '/api/v1/summits/{summit_id}/tickets/me', summary: 'Get my tickets for a summit', description: 'Returns all tickets owned by the current user for a specific summit', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadMyRegistrationOrders, + ]]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -963,7 +1021,16 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/refund', summary: 'Refund a ticket', description: 'Processes a refund for a specific ticket', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::UpdateRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1026,7 +1093,16 @@ public function refundTicket($summit_id, $ticket_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', summary: 'Get ticket badge', description: 'Returns the badge associated with a ticket', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1069,7 +1145,16 @@ public function getAttendeeBadge($summit_id, $ticket_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', summary: 'Create ticket badge', description: 'Creates a badge for a specific ticket', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::UpdateRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1113,7 +1198,16 @@ public function createAttendeeBadge($summit_id, $ticket_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', summary: 'Delete ticket badge', description: 'Deletes the badge associated with a ticket', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::UpdateRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1139,7 +1233,16 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/type/{type_id}', summary: 'Update badge type', description: 'Updates the badge type for a ticket', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::UpdateRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1175,7 +1278,16 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', summary: 'Add badge feature', description: 'Adds a feature to a ticket badge', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::UpdateRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1211,7 +1323,16 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', summary: 'Remove badge feature', description: 'Removes a feature from a ticket badge', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::UpdateRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1247,7 +1368,17 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/print', summary: 'Print badge with default view', description: 'Prints a badge using the summit\'s default view type', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::PrintRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + IGroup::BadgePrinters, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1284,7 +1415,17 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/print', summary: 'Print badge with specific view type', description: 'Prints a badge using a specific view type', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::PrintRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + IGroup::BadgePrinters, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1339,7 +1480,17 @@ public function printAttendeeBadge($summit_id, $ticket_id, $view_type) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/can-print', summary: 'Check if badge can be printed (default view)', description: 'Checks if a badge can be printed using the default view type', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::PrintRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + IGroup::BadgePrinters, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1372,7 +1523,17 @@ public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/can-print', summary: 'Check if badge can be printed (specific view)', description: 'Checks if a badge can be printed using a specific view type', - security: [['bearer' => []]], + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::PrintRegistrationOrdersBadges, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + IGroup::BadgePrinters, + ]], tags: ['tickets'], parameters: [ new OA\Parameter(name: 'summit_id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), diff --git a/app/Swagger/Security/SummitTicketsAuthSchema.php b/app/Swagger/Security/SummitTicketsAuthSchema.php new file mode 100644 index 000000000..61364442a --- /dev/null +++ b/app/Swagger/Security/SummitTicketsAuthSchema.php @@ -0,0 +1,29 @@ + 'Read All Summit Data', + SummitScopes::ReadRegistrationOrders => 'Read Registration Orders', + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteRegistrationData => 'Write Registration Data', + SummitScopes::UpdateRegistrationOrders => 'Update Registration Orders', + SummitScopes::UpdateRegistrationOrdersBadges => 'Update Registration Orders Badges', + SummitScopes::PrintRegistrationOrdersBadges => 'Print Registration Orders Badges', + SummitScopes::ReadMyRegistrationOrders => 'Read My Registration Orders', + ], + ), + ], +)] +class SummitTicketsAuthSchema {} From c3726d559262c0709dfd4dbb93dabef1a83800ad Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Fri, 5 Dec 2025 19:40:29 +0000 Subject: [PATCH 03/13] chore: Add operationId --- .../OAuth2SummitTicketApiController.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index 7dd5e9995..1fa9afeef 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -110,6 +110,7 @@ public function __construct #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets', + operationId: 'getAllTickets', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', security: [['summit_tickets_oauth2' => [ @@ -299,6 +300,7 @@ function () { #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/external', + operationId: 'getExternalTickets', summary: 'Get external ticket data', description: 'Returns ticket data from external registration feed by owner email', security: [['summit_tickets_oauth2' => [ @@ -380,6 +382,7 @@ function () { #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/csv', + operationId: 'getAllTicketsCSV', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', security: [['summit_tickets_oauth2' => [ @@ -653,6 +656,7 @@ function($data, $serializerParams) use($questions){ #[OA\Put( path: '/api/v1/summits/{summit_id}/tickets/ingest', + operationId: 'ingestExternalTicketData', summary: 'Ingest external ticket data', description: 'Triggers ingestion of ticket data from external registration feed', security: [['summit_tickets_oauth2' => [ @@ -703,6 +707,7 @@ public function ingestExternalTicketData($summit_id) #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/import-template', + operationId: 'getTicketImportTemplate', summary: 'Get ticket import template', description: 'Returns a CSV template for importing ticket data', security: [['summit_tickets_oauth2' => [ @@ -792,6 +797,7 @@ public function getImportTicketDataTemplate($summit_id) #[OA\Post( path: '/api/v1/summits/{summit_id}/tickets/import', + operationId: 'importTicketData', summary: 'Import ticket data from CSV', description: 'Imports ticket data from a CSV file', security: [['summit_tickets_oauth2' => [ @@ -853,6 +859,7 @@ public function importTicketData(LaravelRequest $request, $summit_id) #[OA\Get( path: '/api/v1/summits/all/tickets/me', + operationId: 'getAllMyTickets', summary: 'Get all my tickets across all summits', description: 'Returns all tickets owned by the current user across all summits', security: [['summit_tickets_oauth2' => [ @@ -882,6 +889,7 @@ public function getAllMyTickets() #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/me', + operationId: 'getMyTicketsBySummit', summary: 'Get my tickets for a summit', description: 'Returns all tickets owned by the current user for a specific summit', security: [['summit_tickets_oauth2' => [ @@ -1019,6 +1027,7 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity #[OA\Delete( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/refund', + operationId: 'refundTicket', summary: 'Refund a ticket', description: 'Processes a refund for a specific ticket', security: [['summit_tickets_oauth2' => [ @@ -1091,6 +1100,7 @@ public function refundTicket($summit_id, $ticket_id) #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + operationId: 'getTicketBadge', summary: 'Get ticket badge', description: 'Returns the badge associated with a ticket', security: [['summit_tickets_oauth2' => [ @@ -1143,6 +1153,7 @@ public function getAttendeeBadge($summit_id, $ticket_id) #[OA\Post( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + operationId: 'createTicketBadge', summary: 'Create ticket badge', description: 'Creates a badge for a specific ticket', security: [['summit_tickets_oauth2' => [ @@ -1196,6 +1207,7 @@ public function createAttendeeBadge($summit_id, $ticket_id) #[OA\Delete( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + operationId: 'deleteTicketBadge', summary: 'Delete ticket badge', description: 'Deletes the badge associated with a ticket', security: [['summit_tickets_oauth2' => [ @@ -1231,6 +1243,7 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) #[OA\Put( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/type/{type_id}', + operationId: 'updateTicketBadgeType', summary: 'Update badge type', description: 'Updates the badge type for a ticket', security: [['summit_tickets_oauth2' => [ @@ -1276,6 +1289,7 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) #[OA\Put( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', + operationId: 'addTicketBadgeFeature', summary: 'Add badge feature', description: 'Adds a feature to a ticket badge', security: [['summit_tickets_oauth2' => [ @@ -1321,6 +1335,7 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) #[OA\Delete( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', + operationId: 'removeTicketBadgeFeature', summary: 'Remove badge feature', description: 'Removes a feature from a ticket badge', security: [['summit_tickets_oauth2' => [ @@ -1366,6 +1381,7 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) #[OA\Put( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/print', + operationId: 'printTicketBadge', summary: 'Print badge with default view', description: 'Prints a badge using the summit\'s default view type', security: [['summit_tickets_oauth2' => [ @@ -1413,6 +1429,7 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) #[OA\Put( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/print', + operationId: 'printTicketBadgeByViewType', summary: 'Print badge with specific view type', description: 'Prints a badge using a specific view type', security: [['summit_tickets_oauth2' => [ @@ -1478,6 +1495,7 @@ public function printAttendeeBadge($summit_id, $ticket_id, $view_type) #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/can-print', + operationId: 'canPrintTicketBadge', summary: 'Check if badge can be printed (default view)', description: 'Checks if a badge can be printed using the default view type', security: [['summit_tickets_oauth2' => [ @@ -1521,6 +1539,7 @@ public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) #[OA\Get( path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/can-print', + operationId: 'canPrintTicketBadgeByViewType', summary: 'Check if badge can be printed (specific view)', description: 'Checks if a badge can be printed using a specific view type', security: [['summit_tickets_oauth2' => [ From 24a1fa19299045a44132c3a277d5905b08e79b4f Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Fri, 5 Dec 2025 20:14:58 +0000 Subject: [PATCH 04/13] fix: Update path parameters in OAuth2SummitTicketApiController for consistency --- .../OAuth2SummitTicketApiController.php | 77 +++++++++---------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index 1fa9afeef..7e6ff660d 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -109,7 +109,7 @@ public function __construct #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets', + path: '/api/v1/summits/{id}/tickets', operationId: 'getAllTickets', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', @@ -126,7 +126,7 @@ public function __construct ]], tags: ['tickets'], 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', 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 number, owner_name, owner_email, status, ticket_type_id, etc.', schema: new OA\Schema(type: 'string')), @@ -299,7 +299,7 @@ function () { } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/external', + path: '/api/v1/summits/{id}/tickets/external', operationId: 'getExternalTickets', summary: 'Get external ticket data', description: 'Returns ticket data from external registration feed by owner email', @@ -312,7 +312,7 @@ function () { ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: true, description: 'Filter by owner_email', schema: new OA\Schema(type: 'string')), ], responses: [ @@ -381,7 +381,7 @@ function () { } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/csv', + path: '/api/v1/summits/{id}/tickets/csv', operationId: 'getAllTicketsCSV', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', @@ -397,7 +397,7 @@ function () { ]], tags: ['tickets'], 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', 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 number, owner_name, owner_email, status, ticket_type_id, etc.', schema: new OA\Schema(type: 'string')), @@ -654,8 +654,8 @@ function($data, $serializerParams) use($questions){ }); } - #[OA\Put( - path: '/api/v1/summits/{summit_id}/tickets/ingest', + #[OA\Post( + path: '/api/v1/summits/{id}/tickets/ingest', operationId: 'ingestExternalTicketData', summary: 'Ingest external ticket data', description: 'Triggers ingestion of ticket data from external registration feed', @@ -671,7 +671,7 @@ function($data, $serializerParams) use($questions){ ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), ], requestBody: new OA\RequestBody( required: false, @@ -706,7 +706,7 @@ public function ingestExternalTicketData($summit_id) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/import-template', + path: '/api/v1/summits/{id}/tickets/csv/template', operationId: 'getTicketImportTemplate', summary: 'Get ticket import template', description: 'Returns a CSV template for importing ticket data', @@ -722,7 +722,7 @@ public function ingestExternalTicketData($summit_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), ], responses: [ new OA\Response( @@ -796,7 +796,7 @@ public function getImportTicketDataTemplate($summit_id) } #[OA\Post( - path: '/api/v1/summits/{summit_id}/tickets/import', + path: '/api/v1/summits/{id}/tickets/csv', operationId: 'importTicketData', summary: 'Import ticket data from CSV', description: 'Imports ticket data from a CSV file', @@ -812,7 +812,7 @@ public function getImportTicketDataTemplate($summit_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), ], requestBody: new OA\RequestBody( required: true, @@ -858,7 +858,7 @@ public function importTicketData(LaravelRequest $request, $summit_id) } #[OA\Get( - path: '/api/v1/summits/all/tickets/me', + path: '/api/v1/summits/all/orders/all/tickets/me', operationId: 'getAllMyTickets', summary: 'Get all my tickets across all summits', description: 'Returns all tickets owned by the current user across all summits', @@ -888,7 +888,7 @@ public function getAllMyTickets() } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/me', + path: '/api/v1/summits/{id}/orders/all/tickets/me', operationId: 'getMyTicketsBySummit', summary: 'Get my tickets for a summit', description: 'Returns all tickets owned by the current user for a specific summit', @@ -897,7 +897,7 @@ public function getAllMyTickets() ]]], tags: ['tickets'], 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', 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 number, order_number, status, etc.', schema: new OA\Schema(type: 'string')), @@ -906,7 +906,6 @@ public function getAllMyTickets() new OA\Parameter(name: 'number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'order_number', in: 'query', required: false, schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'order_owner_email', in: 'query', required: false, schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'summit_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'order_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'order_owner_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'has_order_owner', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), @@ -1026,7 +1025,7 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/refund', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/refund', operationId: 'refundTicket', summary: 'Refund a ticket', description: 'Processes a refund for a specific ticket', @@ -1042,7 +1041,7 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -1099,7 +1098,7 @@ public function refundTicket($summit_id, $ticket_id) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge', operationId: 'getTicketBadge', summary: 'Get ticket badge', description: 'Returns the badge associated with a ticket', @@ -1115,7 +1114,7 @@ public function refundTicket($summit_id, $ticket_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID or number', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships', schema: new OA\Schema(type: 'string')), ], @@ -1152,7 +1151,7 @@ public function getAttendeeBadge($summit_id, $ticket_id) } #[OA\Post( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge', operationId: 'createTicketBadge', summary: 'Create ticket badge', description: 'Creates a badge for a specific ticket', @@ -1168,7 +1167,7 @@ public function getAttendeeBadge($summit_id, $ticket_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -1206,7 +1205,7 @@ public function createAttendeeBadge($summit_id, $ticket_id) } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current', operationId: 'deleteTicketBadge', summary: 'Delete ticket badge', description: 'Deletes the badge associated with a ticket', @@ -1222,7 +1221,7 @@ public function createAttendeeBadge($summit_id, $ticket_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -1242,7 +1241,7 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/type/{type_id}', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/type/{type_id}', operationId: 'updateTicketBadgeType', summary: 'Update badge type', description: 'Updates the badge type for a ticket', @@ -1258,7 +1257,7 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Badge Type ID', schema: new OA\Schema(type: 'integer')), ], @@ -1288,7 +1287,7 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/features/{feature_id}', operationId: 'addTicketBadgeFeature', summary: 'Add badge feature', description: 'Adds a feature to a ticket badge', @@ -1304,7 +1303,7 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'feature_id', in: 'path', required: true, description: 'Feature ID', schema: new OA\Schema(type: 'integer')), ], @@ -1334,7 +1333,7 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) } #[OA\Delete( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/features/{feature_id}', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/features/{feature_id}', operationId: 'removeTicketBadgeFeature', summary: 'Remove badge feature', description: 'Removes a feature from a ticket badge', @@ -1350,7 +1349,7 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'feature_id', in: 'path', required: true, description: 'Feature ID', schema: new OA\Schema(type: 'integer')), ], @@ -1380,7 +1379,7 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/print', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/print', operationId: 'printTicketBadge', summary: 'Print badge with default view', description: 'Prints a badge using the summit\'s default view type', @@ -1397,7 +1396,7 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], requestBody: new OA\RequestBody( @@ -1428,7 +1427,7 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) } #[OA\Put( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/print', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/{view_type}/print', operationId: 'printTicketBadgeByViewType', summary: 'Print badge with specific view type', description: 'Prints a badge using a specific view type', @@ -1445,7 +1444,7 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'view_type', in: 'path', required: true, description: 'View type name', schema: new OA\Schema(type: 'string')), ], @@ -1494,7 +1493,7 @@ public function printAttendeeBadge($summit_id, $ticket_id, $view_type) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/can-print', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/print', operationId: 'canPrintTicketBadge', summary: 'Check if badge can be printed (default view)', description: 'Checks if a badge can be printed using the default view type', @@ -1511,7 +1510,7 @@ public function printAttendeeBadge($summit_id, $ticket_id, $view_type) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), ], responses: [ @@ -1538,7 +1537,7 @@ public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) } #[OA\Get( - path: '/api/v1/summits/{summit_id}/tickets/{ticket_id}/badge/{view_type}/can-print', + path: '/api/v1/summits/{id}/tickets/{ticket_id}/badge/current/{view_type}/print', operationId: 'canPrintTicketBadgeByViewType', summary: 'Check if badge can be printed (specific view)', description: 'Checks if a badge can be printed using a specific view type', @@ -1555,7 +1554,7 @@ public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) ]], tags: ['tickets'], 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', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'view_type', in: 'path', required: true, description: 'View type name', schema: new OA\Schema(type: 'string')), ], From cabcfc82739a63526b8402ad4ccf1c35d974daf4 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 8 Dec 2025 20:53:16 +0000 Subject: [PATCH 05/13] chore: change tag to title case --- .../OAuth2SummitTicketApiController.php | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index 7e6ff660d..6bccdbc5c 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -124,7 +124,7 @@ public function __construct IGroup::SummitRegistrationAdmins, IGroup::BadgePrinters, ]], - tags: ['tickets'], + tags: ['Tickets'], 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)), @@ -310,7 +310,7 @@ function () { x: ['required-groups' => [ IGroup::BadgePrinters, ]], - tags: ['tickets'], + tags: ['Tickets'], 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: true, description: 'Filter by owner_email', schema: new OA\Schema(type: 'string')), @@ -395,7 +395,7 @@ function () { IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], 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)), @@ -669,7 +669,7 @@ function($data, $serializerParams) use($questions){ IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), ], @@ -720,7 +720,7 @@ public function ingestExternalTicketData($summit_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), ], @@ -810,7 +810,7 @@ public function getImportTicketDataTemplate($summit_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), ], @@ -865,7 +865,7 @@ public function importTicketData(LaravelRequest $request, $summit_id) security: [['summit_tickets_oauth2' => [ SummitScopes::ReadMyRegistrationOrders, ]]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ 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)), @@ -895,7 +895,7 @@ public function getAllMyTickets() security: [['summit_tickets_oauth2' => [ SummitScopes::ReadMyRegistrationOrders, ]]], - tags: ['tickets'], + tags: ['Tickets'], 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)), @@ -1039,7 +1039,7 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1112,7 +1112,7 @@ public function refundTicket($summit_id, $ticket_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID or number', schema: new OA\Schema(type: 'string')), @@ -1165,7 +1165,7 @@ public function getAttendeeBadge($summit_id, $ticket_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1219,7 +1219,7 @@ public function createAttendeeBadge($summit_id, $ticket_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1255,7 +1255,7 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1301,7 +1301,7 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1347,7 +1347,7 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) IGroup::SummitAdministrators, IGroup::SummitRegistrationAdmins, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1394,7 +1394,7 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) IGroup::SummitRegistrationAdmins, IGroup::BadgePrinters, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1442,7 +1442,7 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) IGroup::SummitRegistrationAdmins, IGroup::BadgePrinters, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1508,7 +1508,7 @@ public function printAttendeeBadge($summit_id, $ticket_id, $view_type) IGroup::SummitRegistrationAdmins, IGroup::BadgePrinters, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), @@ -1552,7 +1552,7 @@ public function canPrintAttendeeBadgeDefault($summit_id, $ticket_id) IGroup::SummitRegistrationAdmins, IGroup::BadgePrinters, ]], - tags: ['tickets'], + tags: ['Tickets'], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'integer')), From 2a5b67d7072a28ef33e8b7e5a4f03be00c6e3199 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 29 Dec 2025 21:15:28 +0000 Subject: [PATCH 06/13] chore: Add PR's requested changes Signed-off-by: Matias Perrone --- .../Apis/Protected/Summit/OAuth2SummitTicketApiController.php | 2 +- app/Swagger/SummitRegistrationSchemas.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index 6bccdbc5c..c5af32d04 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -1122,7 +1122,7 @@ public function refundTicket($summit_id, $ticket_id) new OA\Response( response: Response::HTTP_OK, description: 'Successful operation', - content: new OA\JsonContent(schema: 'SummitAttendeeBadge') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, ticket or badge not found'), diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index 6ec9d7944..42e21e777 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -1046,7 +1046,7 @@ class SummitBadgeTypeUpdateRequestSchema new OA\Property( property: 'data', type: 'array', - items: new OA\Items(type: 'SummitAttendeeTicket') + items: new OA\Items(ref: '#/components/schemas/SummitAttendeeTicket') ) ] ) From 0417adffa813705a90bcb31d5d229c313edfeb26 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 27 Jan 2026 16:44:41 +0000 Subject: [PATCH 07/13] chore: fix incorrect HTTP codes responses Signed-off-by: Matias Perrone --- .../OAuth2SummitTicketApiController.php | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index c5af32d04..21e3ff76a 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -518,12 +518,10 @@ function () { 'access_level_type_name' => 'sometimes|string', 'access_level_type_id' => 'sometimes|integer', 'ticket_type_id' => 'sometimes|integer', - 'view_type_id' => 'sometimes|integer', 'has_owner' => 'sometimes|boolean', 'owner_status' => 'sometimes|string|in:' . implode(',', SummitAttendee::AllowedStatus), 'has_badge' => 'sometimes|boolean', 'promo_code_id' => 'sometimes|integer', - 'promo_code' => 'sometimes|string', 'promo_code_description' => 'sometimes|string', 'promo_code_tag_id' => 'sometimes|integer', 'promo_code_tag' => 'sometimes|string', @@ -1050,9 +1048,9 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity ), responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Ticket refunded successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeTicket') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden'), @@ -1176,9 +1174,9 @@ public function getAttendeeBadge($summit_id, $ticket_id) ), responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Badge created successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or ticket not found'), @@ -1263,9 +1261,9 @@ public function deleteAttendeeBadge($summit_id, $ticket_id) ], responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Badge type updated successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, ticket or badge type not found'), @@ -1309,9 +1307,9 @@ public function updateAttendeeBadgeType($summit_id, $ticket_id, $type_id) ], responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Feature added successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, ticket or feature not found'), @@ -1355,9 +1353,9 @@ public function addAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) ], responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Feature removed successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, ticket or feature not found'), @@ -1405,9 +1403,9 @@ public function removeAttendeeBadgeFeature($summit_id, $ticket_id, $feature_id) ), responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Badge printed successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden'), @@ -1454,9 +1452,9 @@ public function printAttendeeBadgeDefault($summit_id, $ticket_id) ), responses: [ new OA\Response( - response: Response::HTTP_OK, + response: Response::HTTP_CREATED, description: 'Badge printed successfully', - content: new OA\JsonContent(type: 'object') + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeBadge') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden'), From 9887e330276a0f4f21eb9c02e75fcf08203b8e82 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 27 Jan 2026 16:46:23 +0000 Subject: [PATCH 08/13] fix: linting back to main Signed-off-by: Matias Perrone --- .../Apis/Protected/Summit/OAuth2SummitTicketApiController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index 21e3ff76a..f7a287500 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -521,10 +521,12 @@ function () { 'has_owner' => 'sometimes|boolean', 'owner_status' => 'sometimes|string|in:' . implode(',', SummitAttendee::AllowedStatus), 'has_badge' => 'sometimes|boolean', + 'view_type_id' => 'sometimes|integer', 'promo_code_id' => 'sometimes|integer', + 'promo_code' => 'sometimes|string', + 'promo_code_tag' => 'sometimes|string', 'promo_code_description' => 'sometimes|string', 'promo_code_tag_id' => 'sometimes|integer', - 'promo_code_tag' => 'sometimes|string', 'final_amount' => 'sometimes|numeric', 'is_printable' => ['sometimes', new Boolean()], 'badge_type_id' => 'sometimes|integer', From 3a931b5d6b1a16091f0102c37485fc56e2b7b63f Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 27 Jan 2026 17:05:04 +0000 Subject: [PATCH 09/13] chore: add "Schema" to schema classes names Signed-off-by: Matias Perrone --- app/Swagger/SummitRegistrationSchemas.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index 42e21e777..ccf022f2d 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -1052,7 +1052,7 @@ class SummitBadgeTypeUpdateRequestSchema ) ] )] -class PaginatedSummitAttendeeTicketsResponse +class PaginatedSummitAttendeeTicketsResponseSchema { } @@ -1065,7 +1065,7 @@ class PaginatedSummitAttendeeTicketsResponse new OA\Property(property: 'notes', type: 'string', maxLength: 255, description: 'Refund notes'), ] )] -class RefundTicketRequest +class RefundTicketRequestSchema { } @@ -1081,7 +1081,7 @@ class RefundTicketRequest ), ] )] -class CreateBadgeRequest +class CreateBadgeRequestSchema { } @@ -1092,7 +1092,7 @@ class CreateBadgeRequest new OA\Property(property: 'check_in', type: 'boolean'), ] )] -class PrintBadgeRequest +class PrintBadgeRequestSchema { } @@ -1103,7 +1103,7 @@ class PrintBadgeRequest new OA\Property(property: 'email_to', type: 'string', format: 'email'), ] )] -class IngestExternalTicketDataRequest +class IngestExternalTicketDataRequestSchema { } From 23486c948dd984fd4ce07c90d3300fe4c5714465 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 27 Jan 2026 17:34:26 +0000 Subject: [PATCH 10/13] chore: Add missing schemas and route Signed-off-by: Matias Perrone --- .../OAuth2SummitTicketApiController.php | 38 ++++++++++++- .../Models/SummitAttendeeTicketSchema.php | 55 +++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 app/Swagger/Models/SummitAttendeeTicketSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index f7a287500..d307ac046 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -107,10 +107,46 @@ public function __construct $this->service = $service; } + #[OA\Get( + path: '/api/v1/summits/{id}/tickets/{ticket_id}', + operationId: 'getSummitAttendeeTicketById', + summary: 'Get a specific ticket for a summit by ticket ID', + description: '', + security: [['summit_tickets_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadRegistrationOrders, + ]]], + x: ['required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRegistrationAdmins, + IGroup::BadgePrinters, + IGroup::SummitAccessControl + ]], + tags: ['Tickets'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'ticket_id', in: 'path', required: true, description: 'Ticket ID', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relationships, allowed values: applied_taxes, refund_requests', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand relationships, allowed values: owner, order, ticket_type, badge, promo_code, refund_requests, applied_taxes', schema: new OA\Schema(type: 'string')), + + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Successful operation', + content: new OA\JsonContent(ref: '#/components/schemas/SummitAttendeeTicket') + ), + 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'), + ] + )] #[OA\Get( path: '/api/v1/summits/{id}/tickets', - operationId: 'getAllTickets', + operationId: 'getAllSummitAttendeeTickets', summary: 'Get all tickets for a summit', description: 'Returns a paginated list of tickets for the specified summit with filtering and sorting capabilities', security: [['summit_tickets_oauth2' => [ diff --git a/app/Swagger/Models/SummitAttendeeTicketSchema.php b/app/Swagger/Models/SummitAttendeeTicketSchema.php new file mode 100644 index 000000000..77ffd3a90 --- /dev/null +++ b/app/Swagger/Models/SummitAttendeeTicketSchema.php @@ -0,0 +1,55 @@ + Date: Wed, 28 Jan 2026 15:34:40 +0000 Subject: [PATCH 11/13] chore: Move SummitAttendeeTicket to its own file Signed-off-by: Matias Perrone --- app/Swagger/SummitRegistrationSchemas.php | 79 ----------------------- 1 file changed, 79 deletions(-) diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index ccf022f2d..939872ed7 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -528,85 +528,6 @@ class SummitOrderSchema { } -#[OA\Schema( - schema: 'SummitAttendeeTicket', - description: 'Generic SummitAttendeeTicket response - fields may vary based on context and serializer type', - type: 'object', - required: [ - 'id', - 'number', - 'status', - 'external_order_id', - 'external_attendee_id', - 'bought_date', - 'ticket_type_id', - 'owner_id', - 'order_id', - 'badge_id', - 'promo_code_id', - 'raw_cost', - 'net_selling_cost', - 'raw_cost_in_cents', - 'final_amount', - 'final_amount_in_cents', - 'discount', - 'discount_rate', - 'discount_in_cents', - 'refunded_amount', - 'refunded_amount_in_cents', - 'total_refunded_amount', - 'total_refunded_amount_in_cents', - 'currency', - 'currency_symbol', - 'taxes_amount', - 'taxes_amount_in_cents', - 'is_active', - 'qr_code', - 'owner_email', - 'created' - ], - properties: [ - new OA\Property(property: 'id', type: 'integer'), - new OA\Property(property: 'created', type: 'integer', description: 'Unix timestamp'), - new OA\Property(property: 'last_edited', type: 'integer', description: 'Unix timestamp'), - new OA\Property(property: 'number', type: 'string'), - new OA\Property(property: 'status', type: 'string'), - new OA\Property(property: 'external_order_id', type: 'string'), - new OA\Property(property: 'external_attendee_id', type: 'string'), - new OA\Property(property: 'bought_date', type: 'integer'), - new OA\Property(property: 'ticket_type_id', type: 'integer'), - new OA\Property(property: 'owner_id', type: 'integer'), - new OA\Property(property: 'order_id', type: 'integer'), - new OA\Property(property: 'badge_id', type: 'integer'), - new OA\Property(property: 'promo_code_id', type: 'integer'), - new OA\Property(property: 'raw_cost', type: 'float'), - new OA\Property(property: 'net_selling_cost', type: 'float'), - new OA\Property(property: 'raw_cost_in_cents', type: 'integer'), - new OA\Property(property: 'final_amount', type: 'float'), - new OA\Property(property: 'final_amount_in_cents', type: 'integer'), - new OA\Property(property: 'discount', type: 'float'), - new OA\Property(property: 'discount_rate', type: 'float'), - new OA\Property(property: 'discount_in_cents', type: 'integer'), - new OA\Property(property: 'refunded_amount', type: 'float'), - new OA\Property(property: 'refunded_amount_in_cents', type: 'integer'), - new OA\Property(property: 'total_refunded_amount', type: 'float'), - new OA\Property(property: 'total_refunded_amount_in_cents', type: 'integer'), - new OA\Property(property: 'currency', type: 'string'), - new OA\Property(property: 'currency_symbol', type: 'string'), - new OA\Property(property: 'taxes_amount', type: 'float'), - new OA\Property(property: 'taxes_amount_in_cents', type: 'integer'), - new OA\Property(property: 'is_active', type: 'boolean'), - new OA\Property(property: 'qr_code', type: 'string'), - new OA\Property(property: 'owner_email', type: 'string'), - new OA\Property(property: 'owner', ref: '#/components/schemas/SummitAttendee', description: 'Owner of the ticket, only available when ?expand=owner'), - new OA\Property(property: 'order', ref: '#/components/schemas/SummitOrder', description: 'Order associated to the ticket, only available when ?expand=order'), - ] -)] -class SummitAttendeeTicketSchema -{ -} - - #[OA\Schema( schema: 'SummitOrderReservation', description: 'SummitOrder with ReservationType serialization - used for order reservations', From 3502631154192a36ee63b54822b97b025d9d86ff Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 28 Jan 2026 15:35:33 +0000 Subject: [PATCH 12/13] chore: fix rebase issues Signed-off-by: Matias Perrone --- app/Swagger/SummitRegistrationSchemas.php | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/app/Swagger/SummitRegistrationSchemas.php b/app/Swagger/SummitRegistrationSchemas.php index 939872ed7..f7b559ee3 100644 --- a/app/Swagger/SummitRegistrationSchemas.php +++ b/app/Swagger/SummitRegistrationSchemas.php @@ -957,26 +957,6 @@ class SummitBadgeTypeUpdateRequestSchema { } -#[OA\Schema( - schema: 'PaginatedSummitAttendeeTicketsResponse', - 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/SummitAttendeeTicket') - ) - ] - ) - ] -)] -class PaginatedSummitAttendeeTicketsResponseSchema -{ -} - #[OA\Schema( schema: 'RefundTicketRequest', type: 'object', From 8208cd5456899bdd0982a11b079163ef4bc665c8 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 28 Jan 2026 20:48:08 +0000 Subject: [PATCH 13/13] chore: change floating numbers to "number" type Signed-off-by: Matias Perrone --- .../Protected/Summit/OAuth2SummitTicketApiController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php index d307ac046..5bc75b1fe 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTicketApiController.php @@ -195,7 +195,7 @@ public function __construct new OA\Parameter(name: 'promo_code_description', in: 'query', required: false, schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'promo_code_tag_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'promo_code_tag', in: 'query', required: false, schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'numeric')), + new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'number')), new OA\Parameter(name: 'is_printable', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), new OA\Parameter(name: 'badge_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'has_badge_prints', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), @@ -466,7 +466,7 @@ function () { new OA\Parameter(name: 'promo_code_description', in: 'query', required: false, schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'promo_code_tag_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'promo_code_tag', in: 'query', required: false, schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'numeric')), + new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'number')), new OA\Parameter(name: 'is_printable', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), new OA\Parameter(name: 'badge_type_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'has_badge_prints', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), @@ -946,7 +946,7 @@ public function getAllMyTickets() new OA\Parameter(name: 'order_owner_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'has_order_owner', in: 'query', required: false, schema: new OA\Schema(type: 'boolean')), new OA\Parameter(name: 'status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Valid values: Reserved, Cancelled, Confirmed, Paid, Error'), - new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'numeric')), + new OA\Parameter(name: 'final_amount', in: 'query', required: false, schema: new OA\Schema(type: 'number')), new OA\Parameter(name: 'assigned_to', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Valid values: Me, SomeoneElse, Nobody'), new OA\Parameter(name: 'owner_status', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Valid values: Complete, Incomplete'), new OA\Parameter(name: 'badge_features_id', in: 'query', required: false, schema: new OA\Schema(type: 'integer')),