Skip to main content

leisure — REST API

model-city-leisure is the platform's largest vertical: city places (/city-places, points of interest), city routes (/city-routes, ordered tourist routes over places), public spaces (/public-spaces, civic facilities with reservable resources and citizen reservations) and ticketed events (/events, paid via Stripe). The service registers in Eureka as leisure, so the gateway routes /api/leisure/**.

Three authorization patterns coexist:

  • Public catalogue reads (places, routes, public spaces, events) — open to any authenticated user.
  • Management writes (create / update / delete of catalogue entities) — require platform admin or backoffice, verified by ModelCityAccessAspect through CoreClient.
  • Citizen-owned resources (reservations, tickets) — the use case requires the token's sub (X-Auth-Sub) to own the resource.

Localizable fields (name, description, …) are Map<String, String> on requests (locale → text, with a mandatory es); responses are resolved from Accept-Language, falling back to es. Events ticketing runs on Stripe: the web flow uses a Checkout Session and the mobile flow a Payment Intent; a public Stripe webhook confirms payments, and deleting an event auto-refunds its outstanding tickets.

External systems: Stripe (Checkout / Payment Intent / refunds + signed webhook), PostgreSQL (modelcity-leisure in microservices, the single modelcity in the monolith) and Valkey (cache: cityPlace, cityPlaces, cityRoute, cityRoutes, cityRoutePlaces, publicSpace, publicSpaces, reservableResources, event, events). It calls core only to resolve the caller's role on management endpoints. See the leisure data model.

The controllers are abstract extension points (CityPlaceController, CityRouteController, PublicSpaceController, ReservableResourceController, ReservationController, EventController, EventTicketController, CitizenTicketController, StripeWebhookController, SystemTrailController); the platform registers the Default* subclass as the active bean. See the Extensibility Guide.

City places (/city-places)​

OperationEndpointPage
List city placesGET /api/leisure/city-placesget-city-places
City place detailGET /api/leisure/city-places/{id}get-city-place
Create city placePOST /api/leisure/city-placescreate-city-place
Replace city placePUT /api/leisure/city-places/{id}update-city-place
Delete city placeDELETE /api/leisure/city-places/{id}delete-city-place

City routes (/city-routes)​

OperationEndpointPage
List city routesGET /api/leisure/city-routesget-city-routes
City route detailGET /api/leisure/city-routes/{id}get-city-route
List route placesGET /api/leisure/city-routes/{id}/city-placesget-city-route-places
Route place detailGET /api/leisure/city-routes/{id}/city-places/{placeId}get-city-route-place
Create city routePOST /api/leisure/city-routescreate-city-route
Replace city routePUT /api/leisure/city-routes/{id}update-city-route
Delete city routeDELETE /api/leisure/city-routes/{id}delete-city-route

Public spaces (/public-spaces)​

OperationEndpointPage
List public spacesGET /api/leisure/public-spacesget-public-spaces
Public space detailGET /api/leisure/public-spaces/{id}get-public-space
Create public spacePOST /api/leisure/public-spacescreate-public-space
Update public spacePUT /api/leisure/public-spaces/{id}update-public-space
Delete public spaceDELETE /api/leisure/public-spaces/{id}delete-public-space
List reservable resourcesGET /api/leisure/public-spaces/{publicSpaceId}/resourcesget-reservable-resources
Create reservable resourcePOST /api/leisure/public-spaces/{publicSpaceId}/resourcescreate-reservable-resource
Update reservable resourcePUT /api/leisure/public-spaces/{publicSpaceId}/resources/{resourceId}update-reservable-resource
Delete reservable resourceDELETE /api/leisure/public-spaces/{publicSpaceId}/resources/{resourceId}delete-reservable-resource
List resource reservationsGET /api/leisure/public-spaces/{publicSpaceId}/resources/{resourceId}/reservationsget-reservations
Create reservationPOST /api/leisure/public-spaces/{publicSpaceId}/resources/{resourceId}/reservationscreate-reservation
Delete reservationDELETE /api/leisure/public-spaces/{publicSpaceId}/resources/{resourceId}/reservations/{reservationId}delete-reservation

Events (/events)​

OperationEndpointPage
List eventsGET /api/leisure/eventsget-events
Event detailGET /api/leisure/events/{id}get-event
Create eventPOST /api/leisure/eventscreate-event
Update eventPUT /api/leisure/events/{id}update-event
Delete eventDELETE /api/leisure/events/{id}delete-event
Purchase ticket (web)POST /api/leisure/events/{eventId}/ticketspurchase-ticket
List event ticketsGET /api/leisure/events/{eventId}/ticketsget-event-tickets
Refund ticketPOST /api/leisure/events/{eventId}/tickets/{ticketId}/refundsrefund-ticket
Citizen ticket historyGET /api/leisure/users/{userId}/ticketsget-citizen-tickets
Stripe payment webhookPOST /api/leisure/stripe/webhookstripe-webhook

Audit (system trails)​

OperationEndpointPage
Query the audit logGET /api/leisure/system-trailsget-system-trails