diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php index dca66a40b..456b9441c 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitLocationsApiController.php @@ -1,4 +1,5 @@ - [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::SummitRoomAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms', + operationId: 'getBookableVenueRooms', + summary: 'Get all bookable venue rooms for a summit', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, description, capacity, availability_day, attribute', schema: new OA\Schema(type: 'string')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/all/bookable-rooms', + operationId: 'getBookableVenueAllRooms', + summary: 'Get all bookable venue rooms for a summit', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: name, description, capacity, availability_day, attribute', schema: new OA\Schema(type: 'string')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations', + operationId: 'getAllReservationsBySummit', + summary: 'Get all reservations for a summit', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: summit_id, room_name, room_id, owner_id, owner_name, owner_email, not_owner_email, status, start_datetime, end_datetime', schema: new OA\Schema(type: 'string')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/csv', + operationId: 'getAllReservationsBySummitCSV', + summary: 'Export reservations for a summit as CSV', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: summit_id, room_name, room_id, owner_id, owner_name, owner_email, not_owner_email, status, start_datetime, end_datetime', schema: new OA\Schema(type: 'string')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + operationId: 'getBookableVenueRoomByVenue', + summary: 'Get a bookable venue room by venue and room ID', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}', + operationId: 'getBookableVenueRoom', + summary: 'Get a bookable venue room by ID', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/availability/{day}', + operationId: 'getBookableVenueRoomAvailability', + summary: 'Get availability slots for a bookable room on a specific day', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + #[OA\Post( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations', + operationId: 'createBookableVenueRoomReservation', + summary: 'Create a reservation for a bookable room', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteMyBookableRoomsReservationData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + 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( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/CreateBookableVenueRoomReservationPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Reservation created', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] + #[OA\Post( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/offline', + operationId: 'createOfflineBookableVenueRoomReservation', + summary: 'Create an offline reservation for a bookable room', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + 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( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/CreateOfflineBookableVenueRoomReservationPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Offline reservation created', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or room not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] + #[OA\Put( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + operationId: 'updateBookableVenueRoomReservation', + summary: 'Update a bookable room reservation', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + 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')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateBookableVenueRoomReservationPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}', + operationId: 'getBookableVenueRoomReservation', + summary: 'Get a bookable room reservation by ID', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), + ] + )] + + #[OA\Get( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/me', + operationId: 'getMyBookableVenueRoomReservations', + summary: 'Get my bookable room reservations for a summit', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadMyBookableRoomsReservationData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + 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'), + ] + )] + + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/bookable-rooms/all/reservations/{reservation_id}', + operationId: 'cancelMyBookableVenueRoomReservation', + summary: 'Cancel my bookable room reservation', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteMyBookableRoomsReservationData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + ], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, 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'), + ] + )] + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + operationId: 'updateVenueBookableRoom', + summary: 'Update a bookable venue room', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueBookableRoomPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, 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'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', + operationId: 'getVenueFloorBookableRoom', + summary: 'Get a bookable venue room by floor', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::ReadBookableRoomsData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + + + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms/{room_id}', + operationId: 'updateVenueFloorBookableRoom', + summary: 'Update a bookable venue room by floor', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateVenueFloorBookableRoomPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, 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'), + ] + )] + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}', + operationId: 'deleteVenueBookableRoom', + summary: 'Delete a bookable venue room', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms', + operationId: 'addVenueBookableRoom', + summary: 'Add a bookable room to a venue', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AddVenueBookableRoomPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or venue not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] + + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}/bookable-rooms', + operationId: 'addVenueFloorBookableRoom', + summary: 'Add a bookable room to a venue floor', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AddVenueBookableRoomPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room created', content: new OA\JsonContent(ref: '#/components/schemas/SummitBookableVenueRoom')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue or floor not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', + operationId: 'addVenueBookableRoomAttribute', + summary: 'Add an attribute to a bookable venue room', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/bookable-rooms/{room_id}/attributes/{attribute_id}', + operationId: 'deleteVenueBookableRoomAttribute', + summary: 'Remove an attribute from a bookable venue room', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'venue_id', in: 'path', required: true, description: 'Venue ID', schema: new OA\Schema(type: 'integer')), + 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_NO_CONTENT, description: 'Attribute removed'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, room or attribute not found'), + ] + )] + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/refund', + operationId: 'refundBookableVenueRoomReservation', + summary: 'Refund a bookable room reservation', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'reservation_id', in: 'path', required: true, description: 'Reservation ID', schema: new OA\Schema(type: 'integer')), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/RefundBookableVenueRoomReservationPayload') + ), + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Reservation refunded', content: new OA\JsonContent(ref: '#/components/schemas/SummitRoomReservation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, room or reservation not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/bookable-rooms/{room_id}/reservations/{reservation_id}/cancel', + operationId: 'cancelBookableVenueRoomReservation', + summary: 'Cancel a bookable room reservation', + tags: ['Summit Bookable Rooms'], + security: [ + [ + 'locations_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteBookableRoomsData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'room_id', in: 'path', required: true, description: 'Room ID', schema: new OA\Schema(type: 'integer')), + 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'), + ] + )] + /** * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations', + operationId: 'getSummitLocations', + summary: 'Get all 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: '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: 'Not Found'), + ] + )] public function getLocations($summit_id) { @@ -212,6 +1003,34 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues', + operationId: 'getSummitVenues', + 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: 'Not Found'), + ] + )] public function getVenues($summit_id) { @@ -281,6 +1100,34 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { ); } + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/all/rooms', + operationId: 'getAllSummitVenueRooms', + 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: 'Not Found'), + ] + )] public function getAllVenuesRooms($summit_id){ $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); @@ -335,6 +1182,30 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/external-locations', + operationId: 'getSummitExternalLocations', + 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: 'Not Found'), + ] + )] public function getExternalLocations($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -370,6 +1241,30 @@ public function getExternalLocations($summit_id) * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/hotels', + operationId: 'getSummitHotels', + 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: 'Not Found'), + ] + )] public function getHotels($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -404,6 +1299,30 @@ public function getHotels($summit_id) * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/airports', + operationId: 'getSummitAirports', + 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: 'Not Found'), + ] + )] public function getAirports($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -440,9 +1359,52 @@ public function getAirports($summit_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/locations/{location_id}', + operationId: 'getLocationByIdPublic', + summary: 'Get a specific location by ID (Public)', + tags: ['Summit Locations (Public)'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitAbstractLocation')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Not Found'), + ] + )] + + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}', + operationId: 'getLocationById', + summary: 'Get a specific location by ID', + tags: ['Summit Locations'], + security: [ + [ + '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: '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 +1520,35 @@ 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', + operationId: 'getLocationEvents', + 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 +1559,56 @@ public function getLocationEvents($summit_id, $location_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/locations/{location_id}/events/published', + operationId: 'getLocationPublishedEventsPublic', + summary: 'Get published events for a location (Public)', + tags: ['Summit Locations (Public)'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID or "tbd"', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: title, start_date, end_date, speaker, tags, event_type_id, track_id, type_show_always_on_schedule', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: title, start_date, end_date, id, created, track_id', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), + new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitEventPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/events/published', + operationId: 'getLocationPublishedEvents', + summary: 'Get published events for a location', + tags: ['Summit Locations'], + security: [ + [ + '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 +1618,34 @@ public function getLocationPublishedEvents($summit_id, $location_id) * @param $summit_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/metadata', + operationId: 'getSummitLocationsMetadata', + 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: 'Not Found'), + ] + )] public function getMetadata($summit_id) { $summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id); @@ -594,6 +1663,32 @@ public function getMetadata($summit_id) * @param $floor_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors/{floor_id}', + operationId: 'getVenueFloorById', + summary: 'Get a venue floor by ID', + tags: ['Summit Locations'], + security: [ + [ + '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 +1727,32 @@ 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}', + operationId: 'getVenueRoomById', + 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 +1791,33 @@ 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}', + operationId: 'getVenueFloorRoomById', + 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 +1865,39 @@ public function getVenueFloorRoom($summit_id, $venue_id, $floor_id, $room_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations', + operationId: 'addSummitLocation', + 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: '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 +1922,39 @@ public function addLocation($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues', + operationId: 'addSummitVenue', + 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: '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 +1980,39 @@ public function addVenue($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/external-locations', + operationId: 'addSummitExternalLocation', + summary: 'Add a new external location to a summit', + tags: ['Summit Locations'], + security: [ + [ + '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: '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 +2039,39 @@ public function addExternalLocation($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/hotels', + operationId: 'addSummitHotel', + 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: '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 +2097,39 @@ public function addHotel($summit_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/airports', + operationId: 'addSummitAirport', + 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: '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 +2157,40 @@ public function addAirport($summit_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/floors', + operationId: 'addVenueFloor', + summary: 'Add a new floor to a venue', + tags: ['Summit Locations'], + security: [ + [ + '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 +2218,40 @@ public function addVenueFloor($summit_id, $venue_id) * @param $venue_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}/rooms', + operationId: 'addVenueRoom', + summary: 'Add a new room to a venue', + tags: ['Summit Locations'], + security: [ + [ + '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 +2277,41 @@ 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', + operationId: 'addVenueFloorRoom', + 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 +2344,40 @@ public function addVenueFloorRoom($summit_id, $venue_id, $floor_id) * @param $location_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/{location_id}', + operationId: 'updateSummitLocation', + 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_CREATED, 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 +2404,40 @@ public function updateLocation($summit_id, $location_id) * @param $venue_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/venues/{venue_id}', + operationId: 'updateSummitVenue', + 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_CREATED, 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 +2466,41 @@ 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}', + operationId: 'updateVenueFloor', + 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_CREATED, 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 +2531,41 @@ 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}', + operationId: 'updateVenueRoom', + 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 +2594,42 @@ 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}', + operationId: 'updateVenueFloorRoom', + 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 +2659,40 @@ 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}', + operationId: 'updateSummitHotel', + 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_CREATED, 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 +2719,40 @@ public function updateHotel($summit_id, $hotel_id) * @param $airport_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/locations/airports/{airport_id}', + operationId: 'updateSummitAirport', + 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_CREATED, 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 +2779,40 @@ 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}', + operationId: 'updateSummitExternalLocation', + 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_CREATED, 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 +2843,35 @@ public function updateExternalLocation($summit_id, $external_location_id) * @param $location_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/locations/{location_id}', + operationId: 'deleteSummitLocation', + 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 +2892,36 @@ 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}', + operationId: 'deleteVenueFloor', + 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 +2942,36 @@ 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}', + operationId: 'deleteVenueRoom', + 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 +2995,56 @@ public function deleteVenueRoom($summit_id, $venue_id, $room_id) * @param $location_id * @return mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/locations/{location_id}/banners', + operationId: 'getLocationBannersPublic', + summary: 'Get all banners for a location', + tags: ['Summit Locations (Public)'], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID or slug', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'location_id', in: 'path', required: true, description: 'Location ID', schema: new OA\Schema(type: 'integer')), + new OA\Parameter(name: 'filter', in: 'query', required: false, description: 'Filter by: class_name, title, content, type, enabled, start_date, end_date', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'order', in: 'query', required: false, description: 'Order by: id, title, start_date, end_date', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)), + new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10)), + new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return', schema: new OA\Schema(type: 'string')), + new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Relations to include', schema: new OA\Schema(type: 'string')), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'OK', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationBannerPaginatedResponse')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), + ] + )] + #[OA\Get( + path: '/api/v1/summits/{id}/locations/{location_id}/banners', + operationId: 'getLocationBanners', + summary: 'Get all banners for a location', + tags: ['Summit Locations'], + security: [ + [ + '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 +3103,35 @@ 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', + operationId: 'addLocationBanner', + 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 +3166,31 @@ 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}', + operationId: 'deleteLocationBanner', + 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 +3212,36 @@ 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}', + operationId: 'updateLocationBanner', + 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_CREATED, 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 +3283,32 @@ 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}', + operationId: 'getLocationMap', + 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 +3345,47 @@ 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', + operationId: 'addLocationMap', + 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')), + ], + requestBody: new OA\RequestBody( + description: 'Map file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddLocationMapPayload') + ) + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Map created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationMap')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation error'), + ] + )] public function addLocationMap(LaravelRequest $request, $summit_id, $location_id) { @@ -1457,6 +3439,48 @@ 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}', + operationId: 'updateLocationMap', + 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')), + ], + requestBody: new OA\RequestBody( + description: 'Map file update payload', + required: false, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/UpdateLocationMapPayload') + ) + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, 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 +3528,36 @@ 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}', + operationId: 'deleteLocationMap', + 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 +3578,32 @@ 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}', + operationId: 'getLocationImage', + 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 +3640,47 @@ 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', + operationId: 'addLocationImage', + 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')), + ], + requestBody: new OA\RequestBody( + description: 'Image file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddLocationImagePayload') + ) + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Image created', content: new OA\JsonContent(ref: '#/components/schemas/SummitLocationImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Location Not Found'), + 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 +3733,41 @@ 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}', + operationId: 'updateLocationImage', + 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_CREATED, 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 +3803,36 @@ 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}', + operationId: 'deleteLocationImage', + 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 +3850,48 @@ 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', + operationId: 'addVenueRoomImage', + 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')), + ], + requestBody: new OA\RequestBody( + description: 'Room image file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddVenueRoomImagePayload') + ) + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Room image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or room Not Found'), + 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 +3939,39 @@ 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', + operationId: 'removeVenueRoomImage', + 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_CREATED, 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 +4015,48 @@ 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', + operationId: 'addVenueFloorImage', + 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')), + ], + requestBody: new OA\RequestBody( + description: 'Floor image file upload payload', + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema(ref: '#/components/schemas/AddVenueFloorImagePayload') + ) + ), + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: 'Floor image added', content: new OA\JsonContent(ref: '#/components/schemas/SummitImage')), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit, venue, or floor Not Found'), + 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 +4105,39 @@ 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', + operationId: 'removeVenueFloorImage', + 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_CREATED, 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 +4184,30 @@ 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}', + operationId: 'copySummitLocations', + 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/Swagger/Models/SummitAbstractLocationSchema.php b/app/Swagger/Models/SummitAbstractLocationSchema.php index 522f1d2c9..99f86e62b 100644 --- a/app/Swagger/Models/SummitAbstractLocationSchema.php +++ b/app/Swagger/Models/SummitAbstractLocationSchema.php @@ -1,28 +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', + SummitScopes::ReadBookableRoomsData => 'Read Bookable Rooms Data', + SummitScopes::WriteBookableRoomsData => 'Write Bookable Rooms Data', + SummitScopes::ReadMyBookableRoomsReservationData => 'Read My Bookable Rooms Reservation Data', + SummitScopes::WriteMyBookableRoomsReservationData => 'Write My Bookable Rooms Reservation Data', + ], + ), + ], +) +] +class LocationsAuthSchema +{ +}