From acf8254eb3ec1da2f07ea90d45b51d91f87bd217 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 13 Jan 2026 21:48:35 +0000 Subject: [PATCH 01/10] feat: Extend Swagger Coverage for controller OAuth2SummitLocationsApiController Signed-off-by: Matias Perrone --- .../OAuth2SummitLocationsApiController.php | 1232 ++++++++++++++++- .../Traits/SummitBookableVenueRoomApi.php | 370 ++++- .../Models/SummitAbstractLocationSchema.php | 35 + app/Swagger/Models/SummitAirportSchema.php | 25 + ...VenueRoomAttributeValueExpandedSchema.php} | 14 +- ...tBookableVenueRoomAttributeValueSchema.php | 22 + .../Models/SummitBookableVenueRoomSchema.php | 32 + .../Models/SummitExternalLocationSchema.php | 25 + .../Models/SummitGeoLocatedLocationSchema.php | 48 + app/Swagger/Models/SummitHotelSchema.php | 27 + .../Models/SummitLocationBannerSchema.php | 26 + .../Models/SummitLocationImageSchema.php | 26 + .../Models/SummitLocationMapSchema.php | 26 + .../Models/SummitRoomReservationSchema.php | 47 + app/Swagger/Models/SummitVenueFloorSchema.php | 36 + app/Swagger/Models/SummitVenueRoomSchema.php | 40 + app/Swagger/Models/SummitVenueSchema.php | 37 + ...th2SummitLocationsApiControllerSchemas.php | 639 +++++++++ app/Swagger/Security/LocationsAuthSchema.php | 30 + 19 files changed, 2721 insertions(+), 16 deletions(-) create mode 100644 app/Swagger/Models/SummitAbstractLocationSchema.php create mode 100644 app/Swagger/Models/SummitAirportSchema.php rename app/Swagger/{SummitLocationsAttributeValuesSchemas.php => Models/SummitBookableVenueRoomAttributeValueExpandedSchema.php} (58%) create mode 100644 app/Swagger/Models/SummitBookableVenueRoomAttributeValueSchema.php create mode 100644 app/Swagger/Models/SummitBookableVenueRoomSchema.php create mode 100644 app/Swagger/Models/SummitExternalLocationSchema.php create mode 100644 app/Swagger/Models/SummitGeoLocatedLocationSchema.php create mode 100644 app/Swagger/Models/SummitHotelSchema.php create mode 100644 app/Swagger/Models/SummitLocationBannerSchema.php create mode 100644 app/Swagger/Models/SummitLocationImageSchema.php create mode 100644 app/Swagger/Models/SummitLocationMapSchema.php create mode 100644 app/Swagger/Models/SummitRoomReservationSchema.php create mode 100644 app/Swagger/Models/SummitVenueFloorSchema.php create mode 100644 app/Swagger/Models/SummitVenueRoomSchema.php create mode 100644 app/Swagger/Models/SummitVenueSchema.php create mode 100644 app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php create mode 100644 app/Swagger/Security/LocationsAuthSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index dca66a40b..0d53ba84e 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -1,4 +1,5 @@ - [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: class_name, name, description, address_1, address_2, zip_code, city, state, country, sold_out, is_main', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, name, order', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocationPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getLocations($summit_id) { @@ -212,6 +239,28 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues', + summary: 'Get all venues for a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, rooms_name, rooms_floor_name, floors_name, description, address_1, address_2, zip_code, city, state, country, sold_out, is_main', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, name, order', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenuePaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getVenues($summit_id) { @@ -281,6 +330,28 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { ); } + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/rooms/all', + summary: 'Get all venue rooms for a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, floor_name, venue_name, description', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, name, order, venue_name, floor_name', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoomPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getAllVenuesRooms($summit_id){ $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); @@ -335,6 +406,24 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/external-locations', + summary: 'Get all external locations for a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitExternalLocationPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getExternalLocations($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -370,6 +459,24 @@ public function getExternalLocations($summit_id) * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/hotels', + summary: 'Get all hotels for a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitHotelPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getHotels($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -404,6 +511,24 @@ public function getHotels($summit_id) * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/airports', + summary: 'Get all airports for a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAirportPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getAirports($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -440,9 +565,28 @@ public function getAirports($summit_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}', + summary: 'Get a specific location by ID', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + ] + )] public function getLocation($summit_id, $location_id) { - return $this->processRequest(function () use ($summit_id, $location_id) { + return $this->processRequest(function() use($summit_id, $location_id) { $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -558,6 +702,29 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/events', + summary: 'Get events for a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID or "tbd"', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: title, start_date, end_date, speaker, tags, event_type_id, track_id, type_show_always_on_schedule', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: title, start_date, end_date, id, created, track_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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitEventPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + ] + )] public function getLocationEvents($summit_id, $location_id) { return $this->_getLocationEvents($summit_id, $location_id, false); @@ -568,6 +735,29 @@ public function getLocationEvents($summit_id, $location_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/events/published', + summary: 'Get published events for a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID or "tbd"', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: title, start_date, end_date, speaker, tags, event_type_id, track_id, type_show_always_on_schedule', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: title, start_date, end_date, id, created, track_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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitEventPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + ] + )] public function getLocationPublishedEvents($summit_id, $location_id) { return $this->_getLocationEvents($summit_id, $location_id, true); @@ -577,6 +767,28 @@ public function getLocationPublishedEvents($summit_id, $location_id) * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/metadata', + summary: 'Get location metadata for a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: '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: 'OK', content: new OA\JsonContent(type: 'object')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getMetadata($summit_id) { $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); @@ -594,6 +806,26 @@ public function getMetadata($summit_id) * @param $floor_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + summary: 'Get a venue floor by ID', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + ] + )] public function getVenueFloor($summit_id, $venue_id, $floor_id) { return $this->processRequest(function() use($summit_id, $venue_id, $floor_id){ @@ -632,6 +864,26 @@ public function getVenueFloor($summit_id, $venue_id, $floor_id) * @param $room_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + summary: 'Get a venue room by ID', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + ] + )] public function getVenueRoom($summit_id, $venue_id, $room_id) { return $this->processRequest(function() use($summit_id, $venue_id, $room_id){ @@ -670,6 +922,27 @@ public function getVenueRoom($summit_id, $venue_id, $room_id) * @param $room_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms/{room_id}', + summary: 'Get a room on a specific floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor, or room not found'), + ] + )] public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) { return $this->processRequest(function() use($summit_id, $venue_id, $floor_id , $room_id){ @@ -717,6 +990,33 @@ public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations', + summary: 'Add a new location to a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddLocationPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Location created', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addLocation($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -741,6 +1041,33 @@ public function addLocation($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues', + summary: 'Add a new venue to a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Venue payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenuePayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Venue created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenue')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenue($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -766,6 +1093,33 @@ public function addVenue($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/external-locations', + summary: 'Add a new external location to a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'External location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddExternalLocationPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'External location created', content: new OA\JsonContent(ref: '#/components/schemas/SummitExternalLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addExternalLocation($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -792,6 +1146,33 @@ public function addExternalLocation($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/hotels', + summary: 'Add a new hotel to a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Hotel payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddHotelPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Hotel created', content: new OA\JsonContent(ref: '#/components/schemas/SummitHotel')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addHotel($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -817,6 +1198,33 @@ public function addHotel($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/airports', + summary: 'Add a new airport to a summit', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Airport payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddAirportPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Airport created', content: new OA\JsonContent(ref: '#/components/schemas/SummitAirport')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addAirport($summit_id) { return $this->processRequest(function() use($summit_id){ @@ -844,6 +1252,34 @@ public function addAirport($summit_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors', + summary: 'Add a new floor to a venue', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Floor payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenueFloorPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Floor created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueFloor($summit_id, $venue_id) { return $this->processRequest(function() use($summit_id, $venue_id){ @@ -871,6 +1307,34 @@ public function addVenueFloor($summit_id, $venue_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms', + summary: 'Add a new room to a venue', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenueRoomPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueRoom($summit_id, $venue_id) { return $this->processRequest(function() use($summit_id, $venue_id){ @@ -896,6 +1360,35 @@ public function addVenueRoom($summit_id, $venue_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms', + summary: 'Add a new room to a venue floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenueFloorRoomPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueFloorRoom($summit_id, $venue_id, $floor_id) { return $this->processRequest(function() use($summit_id, $venue_id, $floor_id){ @@ -928,6 +1421,34 @@ public function addVenueFloorRoom($summit_id, $venue_id, $floor_id) * @param $location_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/{location_id}', + summary: 'Update a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateLocationPayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Location updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateLocation($summit_id, $location_id) { return $this->processRequest(function() use($summit_id, $location_id){ @@ -954,6 +1475,34 @@ public function updateLocation($summit_id, $location_id) * @param $venue_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}', + summary: 'Update a venue', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Venue payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenuePayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Venue updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenue')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateVenue($summit_id, $venue_id) { return $this->processRequest(function() use($summit_id, $venue_id){ @@ -982,6 +1531,35 @@ public function updateVenue($summit_id, $venue_id) * @param $floor_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + summary: 'Update a venue floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Floor payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueFloorPayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Floor updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateVenueFloor($summit_id, $venue_id, $floor_id) { return $this->processRequest(function() use($summit_id, $venue_id, $floor_id){ @@ -1012,6 +1590,35 @@ public function updateVenueFloor($summit_id, $venue_id, $floor_id) * @param $room_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + summary: 'Update a venue room', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueRoomPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateVenueRoom($summit_id, $venue_id, $room_id) { return $this->processRequest(function() use($summit_id, $venue_id, $room_id){ @@ -1040,6 +1647,36 @@ public function updateVenueRoom($summit_id, $venue_id, $room_id) * @param $room_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms/{room_id}', + summary: 'Update a room on a specific floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueFloorRoomPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor, or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) { return $this->processRequest(function() use($summit_id, $venue_id, $floor_id, $room_id){ @@ -1069,6 +1706,34 @@ public function updateVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) * @param $hotel_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/hotels/{hotel_id}', + summary: 'Update a hotel', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'hotel_id', in: 'path', required: true, description: 'Hotel ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Hotel payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateHotelPayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Hotel updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitHotel')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or hotel not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateHotel($summit_id, $hotel_id) { return $this->processRequest(function() use($summit_id, $hotel_id){ @@ -1095,6 +1760,34 @@ public function updateHotel($summit_id, $hotel_id) * @param $airport_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/airports/{airport_id}', + summary: 'Update an airport', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'airport_id', in: 'path', required: true, description: 'Airport ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Airport payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateAirportPayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Airport updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitAirport')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or airport not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateAirport($summit_id, $airport_id) { return $this->processRequest(function() use($summit_id, $airport_id){ @@ -1121,6 +1814,34 @@ public function updateAirport($summit_id, $airport_id) * @param $external_location_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/external-locations/{external_location_id}', + summary: 'Update an external location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'external_location_id', in: 'path', required: true, description: 'External location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'External location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateExternalLocationPayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'External location updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitExternalLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or external location not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateExternalLocation($summit_id, $external_location_id) { return $this->processRequest(function() use($summit_id, $external_location_id){ @@ -1151,6 +1872,29 @@ public function updateExternalLocation($summit_id, $external_location_id) * @param $location_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/{location_id}', + summary: 'Delete a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Location deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + ] + )] public function deleteLocation($summit_id, $location_id) { return $this->processRequest(function() use($summit_id, $location_id){ @@ -1171,6 +1915,30 @@ public function deleteLocation($summit_id, $location_id) * @param $floor_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + summary: 'Delete a venue floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Floor deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + ] + )] public function deleteVenueFloor($summit_id, $venue_id, $floor_id) { return $this->processRequest(function() use($summit_id, $venue_id, $floor_id){ @@ -1191,6 +1959,30 @@ public function deleteVenueFloor($summit_id, $venue_id, $floor_id) * @param $room_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + summary: 'Delete a venue room', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Room deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + ] + )] public function deleteVenueRoom($summit_id, $venue_id, $room_id) { return $this->processRequest(function() use($summit_id, $venue_id, $room_id){ @@ -1214,6 +2006,29 @@ public function deleteVenueRoom($summit_id, $venue_id, $room_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/banners', + summary: 'Get all banners for a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: class_name, title, content, type, enabled, start_date, end_date', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, title, start_date, end_date', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBannerPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + ] + )] public function getLocationBanners($summit_id, $location_id) { $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); @@ -1272,6 +2087,34 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) * @param $location_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/{location_id}/banners', + summary: 'Add a banner to a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData, SummitScopes::WriteLocationBannersData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Banner payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddLocationBannerPayload')), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Banner created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBanner')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addLocationBanner($summit_id, $location_id) { return $this->processRequest(function() use($summit_id, $location_id){ @@ -1306,6 +2149,30 @@ public function addLocationBanner($summit_id, $location_id) * @param $banner_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/{location_id}/banners/{banner_id}', + summary: 'Delete a location banner', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData, SummitScopes::WriteLocationBannersData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'banner_id', in: 'path', required: true, description: 'Banner ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Banner deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or banner not found'), + ] + )] public function deleteLocationBanner($summit_id, $location_id, $banner_id) { @@ -1327,6 +2194,35 @@ public function deleteLocationBanner($summit_id, $location_id, $banner_id) * @param $banner_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/{location_id}/banners/{banner_id}', + summary: 'Update a location banner', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData, SummitScopes::WriteLocationBannersData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'banner_id', in: 'path', required: true, description: 'Banner ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Banner payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateLocationBannerPayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Banner updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBanner')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or banner not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateLocationBanner($summit_id, $location_id, $banner_id) { return $this->processRequest(function() use($summit_id, $location_id, $banner_id){ @@ -1368,6 +2264,26 @@ public function updateLocationBanner($summit_id, $location_id, $banner_id) * @param $map_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/maps/{map_id}', + summary: 'Get a location map', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'map_id', in: 'path', required: true, description: 'Map ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map not found'), + ] + )] public function getLocationMap($summit_id, $location_id, $map_id) { return $this->processRequest(function() use($summit_id, $location_id, $map_id){ @@ -1404,6 +2320,33 @@ public function getLocationMap($summit_id, $location_id, $map_id) * @param $location_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/{location_id}/maps', + summary: 'Add a map to a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Map created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addLocationMap(LaravelRequest $request, $summit_id, $location_id) { @@ -1457,6 +2400,34 @@ public function addLocationMap(LaravelRequest $request, $summit_id, $location_id * @param $map_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/{location_id}/maps/{map_id}', + summary: 'Update a location map', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'map_id', in: 'path', required: true, description: 'Map ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Map updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateLocationMap(LaravelRequest $request, $summit_id, $location_id, $map_id) { return $this->processRequest(function() use($request, $summit_id, $location_id, $map_id){ @@ -1504,6 +2475,30 @@ public function updateLocationMap(LaravelRequest $request, $summit_id, $location * @param $map_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/{location_id}/maps/{map_id}', + summary: 'Delete a location map', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'map_id', in: 'path', required: true, description: 'Map ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Map deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map not found'), + ] + )] public function deleteLocationMap($summit_id, $location_id, $map_id) { return $this->processRequest(function() use($summit_id, $location_id, $map_id){ @@ -1524,6 +2519,26 @@ public function deleteLocationMap($summit_id, $location_id, $map_id) * @param $image_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/images/{image_id}', + summary: 'Get a location image', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'image_id', in: 'path', required: true, description: 'Image ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image not found'), + ] + )] public function getLocationImage($summit_id, $location_id, $image_id) { return $this->processRequest(function() use($summit_id, $location_id, $image_id){ @@ -1560,6 +2575,33 @@ public function getLocationImage($summit_id, $location_id, $image_id) * @param $location_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/{location_id}/images', + summary: 'Add an image to a location', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Image created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addLocationImage(LaravelRequest $request, $summit_id, $location_id) { return $this->processRequest(function() use($request, $summit_id, $location_id){ @@ -1612,6 +2654,35 @@ public function addLocationImage(LaravelRequest $request, $summit_id, $location_ * @param $image_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/{location_id}/images/{image_id}', + summary: 'Update a location image', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'image_id', in: 'path', required: true, description: 'Image ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + requestBody: new OA\RequestBody(description: 'Image payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateLocationImagePayload')), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Image updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateLocationImage(LaravelRequest $request, $summit_id, $location_id, $image_id) { return $this->processRequest(function() use($request, $summit_id, $location_id, $image_id){ @@ -1647,6 +2718,30 @@ public function updateLocationImage(LaravelRequest $request, $summit_id, $locati * @param $image_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/{location_id}/images/{image_id}', + summary: 'Delete a location image', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'image_id', in: 'path', required: true, description: 'Image ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Image deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image not found'), + ] + )] public function deleteLocationImage($summit_id, $location_id, $image_id) { return $this->processRequest(function() use($summit_id, $location_id, $image_id){ @@ -1664,6 +2759,34 @@ public function deleteLocationImage($summit_id, $location_id, $image_id) * @param $room_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}/image', + summary: 'Add an image to a venue room', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueRoomImage(LaravelRequest $request, $summit_id, $venue_id, $room_id) { return $this->processRequest(function() use($request, $summit_id, $venue_id, $room_id){ @@ -1711,6 +2834,33 @@ public function addVenueRoomImage(LaravelRequest $request, $summit_id, $venue_id * @param $room_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}/image', + summary: 'Remove image from a venue room', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Room image removed', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + ] + )] public function removeVenueRoomImage($summit_id, $venue_id, $room_id) { return $this->processRequest(function() use($summit_id, $venue_id, $room_id){ @@ -1754,6 +2904,34 @@ public function removeVenueRoomImage($summit_id, $venue_id, $room_id) * @param $floor_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/image', + summary: 'Add an image to a venue floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Floor image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueFloorImage(LaravelRequest $request, $summit_id, $venue_id, $floor_id) { return $this->processRequest(function() use($request, $summit_id, $venue_id, $floor_id) { @@ -1802,6 +2980,33 @@ public function addVenueFloorImage(LaravelRequest $request, $summit_id, $venue_i * @param $floor_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/image', + summary: 'Remove image from a venue floor', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Floor image removed', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + ] + )] public function removeVenueFloorImage($summit_id, $venue_id, $floor_id) { return $this->processRequest(function () use($summit_id, $venue_id, $floor_id) { @@ -1848,6 +3053,29 @@ public function removeVenueFloorImage($summit_id, $venue_id, $floor_id) * @param $target_summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/copy/{target_summit_id}', + summary: 'Copy locations from one summit to another', + tags: ['Summit Locations'], + security: [ + ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData, SummitScopes::WriteLocationBannersData]], + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ], + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Source summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'target_summit_id', in: 'path', required: true, description: 'Target summit ID or slug', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Locations copied successfully'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Source or target summit not found'), + ] + )] public function copy(LaravelRequest $request, $source_summit_id, $target_summit_id) { return $this->processRequest(function() use($request, $source_summit_id, $target_summit_id) { diff --git a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php index 4a3fa34d4..675f77fa2 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php +++ b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php @@ -25,6 +25,8 @@ use models\summit\SummitRoomReservation; use models\summit\SummitVenue; use ModelSerializers\SerializerRegistry; +use OpenApi\Attributes as OA; +use Symfony\Component\HttpFoundation\Response; use utils\Filter; use utils\FilterParser; use utils\PagingInfo; @@ -47,6 +49,22 @@ trait SummitBookableVenueRoomApi * @param $id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/bookable-rooms/all/reservations/{reservation_id}', + summary: 'Get a reservation by ID', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Reservation not found'), + ] + )] public function getReservationById($id) { return $this->processRequest(function () use ($id) { @@ -69,6 +87,25 @@ public function getReservationById($id) * @param $summit_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms', + summary: 'Get all bookable venue rooms for a summit', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, description, capacity, availability_day, attribute', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, name, capacity', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoomPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getBookableVenueRooms($summit_id) { @@ -130,6 +167,25 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations', + summary: 'Get all reservations for a summit', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: summit_id, room_name, room_id, owner_id, owner_name, owner_email, not_owner_email, status, start_datetime, end_datetime', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, start_datetime, end_datetime, room_name, room_id, status, created, owner_name, owner_email', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservationPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getAllReservationsBySummit($summit_id) { @@ -202,6 +258,20 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/csv', + summary: 'Export reservations for a summit as CSV', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: summit_id, room_name, room_id, owner_id, owner_name, owner_email, not_owner_email, status, start_datetime, end_datetime', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, start_datetime, end_datetime, room_name, room_id, status, created, owner_name, owner_email', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'CSV file', content: new OA\MediaType(mediaType: 'text/csv')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getAllReservationsBySummitCSV($summit_id) { @@ -288,6 +358,23 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $room_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + summary: 'Get a bookable venue room by venue and room ID', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + ] + )] public function getBookableVenueRoomByVenue($summit_id, $venue_id, $room_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $room_id) { @@ -321,6 +408,22 @@ public function getBookableVenueRoomByVenue($summit_id, $venue_id, $room_id) * @param $room_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}', + summary: 'Get a bookable venue room by ID', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), + ] + )] public function getBookableVenueRoom($summit_id, $room_id) { return $this->processRequest(function () use ($summit_id, $room_id) { @@ -348,6 +451,23 @@ public function getBookableVenueRoom($summit_id, $room_id) * @param $day * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/availability/{day}', + summary: 'Get availability slots for a bookable room on a specific day', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'day', in: 'path', required: true, description: 'Day (epoch timestamp or Y-m-d format)', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(type: 'object')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), + ] + )] public function getBookableVenueRoomAvailability($summit_id, $room_id, $day) { return $this->processRequest(function () use ($summit_id, $room_id, $day) { @@ -424,6 +544,23 @@ public function getBookableVenueRoomAvailability($summit_id, $room_id, $day) * @param $room_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations', + summary: 'Create a reservation for a bookable room', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Reservation created', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function createBookableVenueRoomReservation($summit_id, $room_id) { return $this->processRequest(function () use ($summit_id, $room_id) { @@ -458,6 +595,23 @@ public function createBookableVenueRoomReservation($summit_id, $room_id) * @param $room_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/offline', + summary: 'Create an offline reservation for a bookable room', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Offline reservation created', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function createOfflineBookableVenueRoomReservation($summit_id, $room_id) { return $this->processRequest(function () use ($summit_id, $room_id) { @@ -489,6 +643,24 @@ public function createOfflineBookableVenueRoomReservation($summit_id, $room_id) * @param $room_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + summary: 'Update a bookable room reservation', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Reservation updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateBookableVenueRoomReservation($summit_id, $room_id, $reservation_id) { return $this->processRequest(function () use ($summit_id, $room_id, $reservation_id) { @@ -519,6 +691,22 @@ public function updateBookableVenueRoomReservation($summit_id, $room_id, $reserv * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me', + summary: 'Get my bookable room reservations for a summit', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservationPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Not authenticated'), + ] + )] public function getMyBookableVenueRoomReservations($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -557,6 +745,20 @@ public function getMyBookableVenueRoomReservations($summit_id) * @param $reservation_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me/{reservation_id}', + summary: 'Cancel my bookable room reservation', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Reservation cancelled', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or reservation not found'), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Not authenticated'), + ] + )] public function cancelMyBookableVenueRoomReservation($summit_id, $reservation_id) { return $this->processRequest(function () use ($summit_id, $reservation_id) { @@ -582,6 +784,24 @@ public function cancelMyBookableVenueRoomReservation($summit_id, $reservation_id * @param $room_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + summary: 'Update a bookable venue room', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateVenueBookableRoom($summit_id, $venue_id, $room_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $room_id) { @@ -617,6 +837,24 @@ public function updateVenueBookableRoom($summit_id, $venue_id, $room_id) }); } + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', + summary: 'Get a bookable venue room by floor', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor or room not found'), + ] + )] public function getVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $room_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $floor_id, $room_id) { @@ -661,6 +899,25 @@ public function getVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $roo * @param $room_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', + summary: 'Update a bookable venue room by floor', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function updateVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $room_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $floor_id, $room_id) { @@ -698,6 +955,20 @@ public function updateVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $ }); } + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + summary: 'Delete a bookable venue room', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Room deleted'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue or room not found'), + ] + )] public function deleteVenueBookableRoom($summit_id, $venue_id, $room_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $room_id) { @@ -716,6 +987,23 @@ public function deleteVenueBookableRoom($summit_id, $venue_id, $room_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms', + summary: 'Add a bookable room to a venue', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueBookableRoom($summit_id, $venue_id) { return $this->processRequest(function () use ($summit_id, $venue_id) { @@ -754,6 +1042,24 @@ public function addVenueBookableRoom($summit_id, $venue_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms', + summary: 'Add a bookable room to a venue floor', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'floor_id', in: 'path', required: true, description: 'Floor ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue or floor not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addVenueFloorBookableRoom($summit_id, $venue_id, $floor_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $floor_id) { @@ -796,6 +1102,24 @@ public function addVenueFloorBookableRoom($summit_id, $venue_id, $floor_id) * @param $attribute_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', + summary: 'Add an attribute to a bookable venue room', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'attribute_id', in: 'path', required: true, description: 'Attribute ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Attribute added', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, room or attribute not found'), + ] + )] public function addVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $attribute_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $room_id, $attribute_id) { @@ -826,6 +1150,21 @@ public function addVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $ * @param $attribute_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', + summary: 'Remove an attribute from a bookable venue room', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'attribute_id', in: 'path', required: true, description: 'Attribute ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Attribute removed', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, room or attribute not found'), + ] + )] public function deleteVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $attribute_id) { return $this->processRequest(function () use ($summit_id, $venue_id, $room_id, $attribute_id) { @@ -846,6 +1185,21 @@ public function deleteVenueBookableRoomAttribute($summit_id, $venue_id, $room_id }); } + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/refund', + summary: 'Refund a bookable room reservation', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Reservation refunded', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function refundBookableVenueRoomReservation($summit_id, $room_id, $reservation_id) { return $this->processRequest(function () use ($summit_id, $room_id, $reservation_id) { @@ -873,6 +1227,20 @@ public function refundBookableVenueRoomReservation($summit_id, $room_id, $reserv }); } + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + summary: 'Cancel a bookable room reservation', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Reservation cancelled'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), + ] + )] public function cancelBookableVenueRoomReservation($summit_id, $room_id, $reservation_id) { return $this->processRequest(function () use ($summit_id, $room_id, $reservation_id) { @@ -890,4 +1258,4 @@ public function cancelBookableVenueRoomReservation($summit_id, $room_id, $reserv return $this->deleted(); }); } -} \ No newline at end of file +} diff --git a/app/Swagger/Models/SummitAbstractLocationSchema.php b/app/Swagger/Models/SummitAbstractLocationSchema.php new file mode 100644 index 000000000..99f86e62b --- /dev/null +++ b/app/Swagger/Models/SummitAbstractLocationSchema.php @@ -0,0 +1,35 @@ + 'Read All Summit Data', + SummitScopes::ReadSummitData => 'Read Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteLocationsData => 'Write Locations Data', + SummitScopes::WriteLocationBannersData => 'Write Location Banners Data', + ], + ), + ], +) +] +class LocationsAuthSchema +{ +} From 8b8d3b9f802f94eae720e03f5fa69d85eca66ce5 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Fri, 16 Jan 2026 22:03:14 +0000 Subject: [PATCH 02/10] chore: Rename Not Found and add operationIds Signed-off-by: Matias Perrone --- .../OAuth2SummitLocationsApiController.php | 207 +++++++++++++----- 1 file changed, 158 insertions(+), 49 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index 0d53ba84e..80d6c0ee2 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -151,6 +151,7 @@ public function __construct */ #[OA\Get( path: '/api/v1/summits/{id}/locations', + operationId: 'getSummitLocations', summary: 'Get all locations for a summit', tags: ['Summit Locations'], security: [ @@ -168,7 +169,7 @@ public function __construct ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocationPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getLocations($summit_id) @@ -241,6 +242,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { */ #[OA\Get( path: '/api/v1/summits/{id}/locations/venues', + operationId: 'getSummitVenues', summary: 'Get all venues for a summit', tags: ['Summit Locations'], security: [ @@ -258,7 +260,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenuePaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getVenues($summit_id) @@ -332,6 +334,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/rooms/all', + operationId: 'getAllSummitVenueRooms', summary: 'Get all venue rooms for a summit', tags: ['Summit Locations'], security: [ @@ -349,7 +352,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoomPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getAllVenuesRooms($summit_id){ @@ -408,6 +411,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { */ #[OA\Get( path: '/api/v1/summits/{id}/locations/external-locations', + operationId: 'getSummitExternalLocations', summary: 'Get all external locations for a summit', tags: ['Summit Locations'], security: [ @@ -421,7 +425,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitExternalLocationPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getExternalLocations($summit_id) @@ -461,6 +465,7 @@ public function getExternalLocations($summit_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/hotels', + operationId: 'getSummitHotels', summary: 'Get all hotels for a summit', tags: ['Summit Locations'], security: [ @@ -474,7 +479,7 @@ public function getExternalLocations($summit_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitHotelPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getHotels($summit_id) @@ -513,6 +518,7 @@ public function getHotels($summit_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/airports', + operationId: 'getSummitAirports', summary: 'Get all airports for a summit', tags: ['Summit Locations'], security: [ @@ -526,7 +532,7 @@ public function getHotels($summit_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAirportPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getAirports($summit_id) @@ -565,8 +571,27 @@ public function getAirports($summit_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/locations/{location_id}', + operationId: 'getLocationByIdPublic', + summary: 'Get a specific location by ID (Public)', + tags: ['Summit Locations (Public)'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), + ] + )] + #[OA\Get( path: '/api/v1/summits/{id}/locations/{location_id}', + operationId: 'getLocationById', summary: 'Get a specific location by ID', tags: ['Summit Locations'], security: [ @@ -581,7 +606,7 @@ public function getAirports($summit_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getLocation($summit_id, $location_id) @@ -704,6 +729,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/{location_id}/events', + operationId: 'getLocationEvents', summary: 'Get events for a location', tags: ['Summit Locations'], security: [ @@ -722,7 +748,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitEventPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), ] )] public function getLocationEvents($summit_id, $location_id) @@ -735,8 +761,30 @@ public function getLocationEvents($summit_id, $location_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/locations/{location_id}/events/published', + operationId: 'getLocationPublishedEventsPublic', + summary: 'Get published events for a location (Public)', + tags: ['Summit Locations (Public)'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID or "tbd"', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: title, start_date, end_date, speaker, tags, event_type_id, track_id, type_show_always_on_schedule', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: title, start_date, end_date, id, created, track_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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitEventPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), + ] + )] #[OA\Get( path: '/api/v1/summits/{id}/locations/{location_id}/events/published', + operationId: 'getLocationPublishedEvents', summary: 'Get published events for a location', tags: ['Summit Locations'], security: [ @@ -755,7 +803,7 @@ public function getLocationEvents($summit_id, $location_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitEventPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), ] )] public function getLocationPublishedEvents($summit_id, $location_id) @@ -769,6 +817,7 @@ public function getLocationPublishedEvents($summit_id, $location_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/metadata', + operationId: 'getSummitLocationsMetadata', summary: 'Get location metadata for a summit', tags: ['Summit Locations'], security: [ @@ -786,7 +835,7 @@ public function getLocationPublishedEvents($summit_id, $location_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(type: 'object')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), ] )] public function getMetadata($summit_id) @@ -808,6 +857,7 @@ public function getMetadata($summit_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + operationId: 'getVenueFloorById', summary: 'Get a venue floor by ID', tags: ['Summit Locations'], security: [ @@ -823,7 +873,7 @@ public function getMetadata($summit_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), ] )] public function getVenueFloor($summit_id, $venue_id, $floor_id) @@ -866,6 +916,7 @@ public function getVenueFloor($summit_id, $venue_id, $floor_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + operationId: 'getVenueRoomById', summary: 'Get a venue room by ID', tags: ['Summit Locations'], security: [ @@ -881,7 +932,7 @@ public function getVenueFloor($summit_id, $venue_id, $floor_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), ] )] public function getVenueRoom($summit_id, $venue_id, $room_id) @@ -924,6 +975,7 @@ public function getVenueRoom($summit_id, $venue_id, $room_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms/{room_id}', + operationId: 'getVenueFloorRoomById', summary: 'Get a room on a specific floor', tags: ['Summit Locations'], security: [ @@ -940,7 +992,7 @@ public function getVenueRoom($summit_id, $venue_id, $room_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor, or room Not Found'), ] )] public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) @@ -992,6 +1044,7 @@ public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations', + operationId: 'addSummitLocation', summary: 'Add a new location to a summit', tags: ['Summit Locations'], security: [ @@ -1013,7 +1066,7 @@ public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) requestBody: new OA\RequestBody(description: 'Location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddLocationPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Location created', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1043,6 +1096,7 @@ public function addLocation($summit_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues', + operationId: 'addSummitVenue', summary: 'Add a new venue to a summit', tags: ['Summit Locations'], security: [ @@ -1064,7 +1118,7 @@ public function addLocation($summit_id) requestBody: new OA\RequestBody(description: 'Venue payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenuePayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Venue created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenue')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1095,6 +1149,7 @@ public function addVenue($summit_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/external-locations', + operationId: 'addSummitExternalLocation', summary: 'Add a new external location to a summit', tags: ['Summit Locations'], security: [ @@ -1116,7 +1171,7 @@ public function addVenue($summit_id) requestBody: new OA\RequestBody(description: 'External location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddExternalLocationPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'External location created', content: new OA\JsonContent(ref: '#/components/schemas/SummitExternalLocation')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1148,6 +1203,7 @@ public function addExternalLocation($summit_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/hotels', + operationId: 'addSummitHotel', summary: 'Add a new hotel to a summit', tags: ['Summit Locations'], security: [ @@ -1169,7 +1225,7 @@ public function addExternalLocation($summit_id) requestBody: new OA\RequestBody(description: 'Hotel payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddHotelPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Hotel created', content: new OA\JsonContent(ref: '#/components/schemas/SummitHotel')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1200,6 +1256,7 @@ public function addHotel($summit_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/airports', + operationId: 'addSummitAirport', summary: 'Add a new airport to a summit', tags: ['Summit Locations'], security: [ @@ -1221,7 +1278,7 @@ public function addHotel($summit_id) requestBody: new OA\RequestBody(description: 'Airport payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddAirportPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Airport created', content: new OA\JsonContent(ref: '#/components/schemas/SummitAirport')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1254,6 +1311,7 @@ public function addAirport($summit_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors', + operationId: 'addVenueFloor', summary: 'Add a new floor to a venue', tags: ['Summit Locations'], security: [ @@ -1276,7 +1334,7 @@ public function addAirport($summit_id) requestBody: new OA\RequestBody(description: 'Floor payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenueFloorPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Floor created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1309,6 +1367,7 @@ public function addVenueFloor($summit_id, $venue_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms', + operationId: 'addVenueRoom', summary: 'Add a new room to a venue', tags: ['Summit Locations'], security: [ @@ -1331,7 +1390,7 @@ public function addVenueFloor($summit_id, $venue_id) requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenueRoomPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1362,6 +1421,7 @@ public function addVenueRoom($summit_id, $venue_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms', + operationId: 'addVenueFloorRoom', summary: 'Add a new room to a venue floor', tags: ['Summit Locations'], security: [ @@ -1385,7 +1445,7 @@ public function addVenueRoom($summit_id, $venue_id) requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddVenueFloorRoomPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1423,6 +1483,7 @@ public function addVenueFloorRoom($summit_id, $venue_id, $floor_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/{location_id}', + operationId: 'updateSummitLocation', summary: 'Update a location', tags: ['Summit Locations'], security: [ @@ -1445,7 +1506,7 @@ public function addVenueFloorRoom($summit_id, $venue_id, $floor_id) requestBody: new OA\RequestBody(description: 'Location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateLocationPayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Location updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1477,6 +1538,7 @@ public function updateLocation($summit_id, $location_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}', + operationId: 'updateSummitVenue', summary: 'Update a venue', tags: ['Summit Locations'], security: [ @@ -1499,7 +1561,7 @@ public function updateLocation($summit_id, $location_id) requestBody: new OA\RequestBody(description: 'Venue payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenuePayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Venue updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenue')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1533,6 +1595,7 @@ public function updateVenue($summit_id, $venue_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + operationId: 'updateVenueFloor', summary: 'Update a venue floor', tags: ['Summit Locations'], security: [ @@ -1556,7 +1619,7 @@ public function updateVenue($summit_id, $venue_id) requestBody: new OA\RequestBody(description: 'Floor payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueFloorPayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Floor updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1592,6 +1655,7 @@ public function updateVenueFloor($summit_id, $venue_id, $floor_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + operationId: 'updateVenueRoom', summary: 'Update a venue room', tags: ['Summit Locations'], security: [ @@ -1615,7 +1679,7 @@ public function updateVenueFloor($summit_id, $venue_id, $floor_id) requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueRoomPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1649,6 +1713,7 @@ public function updateVenueRoom($summit_id, $venue_id, $room_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/rooms/{room_id}', + operationId: 'updateVenueFloorRoom', summary: 'Update a room on a specific floor', tags: ['Summit Locations'], security: [ @@ -1673,7 +1738,7 @@ public function updateVenueRoom($summit_id, $venue_id, $room_id) requestBody: new OA\RequestBody(description: 'Room payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueFloorRoomPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor, or room Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1708,6 +1773,7 @@ public function updateVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/hotels/{hotel_id}', + operationId: 'updateSummitHotel', summary: 'Update a hotel', tags: ['Summit Locations'], security: [ @@ -1730,7 +1796,7 @@ public function updateVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) requestBody: new OA\RequestBody(description: 'Hotel payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateHotelPayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Hotel updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitHotel')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or hotel not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or hotel Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1762,6 +1828,7 @@ public function updateHotel($summit_id, $hotel_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/airports/{airport_id}', + operationId: 'updateSummitAirport', summary: 'Update an airport', tags: ['Summit Locations'], security: [ @@ -1784,7 +1851,7 @@ public function updateHotel($summit_id, $hotel_id) requestBody: new OA\RequestBody(description: 'Airport payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateAirportPayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Airport updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitAirport')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or airport not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or airport Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1816,6 +1883,7 @@ public function updateAirport($summit_id, $airport_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/external-locations/{external_location_id}', + operationId: 'updateSummitExternalLocation', summary: 'Update an external location', tags: ['Summit Locations'], security: [ @@ -1838,7 +1906,7 @@ public function updateAirport($summit_id, $airport_id) requestBody: new OA\RequestBody(description: 'External location payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateExternalLocationPayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'External location updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitExternalLocation')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or external location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or external location Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -1874,6 +1942,7 @@ public function updateExternalLocation($summit_id, $external_location_id) */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/{location_id}', + operationId: 'deleteSummitLocation', summary: 'Delete a location', tags: ['Summit Locations'], security: [ @@ -1892,7 +1961,7 @@ public function updateExternalLocation($summit_id, $external_location_id) ], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Location deleted'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), ] )] public function deleteLocation($summit_id, $location_id) @@ -1917,6 +1986,7 @@ public function deleteLocation($summit_id, $location_id) */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + operationId: 'deleteVenueFloor', summary: 'Delete a venue floor', tags: ['Summit Locations'], security: [ @@ -1936,7 +2006,7 @@ public function deleteLocation($summit_id, $location_id) ], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Floor deleted'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), ] )] public function deleteVenueFloor($summit_id, $venue_id, $floor_id) @@ -1961,6 +2031,7 @@ public function deleteVenueFloor($summit_id, $venue_id, $floor_id) */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}', + operationId: 'deleteVenueRoom', summary: 'Delete a venue room', tags: ['Summit Locations'], security: [ @@ -1980,7 +2051,7 @@ public function deleteVenueFloor($summit_id, $venue_id, $floor_id) ], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Room deleted'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), ] )] public function deleteVenueRoom($summit_id, $venue_id, $room_id) @@ -2006,8 +2077,30 @@ public function deleteVenueRoom($summit_id, $venue_id, $room_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/locations/{location_id}/banners', + operationId: 'getLocationBannersPublic', + summary: 'Get all banners for a location', + tags: ['Summit Locations (Public)'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: class_name, title, content, type, enabled, start_date, end_date', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, title, start_date, end_date', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBannerPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), + ] + )] #[OA\Get( path: '/api/v1/summits/{id}/locations/{location_id}/banners', + operationId: 'getLocationBanners', summary: 'Get all banners for a location', tags: ['Summit Locations'], security: [ @@ -2026,7 +2119,7 @@ public function deleteVenueRoom($summit_id, $venue_id, $room_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBannerPaginatedResponse')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), ] )] public function getLocationBanners($summit_id, $location_id) @@ -2089,6 +2182,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/{location_id}/banners', + operationId: 'addLocationBanner', summary: 'Add a banner to a location', tags: ['Summit Locations'], security: [ @@ -2111,7 +2205,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) requestBody: new OA\RequestBody(description: 'Banner payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/AddLocationBannerPayload')), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Banner created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBanner')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2151,6 +2245,7 @@ public function addLocationBanner($summit_id, $location_id) */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/{location_id}/banners/{banner_id}', + operationId: 'deleteLocationBanner', summary: 'Delete a location banner', tags: ['Summit Locations'], security: [ @@ -2170,7 +2265,7 @@ public function addLocationBanner($summit_id, $location_id) ], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Banner deleted'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or banner not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or banner Not Found'), ] )] public function deleteLocationBanner($summit_id, $location_id, $banner_id) @@ -2196,6 +2291,7 @@ public function deleteLocationBanner($summit_id, $location_id, $banner_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/{location_id}/banners/{banner_id}', + operationId: 'updateLocationBanner', summary: 'Update a location banner', tags: ['Summit Locations'], security: [ @@ -2219,7 +2315,7 @@ public function deleteLocationBanner($summit_id, $location_id, $banner_id) requestBody: new OA\RequestBody(description: 'Banner payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateLocationBannerPayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Banner updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBanner')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or banner not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or banner Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2266,6 +2362,7 @@ public function updateLocationBanner($summit_id, $location_id, $banner_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/{location_id}/maps/{map_id}', + operationId: 'getLocationMap', summary: 'Get a location map', tags: ['Summit Locations'], security: [ @@ -2281,7 +2378,7 @@ public function updateLocationBanner($summit_id, $location_id, $banner_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map Not Found'), ] )] public function getLocationMap($summit_id, $location_id, $map_id) @@ -2322,6 +2419,7 @@ public function getLocationMap($summit_id, $location_id, $map_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/{location_id}/maps', + operationId: 'addLocationMap', summary: 'Add a map to a location', tags: ['Summit Locations'], security: [ @@ -2343,7 +2441,7 @@ public function getLocationMap($summit_id, $location_id, $map_id) ], responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Map created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2402,6 +2500,7 @@ public function addLocationMap(LaravelRequest $request, $summit_id, $location_id */ #[OA\Put( path: '/api/v1/summits/{id}/locations/{location_id}/maps/{map_id}', + operationId: 'updateLocationMap', summary: 'Update a location map', tags: ['Summit Locations'], security: [ @@ -2424,7 +2523,7 @@ public function addLocationMap(LaravelRequest $request, $summit_id, $location_id ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Map updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2477,6 +2576,7 @@ public function updateLocationMap(LaravelRequest $request, $summit_id, $location */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/{location_id}/maps/{map_id}', + operationId: 'deleteLocationMap', summary: 'Delete a location map', tags: ['Summit Locations'], security: [ @@ -2496,7 +2596,7 @@ public function updateLocationMap(LaravelRequest $request, $summit_id, $location ], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Map deleted'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map Not Found'), ] )] public function deleteLocationMap($summit_id, $location_id, $map_id) @@ -2521,6 +2621,7 @@ public function deleteLocationMap($summit_id, $location_id, $map_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/{location_id}/images/{image_id}', + operationId: 'getLocationImage', summary: 'Get a location image', tags: ['Summit Locations'], security: [ @@ -2536,7 +2637,7 @@ public function deleteLocationMap($summit_id, $location_id, $map_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image Not Found'), ] )] public function getLocationImage($summit_id, $location_id, $image_id) @@ -2577,6 +2678,7 @@ public function getLocationImage($summit_id, $location_id, $image_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/{location_id}/images', + operationId: 'addLocationImage', summary: 'Add an image to a location', tags: ['Summit Locations'], security: [ @@ -2598,7 +2700,7 @@ public function getLocationImage($summit_id, $location_id, $image_id) ], responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Image created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or location not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2656,6 +2758,7 @@ public function addLocationImage(LaravelRequest $request, $summit_id, $location_ */ #[OA\Put( path: '/api/v1/summits/{id}/locations/{location_id}/images/{image_id}', + operationId: 'updateLocationImage', summary: 'Update a location image', tags: ['Summit Locations'], security: [ @@ -2679,7 +2782,7 @@ public function addLocationImage(LaravelRequest $request, $summit_id, $location_ requestBody: new OA\RequestBody(description: 'Image payload', required: true, content: new OA\JsonContent(ref: '#/components/schemas/UpdateLocationImagePayload')), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Image updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2720,6 +2823,7 @@ public function updateLocationImage(LaravelRequest $request, $summit_id, $locati */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/{location_id}/images/{image_id}', + operationId: 'deleteLocationImage', summary: 'Delete a location image', tags: ['Summit Locations'], security: [ @@ -2739,7 +2843,7 @@ public function updateLocationImage(LaravelRequest $request, $summit_id, $locati ], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Image deleted'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or image Not Found'), ] )] public function deleteLocationImage($summit_id, $location_id, $image_id) @@ -2761,6 +2865,7 @@ public function deleteLocationImage($summit_id, $location_id, $image_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}/image', + operationId: 'addVenueRoomImage', summary: 'Add an image to a venue room', tags: ['Summit Locations'], security: [ @@ -2783,7 +2888,7 @@ public function deleteLocationImage($summit_id, $location_id, $image_id) ], responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2836,6 +2941,7 @@ public function addVenueRoomImage(LaravelRequest $request, $summit_id, $venue_id */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms/{room_id}/image', + operationId: 'removeVenueRoomImage', summary: 'Remove image from a venue room', tags: ['Summit Locations'], security: [ @@ -2858,7 +2964,7 @@ public function addVenueRoomImage(LaravelRequest $request, $summit_id, $venue_id ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Room image removed', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueRoom')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), ] )] public function removeVenueRoomImage($summit_id, $venue_id, $room_id) @@ -2906,6 +3012,7 @@ public function removeVenueRoomImage($summit_id, $venue_id, $room_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/image', + operationId: 'addVenueFloorImage', summary: 'Add an image to a venue floor', tags: ['Summit Locations'], security: [ @@ -2928,7 +3035,7 @@ public function removeVenueRoomImage($summit_id, $venue_id, $room_id) ], responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Floor image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), ] )] @@ -2982,6 +3089,7 @@ public function addVenueFloorImage(LaravelRequest $request, $summit_id, $venue_i */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/image', + operationId: 'removeVenueFloorImage', summary: 'Remove image from a venue floor', tags: ['Summit Locations'], security: [ @@ -3004,7 +3112,7 @@ public function addVenueFloorImage(LaravelRequest $request, $summit_id, $venue_i ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Floor image removed', content: new OA\JsonContent(ref: '#/components/schemas/SummitVenueFloor')), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), ] )] public function removeVenueFloorImage($summit_id, $venue_id, $floor_id) @@ -3055,6 +3163,7 @@ public function removeVenueFloorImage($summit_id, $venue_id, $floor_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/copy/{target_summit_id}', + operationId: 'copySummitLocations', summary: 'Copy locations from one summit to another', tags: ['Summit Locations'], security: [ @@ -3073,7 +3182,7 @@ public function removeVenueFloorImage($summit_id, $venue_id, $floor_id) ], responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Locations copied successfully'), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Source or target summit not found'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Source or target summit Not Found'), ] )] public function copy(LaravelRequest $request, $source_summit_id, $target_summit_id) From 474ca8db9ca7f2329c9c0577e9d6222414cb6d6b Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 20 Jan 2026 22:14:48 +0000 Subject: [PATCH 03/10] chore: Add documentation in trait Signed-off-by: Matias Perrone --- .../Traits/SummitBookableVenueRoomApi.php | 75 +++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php index 675f77fa2..34433124d 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php +++ b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php @@ -50,12 +50,11 @@ trait SummitBookableVenueRoomApi * @return mixed */ #[OA\Get( - path: '/api/v1/summits/{id}/bookable-rooms/all/reservations/{reservation_id}', + path: '/api/v1/summits/all/locations/bookable-rooms/all/reservations/{id}', summary: 'Get a reservation by ID', tags: ['Summit Locations'], parameters: [ - new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), - new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), @@ -106,6 +105,25 @@ public function getReservationById($id) new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), ] )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/all/bookable-rooms', + summary: 'Get all bookable venue rooms for a summit', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, description, capacity, availability_day, attribute', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, name, capacity', 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)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoomPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit not found'), + ] + )] public function getBookableVenueRooms($summit_id) { @@ -687,6 +705,53 @@ public function updateBookableVenueRoomReservation($summit_id, $room_id, $reserv }); } + /** + * @param $summit_id + * @param $room_id + * @param $reservation_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + summary: 'Get a bookable room reservation by ID', + tags: ['Summit Locations'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), + ] + )] + public function getBookableVenueRoomReservation($summit_id, $room_id, $reservation_id) + { + return $this->processRequest(function () use ($summit_id, $room_id, $reservation_id) { + + $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); + if (!$summit instanceof Summit) + return $this->error404(); + + $room = $summit->getLocation(intval($room_id)); + if (!$room instanceof SummitBookableVenueRoom) + return $this->error404(); + + $reservation = $room->getReservationById(intval($reservation_id)); + if (!$reservation instanceof SummitRoomReservation) + return $this->error404(); + + return $this->ok(SerializerRegistry::getInstance()->getSerializer($reservation)->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + )); + }); + } + /** * @param $summit_id * @return mixed @@ -746,7 +811,7 @@ public function getMyBookableVenueRoomReservations($summit_id) * @return mixed */ #[OA\Delete( - path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me/{reservation_id}', + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/{reservation_id}', summary: 'Cancel my bookable room reservation', tags: ['Summit Locations'], parameters: [ @@ -1228,7 +1293,7 @@ public function refundBookableVenueRoomReservation($summit_id, $room_id, $reserv } #[OA\Delete( - path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/cancel', summary: 'Cancel a bookable room reservation', tags: ['Summit Locations'], parameters: [ From f3d6dcec91e2c476da82ab2221575b2e057c3da9 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 21 Jan 2026 20:44:55 +0000 Subject: [PATCH 04/10] chore: add operationId Signed-off-by: Matias Perrone --- .../Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php index 34433124d..f477f40ae 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php +++ b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php @@ -88,6 +88,7 @@ public function getReservationById($id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms', + operationId: 'getBookableVenueRooms', summary: 'Get all bookable venue rooms for a summit', tags: ['Summit Locations'], parameters: [ @@ -107,6 +108,7 @@ public function getReservationById($id) )] #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/all/bookable-rooms', + operationId: 'getBookableVenueAllRooms', summary: 'Get all bookable venue rooms for a summit', tags: ['Summit Locations'], parameters: [ From 6841f136ea81bd2b496102cf1c662235afb1ec43 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 21 Jan 2026 20:45:58 +0000 Subject: [PATCH 05/10] chore: fix path for getAllVenuesRooms Signed-off-by: Matias Perrone --- .../Protected/Summit/OAuth2SummitLocationsApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index 80d6c0ee2..f568f5a50 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -333,7 +333,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { } #[OA\Get( - path: '/api/v1/summits/{id}/locations/venues/rooms/all', + path: '/api/v1/summits/{id}/locations/venues/all/rooms', operationId: 'getAllSummitVenueRooms', summary: 'Get all venue rooms for a summit', tags: ['Summit Locations'], From 818eac2a15e5eccfb890f08a1efe86c0e7d2acc5 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Wed, 21 Jan 2026 20:47:56 +0000 Subject: [PATCH 06/10] chore: format security attribute en OpenAPI Signed-off-by: Matias Perrone --- .../OAuth2SummitLocationsApiController.php | 315 +++++++++++++++--- 1 file changed, 270 insertions(+), 45 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index f568f5a50..184523adb 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -155,7 +155,12 @@ public function __construct summary: 'Get all locations for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -246,7 +251,12 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { summary: 'Get all venues for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -338,7 +348,12 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { summary: 'Get all venue rooms for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -415,7 +430,12 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { summary: 'Get all external locations for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -469,7 +489,12 @@ public function getExternalLocations($summit_id) summary: 'Get all hotels for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -522,7 +547,12 @@ public function getHotels($summit_id) summary: 'Get all airports for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -595,7 +625,12 @@ public function getAirports($summit_id) summary: 'Get a specific location by ID', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -733,7 +768,12 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($location) summary: 'Get events for a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -788,7 +828,12 @@ public function getLocationEvents($summit_id, $location_id) summary: 'Get published events for a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -821,7 +866,12 @@ public function getLocationPublishedEvents($summit_id, $location_id) summary: 'Get location metadata for a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], x: [ 'required-groups' => [ @@ -861,7 +911,12 @@ public function getMetadata($summit_id) summary: 'Get a venue floor by ID', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -920,7 +975,12 @@ public function getVenueFloor($summit_id, $venue_id, $floor_id) summary: 'Get a venue room by ID', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -979,7 +1039,12 @@ public function getVenueRoom($summit_id, $venue_id, $room_id) summary: 'Get a room on a specific floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -1048,7 +1113,12 @@ public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) summary: 'Add a new location to a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1100,7 +1170,12 @@ public function addLocation($summit_id) summary: 'Add a new venue to a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1153,7 +1228,12 @@ public function addVenue($summit_id) summary: 'Add a new external location to a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1207,7 +1287,12 @@ public function addExternalLocation($summit_id) summary: 'Add a new hotel to a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1260,7 +1345,12 @@ public function addHotel($summit_id) summary: 'Add a new airport to a summit', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1315,7 +1405,12 @@ public function addAirport($summit_id) summary: 'Add a new floor to a venue', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1371,7 +1466,12 @@ public function addVenueFloor($summit_id, $venue_id) summary: 'Add a new room to a venue', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1425,7 +1525,12 @@ public function addVenueRoom($summit_id, $venue_id) summary: 'Add a new room to a venue floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1487,7 +1592,12 @@ public function addVenueFloorRoom($summit_id, $venue_id, $floor_id) summary: 'Update a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1542,7 +1652,12 @@ public function updateLocation($summit_id, $location_id) summary: 'Update a venue', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1599,7 +1714,12 @@ public function updateVenue($summit_id, $venue_id) summary: 'Update a venue floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1659,7 +1779,12 @@ public function updateVenueFloor($summit_id, $venue_id, $floor_id) summary: 'Update a venue room', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1717,7 +1842,12 @@ public function updateVenueRoom($summit_id, $venue_id, $room_id) summary: 'Update a room on a specific floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1777,7 +1907,12 @@ public function updateVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) summary: 'Update a hotel', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1832,7 +1967,12 @@ public function updateHotel($summit_id, $hotel_id) summary: 'Update an airport', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1887,7 +2027,12 @@ public function updateAirport($summit_id, $airport_id) summary: 'Update an external location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1946,7 +2091,12 @@ public function updateExternalLocation($summit_id, $external_location_id) summary: 'Delete a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -1990,7 +2140,12 @@ public function deleteLocation($summit_id, $location_id) summary: 'Delete a venue floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2035,7 +2190,12 @@ public function deleteVenueFloor($summit_id, $venue_id, $floor_id) summary: 'Delete a venue room', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2104,7 +2264,12 @@ public function deleteVenueRoom($summit_id, $venue_id, $room_id) summary: 'Get all banners for a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -2366,7 +2531,12 @@ public function updateLocationBanner($summit_id, $location_id, $banner_id) summary: 'Get a location map', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -2423,7 +2593,12 @@ public function getLocationMap($summit_id, $location_id, $map_id) summary: 'Add a map to a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2504,7 +2679,12 @@ public function addLocationMap(LaravelRequest $request, $summit_id, $location_id summary: 'Update a location map', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2580,7 +2760,12 @@ public function updateLocationMap(LaravelRequest $request, $summit_id, $location summary: 'Delete a location map', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2625,7 +2810,12 @@ public function deleteLocationMap($summit_id, $location_id, $map_id) summary: 'Get a location image', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::ReadSummitData, SummitScopes::ReadAllSummitData]], + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData + ] + ], ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), @@ -2682,7 +2872,12 @@ public function getLocationImage($summit_id, $location_id, $image_id) summary: 'Add an image to a location', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2762,7 +2957,12 @@ public function addLocationImage(LaravelRequest $request, $summit_id, $location_ summary: 'Update a location image', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2827,7 +3027,12 @@ public function updateLocationImage(LaravelRequest $request, $summit_id, $locati summary: 'Delete a location image', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2869,7 +3074,12 @@ public function deleteLocationImage($summit_id, $location_id, $image_id) summary: 'Add an image to a venue room', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -2945,7 +3155,12 @@ public function addVenueRoomImage(LaravelRequest $request, $summit_id, $venue_id summary: 'Remove image from a venue room', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -3016,7 +3231,12 @@ public function removeVenueRoomImage($summit_id, $venue_id, $room_id) summary: 'Add an image to a venue floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ @@ -3093,7 +3313,12 @@ public function addVenueFloorImage(LaravelRequest $request, $summit_id, $venue_i summary: 'Remove image from a venue floor', tags: ['Summit Locations'], security: [ - ['locations_oauth2' => [SummitScopes::WriteSummitData, SummitScopes::WriteLocationsData]], + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteLocationsData + ] + ], ], x: [ 'required-groups' => [ From 15087323f33b441f5eb25403eab55a0d9b29b1d3 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 22 Jan 2026 20:01:28 +0000 Subject: [PATCH 07/10] chore: Add security and X attr inside the trait documentation Signed-off-by: Matias Perrone --- .../Traits/SummitBookableVenueRoomApi.php | 348 ++++++++++++++++-- app/Swagger/Security/LocationsAuthSchema.php | 4 + 2 files changed, 327 insertions(+), 25 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php index f477f40ae..5de97625a 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php +++ b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php @@ -13,7 +13,9 @@ **/ use App\Http\Utils\EpochCellFormatter; +use App\Models\Foundation\Main\IGroup; use App\ModelSerializers\SerializerUtils; +use App\Security\SummitScopes; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Request; use Illuminate\Support\Facades\Validator; @@ -52,7 +54,23 @@ trait SummitBookableVenueRoomApi #[OA\Get( path: '/api/v1/summits/all/locations/bookable-rooms/all/reservations/{id}', summary: 'Get a reservation by ID', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRoomAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), @@ -90,7 +108,15 @@ public function getReservationById($id) path: '/api/v1/summits/{id}/locations/bookable-rooms', operationId: 'getBookableVenueRooms', summary: 'Get all bookable venue rooms for a summit', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, description, capacity, availability_day, attribute', schema: new OA\Schema(type: 'string')), @@ -110,7 +136,15 @@ public function getReservationById($id) path: '/api/v1/summits/{id}/locations/venues/all/bookable-rooms', operationId: 'getBookableVenueAllRooms', summary: 'Get all bookable venue rooms for a summit', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, description, capacity, availability_day, attribute', schema: new OA\Schema(type: 'string')), @@ -190,7 +224,22 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations', summary: 'Get all reservations for a summit', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: summit_id, room_name, room_id, owner_id, owner_name, owner_email, not_owner_email, status, start_datetime, end_datetime', schema: new OA\Schema(type: 'string')), @@ -281,7 +330,22 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/csv', summary: 'Export reservations for a summit as CSV', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: summit_id, room_name, room_id, owner_id, owner_name, owner_email, not_owner_email, status, start_datetime, end_datetime', schema: new OA\Schema(type: 'string')), @@ -381,7 +445,15 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', summary: 'Get a bookable venue room by venue and room ID', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -431,7 +503,15 @@ public function getBookableVenueRoomByVenue($summit_id, $venue_id, $room_id) #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}', summary: 'Get a bookable venue room by ID', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -449,7 +529,8 @@ public function getBookableVenueRoom($summit_id, $room_id) return $this->processRequest(function () use ($summit_id, $room_id) { $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $room = $summit->getLocation(intval($room_id)); @@ -474,7 +555,15 @@ public function getBookableVenueRoom($summit_id, $room_id) #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/availability/{day}', summary: 'Get availability slots for a bookable room on a specific day', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -567,7 +656,14 @@ public function getBookableVenueRoomAvailability($summit_id, $room_id, $day) #[OA\Post( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations', summary: 'Create a reservation for a bookable room', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteMyBookableRoomsReservationData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -618,7 +714,22 @@ public function createBookableVenueRoomReservation($summit_id, $room_id) #[OA\Post( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/offline', summary: 'Create an offline reservation for a bookable room', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -666,7 +777,22 @@ public function createOfflineBookableVenueRoomReservation($summit_id, $room_id) #[OA\Put( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', summary: 'Update a bookable room reservation', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -716,7 +842,22 @@ public function updateBookableVenueRoomReservation($summit_id, $room_id, $reserv #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', summary: 'Get a bookable room reservation by ID', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -761,7 +902,14 @@ public function getBookableVenueRoomReservation($summit_id, $room_id, $reservati #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me', summary: 'Get my bookable room reservations for a summit', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadMyBookableRoomsReservationData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), @@ -815,7 +963,14 @@ public function getMyBookableVenueRoomReservations($summit_id) #[OA\Delete( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/{reservation_id}', summary: 'Cancel my bookable room reservation', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteMyBookableRoomsReservationData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), @@ -854,7 +1009,22 @@ public function cancelMyBookableVenueRoomReservation($summit_id, $reservation_id #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', summary: 'Update a bookable venue room', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -907,7 +1077,15 @@ public function updateVenueBookableRoom($summit_id, $venue_id, $room_id) #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', summary: 'Get a bookable venue room by floor', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -969,7 +1147,22 @@ public function getVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $roo #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', summary: 'Update a bookable venue room by floor', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -1025,7 +1218,22 @@ public function updateVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', summary: 'Delete a bookable venue room', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -1057,7 +1265,22 @@ public function deleteVenueBookableRoom($summit_id, $venue_id, $room_id) #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms', summary: 'Add a bookable room to a venue', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -1112,7 +1335,22 @@ public function addVenueBookableRoom($summit_id, $venue_id) #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms', summary: 'Add a bookable room to a venue floor', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -1172,7 +1410,22 @@ public function addVenueFloorBookableRoom($summit_id, $venue_id, $floor_id) #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', summary: 'Add an attribute to a bookable venue room', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -1220,7 +1473,22 @@ public function addVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', summary: 'Remove an attribute from a bookable venue room', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), @@ -1255,7 +1523,22 @@ public function deleteVenueBookableRoomAttribute($summit_id, $venue_id, $room_id #[OA\Delete( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/refund', summary: 'Refund a bookable room reservation', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), @@ -1297,7 +1580,22 @@ public function refundBookableVenueRoomReservation($summit_id, $room_id, $reserv #[OA\Delete( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/cancel', summary: 'Cancel a bookable room reservation', - tags: ['Summit Locations'], + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), diff --git a/app/Swagger/Security/LocationsAuthSchema.php b/app/Swagger/Security/LocationsAuthSchema.php index 03bd40d01..59dad31c5 100644 --- a/app/Swagger/Security/LocationsAuthSchema.php +++ b/app/Swagger/Security/LocationsAuthSchema.php @@ -20,6 +20,10 @@ SummitScopes::WriteSummitData => 'Write Summit Data', SummitScopes::WriteLocationsData => 'Write Locations Data', SummitScopes::WriteLocationBannersData => 'Write Location Banners Data', + SummitScopes::ReadBookableRoomsData => 'Read Bookable Rooms Data', + SummitScopes::WriteBookableRoomsData => 'Write Bookable Rooms Data', + SummitScopes::ReadMyBookableRoomsReservationData => 'Read My Bookable Rooms Reservation Data', + SummitScopes::WriteMyBookableRoomsReservationData => 'Write My Bookable Rooms Reservation Data', ], ), ], From 0b8be625827f0e6a2da5e63e8946c7f8d673d721 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 22 Jan 2026 20:05:27 +0000 Subject: [PATCH 08/10] chore: add operationId in the related trait Signed-off-by: Matias Perrone --- .../Traits/SummitBookableVenueRoomApi.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php index 5de97625a..9409df90e 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php +++ b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php @@ -53,6 +53,7 @@ trait SummitBookableVenueRoomApi */ #[OA\Get( path: '/api/v1/summits/all/locations/bookable-rooms/all/reservations/{id}', + operationId: 'getReservationById', summary: 'Get a reservation by ID', tags: ['Summit Bookable Rooms'], security: [ @@ -223,6 +224,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations', + operationId: 'getAllReservationsBySummit', summary: 'Get all reservations for a summit', tags: ['Summit Bookable Rooms'], security: [ @@ -329,6 +331,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/csv', + operationId: 'getAllReservationsBySummitCSV', summary: 'Export reservations for a summit as CSV', tags: ['Summit Bookable Rooms'], security: [ @@ -444,6 +447,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { */ #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + operationId: 'getBookableVenueRoomByVenue', summary: 'Get a bookable venue room by venue and room ID', tags: ['Summit Bookable Rooms'], security: [ @@ -502,6 +506,7 @@ public function getBookableVenueRoomByVenue($summit_id, $venue_id, $room_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}', + operationId: 'getBookableVenueRoom', summary: 'Get a bookable venue room by ID', tags: ['Summit Bookable Rooms'], security: [ @@ -554,6 +559,7 @@ public function getBookableVenueRoom($summit_id, $room_id) */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/availability/{day}', + operationId: 'getBookableVenueRoomAvailability', summary: 'Get availability slots for a bookable room on a specific day', tags: ['Summit Bookable Rooms'], security: [ @@ -655,6 +661,7 @@ public function getBookableVenueRoomAvailability($summit_id, $room_id, $day) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations', + operationId: 'createBookableVenueRoomReservation', summary: 'Create a reservation for a bookable room', tags: ['Summit Bookable Rooms'], security: [ @@ -713,6 +720,7 @@ public function createBookableVenueRoomReservation($summit_id, $room_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/offline', + operationId: 'createOfflineBookableVenueRoomReservation', summary: 'Create an offline reservation for a bookable room', tags: ['Summit Bookable Rooms'], security: [ @@ -776,6 +784,7 @@ public function createOfflineBookableVenueRoomReservation($summit_id, $room_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + operationId: 'updateBookableVenueRoomReservation', summary: 'Update a bookable room reservation', tags: ['Summit Bookable Rooms'], security: [ @@ -841,6 +850,7 @@ public function updateBookableVenueRoomReservation($summit_id, $room_id, $reserv */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + operationId: 'getBookableVenueRoomReservation', summary: 'Get a bookable room reservation by ID', tags: ['Summit Bookable Rooms'], security: [ @@ -901,6 +911,7 @@ public function getBookableVenueRoomReservation($summit_id, $room_id, $reservati */ #[OA\Get( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me', + operationId: 'getMyBookableVenueRoomReservations', summary: 'Get my bookable room reservations for a summit', tags: ['Summit Bookable Rooms'], security: [ @@ -962,6 +973,7 @@ public function getMyBookableVenueRoomReservations($summit_id) */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/{reservation_id}', + operationId: 'cancelMyBookableVenueRoomReservation', summary: 'Cancel my bookable room reservation', tags: ['Summit Bookable Rooms'], security: [ @@ -1008,6 +1020,7 @@ public function cancelMyBookableVenueRoomReservation($summit_id, $reservation_id */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + operationId: 'updateVenueBookableRoom', summary: 'Update a bookable venue room', tags: ['Summit Bookable Rooms'], security: [ @@ -1076,6 +1089,7 @@ public function updateVenueBookableRoom($summit_id, $venue_id, $room_id) #[OA\Get( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', + operationId: 'getVenueFloorBookableRoom', summary: 'Get a bookable venue room by floor', tags: ['Summit Bookable Rooms'], security: [ @@ -1146,6 +1160,7 @@ public function getVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $roo */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', + operationId: 'updateVenueFloorBookableRoom', summary: 'Update a bookable venue room by floor', tags: ['Summit Bookable Rooms'], security: [ @@ -1217,6 +1232,7 @@ public function updateVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + operationId: 'deleteVenueBookableRoom', summary: 'Delete a bookable venue room', tags: ['Summit Bookable Rooms'], security: [ @@ -1264,6 +1280,7 @@ public function deleteVenueBookableRoom($summit_id, $venue_id, $room_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms', + operationId: 'addVenueBookableRoom', summary: 'Add a bookable room to a venue', tags: ['Summit Bookable Rooms'], security: [ @@ -1334,6 +1351,7 @@ public function addVenueBookableRoom($summit_id, $venue_id) */ #[OA\Post( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms', + operationId: 'addVenueFloorBookableRoom', summary: 'Add a bookable room to a venue floor', tags: ['Summit Bookable Rooms'], security: [ @@ -1409,6 +1427,7 @@ public function addVenueFloorBookableRoom($summit_id, $venue_id, $floor_id) */ #[OA\Put( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', + operationId: 'addVenueBookableRoomAttribute', summary: 'Add an attribute to a bookable venue room', tags: ['Summit Bookable Rooms'], security: [ @@ -1472,6 +1491,7 @@ public function addVenueBookableRoomAttribute($summit_id, $venue_id, $room_id, $ */ #[OA\Delete( path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', + operationId: 'deleteVenueBookableRoomAttribute', summary: 'Remove an attribute from a bookable venue room', tags: ['Summit Bookable Rooms'], security: [ @@ -1522,6 +1542,7 @@ public function deleteVenueBookableRoomAttribute($summit_id, $venue_id, $room_id #[OA\Delete( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/refund', + operationId: 'refundBookableVenueRoomReservation', summary: 'Refund a bookable room reservation', tags: ['Summit Bookable Rooms'], security: [ @@ -1579,6 +1600,7 @@ public function refundBookableVenueRoomReservation($summit_id, $room_id, $reserv #[OA\Delete( path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/cancel', + operationId: 'cancelBookableVenueRoomReservation', summary: 'Cancel a bookable room reservation', tags: ['Summit Bookable Rooms'], security: [ From 125e68ec3f8c78ee2b33cecbd00d942b1e9d63ad Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 22 Jan 2026 20:15:24 +0000 Subject: [PATCH 09/10] chore: Add "requestBody" for all the endpoints Signed-off-by: Matias Perrone --- .../Traits/SummitBookableVenueRoomApi.php | 32 ++++++ ...th2SummitLocationsApiControllerSchemas.php | 102 ++++++++++++++++++ 2 files changed, 134 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php index 9409df90e..b046d7001 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php +++ b/app/Http/Controllers/Apis/Protected/Summit/Traits/SummitBookableVenueRoomApi.php @@ -678,6 +678,10 @@ public function getBookableVenueRoomAvailability($summit_id, $room_id, $day) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/CreateBookableVenueRoomReservationPayload') + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Reservation created', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), @@ -745,6 +749,10 @@ public function createBookableVenueRoomReservation($summit_id, $room_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/CreateOfflineBookableVenueRoomReservationPayload') + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Offline reservation created', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), @@ -810,6 +818,10 @@ public function createOfflineBookableVenueRoomReservation($summit_id, $room_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateBookableVenueRoomReservationPayload') + ), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Reservation updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), @@ -1046,6 +1058,10 @@ public function cancelMyBookableVenueRoomReservation($summit_id, $reservation_id new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueBookableRoomPayload') + ), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue or room not found'), @@ -1187,6 +1203,10 @@ public function getVenueFloorBookableRoom($summit_id, $venue_id, $floor_id, $roo new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueFloorBookableRoomPayload') + ), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Room updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, floor or room not found'), @@ -1305,6 +1325,10 @@ public function deleteVenueBookableRoom($summit_id, $venue_id, $room_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AddVenueBookableRoomPayload') + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), @@ -1377,6 +1401,10 @@ public function addVenueBookableRoom($summit_id, $venue_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AddVenueBookableRoomPayload') + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue or floor not found'), @@ -1565,6 +1593,10 @@ public function deleteVenueBookableRoomAttribute($summit_id, $venue_id, $room_id new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/RefundBookableVenueRoomReservationPayload') + ), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Reservation refunded', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), diff --git a/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php b/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php index 08cd8c005..b056a9e42 100644 --- a/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php +++ b/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php @@ -637,3 +637,105 @@ class AddVenueFloorRoomPayloadSchema {} ] )] class UpdateVenueFloorRoomPayloadSchema {} + +// ============================================================================ +// Bookable Room Request Body Payloads +// ============================================================================ + +#[OA\Schema( + schema: 'CreateBookableVenueRoomReservationPayload', + type: 'object', + description: 'Payload for creating a new bookable room reservation', + required: ['start_datetime', 'end_datetime'], + properties: [ + new OA\Property(property: 'start_datetime', type: 'integer', description: 'Start date/time as Unix timestamp'), + new OA\Property(property: 'end_datetime', type: 'integer', description: 'End date/time as Unix timestamp'), + ] +)] +class CreateBookableVenueRoomReservationPayloadSchema {} + +#[OA\Schema( + schema: 'CreateOfflineBookableVenueRoomReservationPayload', + type: 'object', + description: 'Payload for creating an offline bookable room reservation', + required: ['start_datetime', 'end_datetime', 'owner_email', 'owner_first_name', 'owner_last_name'], + properties: [ + new OA\Property(property: 'start_datetime', type: 'integer', description: 'Start date/time as Unix timestamp'), + new OA\Property(property: 'end_datetime', type: 'integer', description: 'End date/time as Unix timestamp'), + new OA\Property(property: 'owner_email', type: 'string', format: 'email', description: 'Owner email address'), + new OA\Property(property: 'owner_first_name', type: 'string', maxLength: 255, description: 'Owner first name'), + new OA\Property(property: 'owner_last_name', type: 'string', maxLength: 255, description: 'Owner last name'), + ] +)] +class CreateOfflineBookableVenueRoomReservationPayloadSchema {} + +#[OA\Schema( + schema: 'UpdateBookableVenueRoomReservationPayload', + type: 'object', + description: 'Payload for updating a bookable room reservation', + properties: [ + new OA\Property(property: 'start_datetime', type: 'integer', description: 'Start date/time as Unix timestamp'), + new OA\Property(property: 'end_datetime', type: 'integer', description: 'End date/time as Unix timestamp'), + new OA\Property(property: 'status', type: 'string', enum: ['Pending', 'Confirmed', 'Cancelled'], description: 'Reservation status'), + ] +)] +class UpdateBookableVenueRoomReservationPayloadSchema {} + +#[OA\Schema( + schema: 'AddVenueBookableRoomPayload', + type: 'object', + description: 'Payload for adding a bookable room to a venue', + required: ['name', 'capacity'], + properties: [ + new OA\Property(property: 'name', type: 'string', maxLength: 255, description: 'Room name'), + new OA\Property(property: 'capacity', type: 'integer', minimum: 1, description: 'Room capacity'), + new OA\Property(property: 'description', type: 'string', description: 'Room description'), + new OA\Property(property: 'order', type: 'integer', description: 'Display order'), + ] +)] +class AddVenueBookableRoomPayloadSchema {} + +#[OA\Schema( + schema: 'UpdateVenueBookableRoomPayload', + type: 'object', + description: 'Payload for updating a bookable venue room', + properties: [ + new OA\Property(property: 'name', type: 'string', maxLength: 255, description: 'Room name'), + new OA\Property(property: 'capacity', type: 'integer', minimum: 1, description: 'Room capacity'), + new OA\Property(property: 'description', type: 'string', description: 'Room description'), + new OA\Property(property: 'order', type: 'integer', description: 'Display order'), + ] +)] +class UpdateVenueBookableRoomPayloadSchema {} + +#[OA\Schema( + schema: 'UpdateVenueFloorBookableRoomPayload', + type: 'object', + description: 'Payload for updating a bookable room on a venue floor', + properties: [ + new OA\Property(property: 'name', type: 'string', maxLength: 255, description: 'Room name'), + new OA\Property(property: 'capacity', type: 'integer', minimum: 1, description: 'Room capacity'), + new OA\Property(property: 'description', type: 'string', description: 'Room description'), + new OA\Property(property: 'order', type: 'integer', description: 'Display order'), + ] +)] +class UpdateVenueFloorBookableRoomPayloadSchema {} + +#[OA\Schema( + schema: 'RefundBookableVenueRoomReservationPayload', + type: 'object', + description: 'Payload for refunding a bookable room reservation', + required: ['amount'], + properties: [ + new OA\Property(property: 'amount', type: 'integer', minimum: 1, description: 'Refund amount in cents'), + ] +)] +class RefundBookableVenueRoomReservationPayloadSchema {} + +#[OA\Schema( + schema: 'CopySummitLocationsPayload', + type: 'object', + description: 'Payload for copying locations between summits', + properties: [] +)] +class CopySummitLocationsPayloadSchema {} From b904db895acacaca098bc665dff5321b9bc80871 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 22 Jan 2026 21:29:30 +0000 Subject: [PATCH 10/10] chore: Add file upload requestBody Signed-off-by: Matias Perrone --- .../OAuth2SummitLocationsApiController.php | 40 ++++++++++++++++ ...th2SummitLocationsApiControllerSchemas.php | 47 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index 184523adb..480832b1b 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -2614,6 +2614,14 @@ public function getLocationMap($summit_id, $location_id, $map_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + description: 'Map file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddLocationMapPayload') + ) + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Map created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), @@ -2701,6 +2709,14 @@ public function addLocationMap(LaravelRequest $request, $summit_id, $location_id new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + description: 'Map file update payload', + required: false, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/UpdateLocationMapPayload') + ) + ), responses: [ new OA\Response(response: Response::HTTP_OK, description: 'Map updated', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, location, or map Not Found'), @@ -2893,6 +2909,14 @@ public function getLocationImage($summit_id, $location_id, $image_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + description: 'Image file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddLocationImagePayload') + ) + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Image created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), @@ -3096,6 +3120,14 @@ public function deleteLocationImage($summit_id, $location_id, $image_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + description: 'Room image file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddVenueRoomImagePayload') + ) + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Room image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), @@ -3253,6 +3285,14 @@ public function removeVenueRoomImage($summit_id, $venue_id, $room_id) new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), ], + requestBody: new OA\RequestBody( + description: 'Floor image file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddVenueFloorImagePayload') + ) + ), responses: [ new OA\Response(response: Response::HTTP_CREATED, description: 'Floor image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), diff --git a/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php b/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php index b056a9e42..75b84da66 100644 --- a/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php +++ b/app/Swagger/OAuth2SummitLocationsApiControllerSchemas.php @@ -611,6 +611,53 @@ class AddLocationImagePayloadSchema {} )] class UpdateLocationImagePayloadSchema {} +#[OA\Schema( + schema: 'AddLocationMapPayload', + type: 'object', + description: 'Payload for uploading a location map (multipart form data)', + required: ['file'], + properties: [ + new OA\Property(property: 'file', type: 'string', format: 'binary', description: 'Map image file'), + new OA\Property(property: 'name', type: 'string', description: 'Map name'), + new OA\Property(property: 'description', type: 'string', description: 'Map description'), + ] +)] +class AddLocationMapPayloadSchema {} + +#[OA\Schema( + schema: 'UpdateLocationMapPayload', + type: 'object', + description: 'Payload for updating a location map (multipart form data)', + properties: [ + new OA\Property(property: 'file', type: 'string', format: 'binary', description: 'Map image file (optional)'), + new OA\Property(property: 'name', type: 'string', description: 'Map name'), + new OA\Property(property: 'description', type: 'string', description: 'Map description'), + ] +)] +class UpdateLocationMapPayloadSchema {} + +#[OA\Schema( + schema: 'AddVenueRoomImagePayload', + type: 'object', + description: 'Payload for uploading a venue room image (multipart form data)', + required: ['file'], + properties: [ + new OA\Property(property: 'file', type: 'string', format: 'binary', description: 'Image file'), + ] +)] +class AddVenueRoomImagePayloadSchema {} + +#[OA\Schema( + schema: 'AddVenueFloorImagePayload', + type: 'object', + description: 'Payload for uploading a venue floor image (multipart form data)', + required: ['file'], + properties: [ + new OA\Property(property: 'file', type: 'string', format: 'binary', description: 'Image file'), + ] +)] +class AddVenueFloorImagePayloadSchema {} + #[OA\Schema( schema: 'AddVenueFloorRoomPayload', type: 'object',