From 1bde259fb34fbba98ee6e0b2ab221168554917a4 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 13 Jan 2026 21:48:35 +0000 Subject: [PATCH] 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 +{ +}