mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 09:51:09 -05:00
- Added migration 0011 to populate unique slugs for existing RideModel records based on manufacturer and model names. - Implemented logic to ensure slug uniqueness during population. - Added reverse migration to clear slugs if needed. feat(rides): enforce unique slugs for RideModel - Created migration 0012 to alter the slug field in RideModel to be unique. - Updated the slug field to include help text and a maximum length of 255 characters. docs: integrate Cloudflare Images into rides and parks models - Updated RidePhoto and ParkPhoto models to use CloudflareImagesField for image storage. - Enhanced API serializers for rides and parks to support Cloudflare Images, including new fields for image URLs and variants. - Provided comprehensive OpenAPI schema metadata for new fields. - Documented database migrations for the integration. - Detailed configuration settings for Cloudflare Images. - Updated API response formats to include Cloudflare Images URLs and variants. - Added examples for uploading photos via API and outlined testing procedures.
6691 lines
189 KiB
YAML
6691 lines
189 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: ThrillWiki API
|
|
version: 1.0.0
|
|
description: Comprehensive theme park and ride information API
|
|
paths:
|
|
/api/v1/accounts/profiles/:
|
|
get:
|
|
operationId: v1_accounts_profiles_list
|
|
description: Retrieve a list of user profiles.
|
|
summary: List user profiles
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: search
|
|
required: false
|
|
in: query
|
|
description: A search term.
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedUserProfileOutputList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_accounts_profiles_create
|
|
description: Create a new user profile.
|
|
summary: Create user profile
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileCreateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileCreateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileCreateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileOutput'
|
|
description: ''
|
|
/api/v1/accounts/profiles/{id}/:
|
|
get:
|
|
operationId: v1_accounts_profiles_retrieve
|
|
description: Retrieve a specific user profile by ID.
|
|
summary: Get user profile
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this user profile.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileOutput'
|
|
description: ''
|
|
put:
|
|
operationId: v1_accounts_profiles_update
|
|
description: Update a user profile.
|
|
summary: Update user profile
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this user profile.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileUpdateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileOutput'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_accounts_profiles_partial_update
|
|
description: Partially update a user profile.
|
|
summary: Partially update user profile
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this user profile.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedUserProfileUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileOutput'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_accounts_profiles_destroy
|
|
description: Delete a user profile.
|
|
summary: Delete user profile
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this user profile.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/accounts/profiles/me/:
|
|
get:
|
|
operationId: v1_accounts_profiles_me_retrieve
|
|
description: Retrieve the current authenticated user's profile.
|
|
summary: Get current user's profile
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserProfileOutput'
|
|
description: ''
|
|
/api/v1/accounts/toplist-items/:
|
|
get:
|
|
operationId: v1_accounts_toplist_items_list
|
|
description: Retrieve a list of top list items.
|
|
summary: List top list items
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: search
|
|
required: false
|
|
in: query
|
|
description: A search term.
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedTopListItemOutputList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_accounts_toplist_items_create
|
|
description: Add a new item to a top list.
|
|
summary: Create top list item
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemCreateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemCreateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemCreateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutput'
|
|
description: ''
|
|
/api/v1/accounts/toplist-items/{id}/:
|
|
get:
|
|
operationId: v1_accounts_toplist_items_retrieve
|
|
description: Retrieve a specific top list item by ID.
|
|
summary: Get top list item
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list item.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutput'
|
|
description: ''
|
|
put:
|
|
operationId: v1_accounts_toplist_items_update
|
|
description: Update a top list item.
|
|
summary: Update top list item
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list item.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemUpdateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutput'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_accounts_toplist_items_partial_update
|
|
description: Partially update a top list item.
|
|
summary: Partially update top list item
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list item.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTopListItemUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutput'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_accounts_toplist_items_destroy
|
|
description: Remove an item from a top list.
|
|
summary: Delete top list item
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list item.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/accounts/toplist-items/reorder/:
|
|
post:
|
|
operationId: v1_accounts_toplist_items_reorder_create
|
|
description: Reorder items within a top list.
|
|
summary: Reorder top list items
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListItemOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
description: ''
|
|
/api/v1/accounts/toplists/:
|
|
get:
|
|
operationId: v1_accounts_toplists_list
|
|
description: Retrieve a list of top lists.
|
|
summary: List top lists
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: search
|
|
required: false
|
|
in: query
|
|
description: A search term.
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedTopListOutputList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_accounts_toplists_create
|
|
description: Create a new top list.
|
|
summary: Create top list
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListCreateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListCreateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListCreateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutput'
|
|
description: ''
|
|
/api/v1/accounts/toplists/{id}/:
|
|
get:
|
|
operationId: v1_accounts_toplists_retrieve
|
|
description: Retrieve a specific top list by ID.
|
|
summary: Get top list
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutput'
|
|
description: ''
|
|
put:
|
|
operationId: v1_accounts_toplists_update
|
|
description: Update a top list.
|
|
summary: Update top list
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListUpdateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutput'
|
|
description: ''
|
|
patch:
|
|
operationId: v1_accounts_toplists_partial_update
|
|
description: Partially update a top list.
|
|
summary: Partially update top list
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedTopListUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutput'
|
|
description: ''
|
|
delete:
|
|
operationId: v1_accounts_toplists_destroy
|
|
description: Delete a top list.
|
|
summary: Delete top list
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
/api/v1/accounts/toplists/{id}/duplicate/:
|
|
post:
|
|
operationId: v1_accounts_toplists_duplicate_create
|
|
description: Create a copy of an existing top list for the current user.
|
|
summary: Duplicate top list
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this top list.
|
|
required: true
|
|
tags:
|
|
- Accounts
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TopListOutput'
|
|
description: ''
|
|
/api/v1/accounts/toplists/my_lists/:
|
|
get:
|
|
operationId: v1_accounts_toplists_my_lists_list
|
|
description: Retrieve all top lists belonging to the current user.
|
|
summary: Get current user's top lists
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- name: search
|
|
required: false
|
|
in: query
|
|
description: A search term.
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Accounts
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedTopListOutputList'
|
|
description: ''
|
|
/api/v1/auth/login/:
|
|
post:
|
|
operationId: v1_auth_login_create
|
|
description: Authenticate user with username/email and password.
|
|
summary: User login
|
|
tags:
|
|
- Authentication
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginInputRequest'
|
|
examples:
|
|
LoginInputExample:
|
|
value:
|
|
username: thrillseeker
|
|
password: securepassword123
|
|
summary: Example login request
|
|
description: Login with username or email and password
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginInputRequest'
|
|
required: true
|
|
security:
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LoginOutput'
|
|
examples:
|
|
LoginOutputExample:
|
|
value:
|
|
token: abc123def456ghi789
|
|
user:
|
|
id: 1
|
|
username: thrillseeker
|
|
email: user@example.com
|
|
first_name: John
|
|
last_name: Doe
|
|
message: Login successful
|
|
summary: Example login response
|
|
description: Successful login response with token and user data
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/auth/logout/:
|
|
post:
|
|
operationId: v1_auth_logout_create
|
|
description: Logout the current user and invalidate their token.
|
|
summary: User logout
|
|
tags:
|
|
- Authentication
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LogoutOutputRequest'
|
|
examples:
|
|
LogoutOutputExample:
|
|
value:
|
|
message: Logout successful
|
|
summary: Example logout response
|
|
description: Successful logout response
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/LogoutOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/LogoutOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/LogoutOutput'
|
|
examples:
|
|
LogoutOutputExample:
|
|
value:
|
|
message: Logout successful
|
|
summary: Example logout response
|
|
description: Successful logout response
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/auth/password/change/:
|
|
post:
|
|
operationId: v1_auth_password_change_create
|
|
description: Change the current user's password.
|
|
summary: Change password
|
|
tags:
|
|
- Authentication
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordChangeInputRequest'
|
|
examples:
|
|
PasswordChangeInputExample:
|
|
value:
|
|
old_password: oldpassword123
|
|
new_password: newpassword456
|
|
new_password_confirm: newpassword456
|
|
summary: Example password change request
|
|
description: Change current user's password
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordChangeInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordChangeInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordChangeOutput'
|
|
examples:
|
|
PasswordChangeOutputExample:
|
|
value:
|
|
detail: Password changed successfully
|
|
summary: Example password change response
|
|
description: Password changed successfully response
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/auth/password/reset/:
|
|
post:
|
|
operationId: v1_auth_password_reset_create
|
|
description: Send a password reset email to the user.
|
|
summary: Request password reset
|
|
tags:
|
|
- Authentication
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetInputRequest'
|
|
examples:
|
|
PasswordResetInputExample:
|
|
value:
|
|
email: user@example.com
|
|
summary: Example password reset request
|
|
description: Request password reset email
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PasswordResetOutput'
|
|
examples:
|
|
PasswordResetOutputExample:
|
|
value:
|
|
detail: Password reset email sent
|
|
summary: Example password reset response
|
|
description: Password reset email sent response
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/auth/providers/:
|
|
get:
|
|
operationId: v1_auth_providers_retrieve
|
|
description: Retrieve available social authentication providers.
|
|
summary: Get social providers
|
|
tags:
|
|
- Authentication
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/auth/signup/:
|
|
post:
|
|
operationId: v1_auth_signup_create
|
|
description: Register a new user account.
|
|
summary: User registration
|
|
tags:
|
|
- Authentication
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SignupInputRequest'
|
|
examples:
|
|
SignupInputExample:
|
|
value:
|
|
username: newuser
|
|
email: newuser@example.com
|
|
password: securepassword123
|
|
password_confirm: securepassword123
|
|
first_name: Jane
|
|
last_name: Smith
|
|
summary: Example registration request
|
|
description: Register a new user account
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/SignupInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/SignupInputRequest'
|
|
required: true
|
|
security:
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SignupOutput'
|
|
examples:
|
|
SignupOutputExample:
|
|
value:
|
|
token: abc123def456ghi789
|
|
user:
|
|
id: 2
|
|
username: newuser
|
|
email: newuser@example.com
|
|
first_name: Jane
|
|
last_name: Smith
|
|
message: Registration successful
|
|
summary: Example registration response
|
|
description: Successful registration response with token and user
|
|
data
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/auth/status/:
|
|
post:
|
|
operationId: v1_auth_status_create
|
|
description: Check if user is authenticated and return user data.
|
|
summary: Check authentication status
|
|
tags:
|
|
- Authentication
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AuthStatusOutputRequest'
|
|
examples:
|
|
AuthStatusAuthenticatedExample:
|
|
value:
|
|
authenticated: true
|
|
user:
|
|
id: 1
|
|
username: thrillseeker
|
|
email: user@example.com
|
|
first_name: John
|
|
last_name: Doe
|
|
summary: Example authenticated status
|
|
description: Response when user is authenticated
|
|
AuthStatusUnauthenticatedExample:
|
|
value:
|
|
authenticated: false
|
|
user: null
|
|
summary: Example unauthenticated status
|
|
description: Response when user is not authenticated
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/AuthStatusOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/AuthStatusOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AuthStatusOutput'
|
|
examples:
|
|
AuthStatusAuthenticatedExample:
|
|
value:
|
|
authenticated: true
|
|
user:
|
|
id: 1
|
|
username: thrillseeker
|
|
email: user@example.com
|
|
first_name: John
|
|
last_name: Doe
|
|
summary: Example authenticated status
|
|
description: Response when user is authenticated
|
|
AuthStatusUnauthenticatedExample:
|
|
value:
|
|
authenticated: false
|
|
user: null
|
|
summary: Example unauthenticated status
|
|
description: Response when user is not authenticated
|
|
description: ''
|
|
/api/v1/auth/user/:
|
|
get:
|
|
operationId: v1_auth_user_retrieve
|
|
description: Retrieve information about the currently authenticated user.
|
|
summary: Get current user
|
|
tags:
|
|
- Authentication
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UserOutput'
|
|
examples:
|
|
UserOutputExample:
|
|
value:
|
|
id: 1
|
|
username: thrillseeker
|
|
email: user@example.com
|
|
first_name: John
|
|
last_name: Doe
|
|
is_active: true
|
|
date_joined: '2024-01-01T00:00:00Z'
|
|
summary: Example user response
|
|
description: A typical user object in API responses
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/core/entities/not-found/:
|
|
post:
|
|
operationId: v1_core_entities_not_found_create
|
|
description: Handle entity not found scenarios with fuzzy matching suggestions
|
|
and authentication prompts
|
|
summary: Handle entity not found
|
|
tags:
|
|
- Core
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/core/entities/search/:
|
|
post:
|
|
operationId: v1_core_entities_search_create
|
|
description: Perform fuzzy entity search with authentication prompts for entity
|
|
creation
|
|
summary: Fuzzy entity search
|
|
tags:
|
|
- Core
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/core/entities/suggestions/:
|
|
get:
|
|
operationId: v1_core_entities_suggestions_retrieve
|
|
description: Lightweight endpoint for quick entity suggestions (e.g., autocomplete)
|
|
summary: Quick entity suggestions
|
|
tags:
|
|
- Core
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/email/send/:
|
|
post:
|
|
operationId: v1_email_send_create
|
|
description: Send an email via the email service.
|
|
summary: Send email
|
|
tags:
|
|
- Email
|
|
requestBody:
|
|
content:
|
|
type:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified request body
|
|
properties:
|
|
schema:
|
|
to:
|
|
type: string
|
|
format: email
|
|
description: Recipient email address
|
|
subject:
|
|
type: string
|
|
description: Email subject
|
|
text:
|
|
type: string
|
|
description: Email body text
|
|
from_email:
|
|
type: string
|
|
format: email
|
|
description: Sender email address (optional)
|
|
required:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified request body
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
message:
|
|
type: string
|
|
response:
|
|
type: object
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/health/:
|
|
get:
|
|
operationId: v1_health_retrieve
|
|
description: Get comprehensive health check information including system metrics.
|
|
summary: Health check
|
|
tags:
|
|
- Health
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HealthCheckOutput'
|
|
description: ''
|
|
'503':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/HealthCheckOutput'
|
|
description: ''
|
|
/api/v1/health/performance/:
|
|
get:
|
|
operationId: v1_health_performance_retrieve
|
|
description: Get performance metrics and database analysis (debug mode only).
|
|
summary: Performance metrics
|
|
tags:
|
|
- Health
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PerformanceMetricsOutput'
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/health/simple/:
|
|
get:
|
|
operationId: v1_health_simple_retrieve
|
|
description: Simple health check endpoint for load balancers.
|
|
summary: Simple health check
|
|
tags:
|
|
- Health
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SimpleHealthOutput'
|
|
description: ''
|
|
'503':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SimpleHealthOutput'
|
|
description: ''
|
|
/api/v1/history/parks/{park_slug}/:
|
|
get:
|
|
operationId: v1_history_parks_list
|
|
description: Retrieve history timeline for a specific park including all changes
|
|
over time.
|
|
summary: Get park history
|
|
parameters:
|
|
- in: query
|
|
name: end_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter events before this date (YYYY-MM-DD)
|
|
- in: query
|
|
name: event_type
|
|
schema:
|
|
type: string
|
|
description: Filter by event type (created, updated, deleted)
|
|
- in: query
|
|
name: limit
|
|
schema:
|
|
type: integer
|
|
description: 'Number of history events to return (default: 50, max: 500)'
|
|
- in: query
|
|
name: offset
|
|
schema:
|
|
type: integer
|
|
description: Offset for pagination
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: park_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- in: query
|
|
name: start_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter events after this date (YYYY-MM-DD)
|
|
tags:
|
|
- History
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedParkHistoryEventList'
|
|
description: ''
|
|
/api/v1/history/parks/{park_slug}/detail/:
|
|
get:
|
|
operationId: v1_history_parks_detail_retrieve
|
|
description: Retrieve complete history for a park including current state and
|
|
timeline.
|
|
summary: Get complete park history
|
|
parameters:
|
|
- in: path
|
|
name: park_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- History
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkHistoryOutput'
|
|
description: ''
|
|
/api/v1/history/parks/{park_slug}/rides/{ride_slug}/:
|
|
get:
|
|
operationId: v1_history_parks_rides_list
|
|
description: Retrieve history timeline for a specific ride including all changes
|
|
over time.
|
|
summary: Get ride history
|
|
parameters:
|
|
- in: query
|
|
name: end_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter events before this date (YYYY-MM-DD)
|
|
- in: query
|
|
name: event_type
|
|
schema:
|
|
type: string
|
|
description: Filter by event type (created, updated, deleted)
|
|
- in: query
|
|
name: limit
|
|
schema:
|
|
type: integer
|
|
description: 'Number of history events to return (default: 50, max: 500)'
|
|
- in: query
|
|
name: offset
|
|
schema:
|
|
type: integer
|
|
description: Offset for pagination
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: park_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- in: path
|
|
name: ride_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- in: query
|
|
name: start_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter events after this date (YYYY-MM-DD)
|
|
tags:
|
|
- History
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedRideHistoryEventList'
|
|
description: ''
|
|
/api/v1/history/parks/{park_slug}/rides/{ride_slug}/detail/:
|
|
get:
|
|
operationId: v1_history_parks_rides_detail_retrieve
|
|
description: Retrieve complete history for a ride including current state and
|
|
timeline.
|
|
summary: Get complete ride history
|
|
parameters:
|
|
- in: path
|
|
name: park_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
- in: path
|
|
name: ride_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- History
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideHistoryOutput'
|
|
description: ''
|
|
/api/v1/history/timeline/:
|
|
get:
|
|
operationId: v1_history_timeline_list
|
|
description: Retrieve a unified timeline of all changes across parks, rides,
|
|
and companies.
|
|
summary: Unified history timeline
|
|
parameters:
|
|
- in: query
|
|
name: end_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter events before this date (YYYY-MM-DD)
|
|
- in: query
|
|
name: event_type
|
|
schema:
|
|
type: string
|
|
description: Filter by event type (created, updated, deleted)
|
|
- in: query
|
|
name: limit
|
|
schema:
|
|
type: integer
|
|
description: 'Number of history events to return (default: 100, max: 1000)'
|
|
- in: query
|
|
name: model_type
|
|
schema:
|
|
type: string
|
|
description: Filter by model type (park, ride, company)
|
|
- in: query
|
|
name: offset
|
|
schema:
|
|
type: integer
|
|
description: Offset for pagination
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: significance
|
|
schema:
|
|
type: string
|
|
description: Filter by change significance (major, minor, routine)
|
|
- in: query
|
|
name: start_date
|
|
schema:
|
|
type: string
|
|
format: date
|
|
description: Filter events after this date (YYYY-MM-DD)
|
|
tags:
|
|
- History
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedUnifiedHistoryTimelineList'
|
|
description: ''
|
|
/api/v1/history/timeline/{id}/:
|
|
get:
|
|
operationId: v1_history_timeline_retrieve
|
|
description: Retrieve a specific item from the unified history timeline.
|
|
summary: Get unified history timeline item
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- History
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UnifiedHistoryTimeline'
|
|
description: ''
|
|
/api/v1/maps/bounds/:
|
|
get:
|
|
operationId: v1_maps_bounds_retrieve
|
|
description: Get locations within specific geographic bounds.
|
|
summary: Get locations within bounds
|
|
parameters:
|
|
- in: query
|
|
name: east
|
|
schema:
|
|
type: number
|
|
description: Eastern longitude bound
|
|
required: true
|
|
- in: query
|
|
name: north
|
|
schema:
|
|
type: number
|
|
description: Northern latitude bound
|
|
required: true
|
|
- in: query
|
|
name: south
|
|
schema:
|
|
type: number
|
|
description: Southern latitude bound
|
|
required: true
|
|
- in: query
|
|
name: types
|
|
schema:
|
|
type: string
|
|
description: Comma-separated location types (park,ride)
|
|
- in: query
|
|
name: west
|
|
schema:
|
|
type: number
|
|
description: Western longitude bound
|
|
required: true
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/maps/cache/:
|
|
post:
|
|
operationId: v1_maps_cache_create
|
|
description: Invalidate specific cache entries.
|
|
summary: Invalidate specific cache entries
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
delete:
|
|
operationId: v1_maps_cache_destroy
|
|
description: Clear all map cache (admin only).
|
|
summary: Clear map cache
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/maps/cache/invalidate/:
|
|
post:
|
|
operationId: v1_maps_cache_invalidate_create
|
|
description: Invalidate specific cache entries.
|
|
summary: Invalidate specific cache entries
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
delete:
|
|
operationId: v1_maps_cache_invalidate_destroy
|
|
description: Clear all map cache (admin only).
|
|
summary: Clear map cache
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/maps/locations/:
|
|
get:
|
|
operationId: v1_maps_locations_retrieve
|
|
description: Get map locations with optional clustering and filtering.
|
|
summary: Get map locations
|
|
parameters:
|
|
- in: query
|
|
name: cluster
|
|
schema:
|
|
type: boolean
|
|
description: 'Enable location clustering for high-density areas. Default:
|
|
false'
|
|
examples:
|
|
EnableClustering:
|
|
value: true
|
|
summary: Enable clustering
|
|
DisableClustering:
|
|
value: false
|
|
summary: Disable clustering
|
|
- in: query
|
|
name: east
|
|
schema:
|
|
type: number
|
|
description: Eastern longitude bound (-180 to 180). Must be greater than west
|
|
bound.
|
|
examples:
|
|
Example:
|
|
value: -82.6
|
|
- in: query
|
|
name: north
|
|
schema:
|
|
type: number
|
|
description: Northern latitude bound (-90 to 90). Used with south, east, west
|
|
to define geographic bounds.
|
|
examples:
|
|
Example:
|
|
value: 41.5
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
description: Text search query. Searches park/ride names, cities, and states.
|
|
examples:
|
|
ParkName:
|
|
value: Cedar Point
|
|
summary: Park name
|
|
RideType:
|
|
value: roller coaster
|
|
summary: Ride type
|
|
Location:
|
|
value: Ohio
|
|
- in: query
|
|
name: south
|
|
schema:
|
|
type: number
|
|
description: Southern latitude bound (-90 to 90). Must be less than north
|
|
bound.
|
|
examples:
|
|
Example:
|
|
value: 41.4
|
|
- in: query
|
|
name: types
|
|
schema:
|
|
type: string
|
|
description: 'Comma-separated location types to include. Valid values: ''park'',
|
|
''ride''. Default: ''park,ride'''
|
|
examples:
|
|
AllTypes:
|
|
value: park,ride
|
|
summary: All types
|
|
ParksOnly:
|
|
value: park
|
|
summary: Parks only
|
|
RidesOnly:
|
|
value: ride
|
|
summary: Rides only
|
|
- in: query
|
|
name: west
|
|
schema:
|
|
type: number
|
|
description: Western longitude bound (-180 to 180). Used with other bounds
|
|
for geographic filtering.
|
|
examples:
|
|
Example:
|
|
value: -82.8
|
|
- in: query
|
|
name: zoom
|
|
schema:
|
|
type: integer
|
|
description: Map zoom level (1-20). Higher values show more detail. Used for
|
|
clustering decisions.
|
|
examples:
|
|
Example:
|
|
value: 10
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MapLocationsResponse'
|
|
examples:
|
|
MapLocationsResponseExample:
|
|
value:
|
|
status: success
|
|
data:
|
|
locations:
|
|
- id: 1
|
|
type: park
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
latitude: 41.4793
|
|
longitude: -82.6833
|
|
status: OPERATING
|
|
clusters: []
|
|
bounds:
|
|
north: 41.5
|
|
south: 41.4
|
|
east: -82.6
|
|
west: -82.8
|
|
total_count: 1
|
|
clustered: false
|
|
summary: Example map locations response
|
|
description: Response containing locations and optional clusters
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/maps/locations/{location_type}/{location_id}/:
|
|
get:
|
|
operationId: v1_maps_locations_retrieve_2
|
|
description: Get detailed information about a specific location.
|
|
summary: Get location details
|
|
parameters:
|
|
- in: path
|
|
name: location_id
|
|
schema:
|
|
type: integer
|
|
description: ID of the location
|
|
required: true
|
|
- in: path
|
|
name: location_type
|
|
schema:
|
|
type: string
|
|
description: Type of location
|
|
required: true
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MapLocationDetail'
|
|
examples:
|
|
MapLocationDetailExample:
|
|
value:
|
|
id: 1
|
|
type: park
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
description: America's Roller Coast
|
|
latitude: 41.4793
|
|
longitude: -82.6833
|
|
status: OPERATING
|
|
location:
|
|
street_address: 1 Cedar Point Dr
|
|
city: Sandusky
|
|
state: Ohio
|
|
country: United States
|
|
postal_code: '44870'
|
|
formatted_address: 1 Cedar Point Dr, Sandusky, Ohio, 44870,
|
|
United States
|
|
stats:
|
|
coaster_count: 17
|
|
ride_count: 70
|
|
average_rating: 4.5
|
|
nearby_locations: []
|
|
summary: Example map location detail response
|
|
description: Detailed information about a specific location
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/maps/search/:
|
|
get:
|
|
operationId: v1_maps_search_retrieve
|
|
description: Search locations by text query with optional bounds filtering.
|
|
summary: Search map locations
|
|
parameters:
|
|
- in: query
|
|
name: page
|
|
schema:
|
|
type: integer
|
|
description: Page number
|
|
- in: query
|
|
name: page_size
|
|
schema:
|
|
type: integer
|
|
description: Results per page
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
description: Search query
|
|
required: true
|
|
- in: query
|
|
name: types
|
|
schema:
|
|
type: string
|
|
description: Comma-separated location types (park,ride)
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/MapSearchResponse'
|
|
examples:
|
|
MapSearchResponseExample:
|
|
value:
|
|
status: success
|
|
data:
|
|
results:
|
|
- id: 1
|
|
type: park
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
latitude: 41.4793
|
|
longitude: -82.6833
|
|
query: cedar point
|
|
total_count: 1
|
|
page: 1
|
|
page_size: 20
|
|
summary: Example map search response
|
|
description: Response containing search results
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/maps/stats/:
|
|
get:
|
|
operationId: v1_maps_stats_retrieve
|
|
description: Get map service statistics and performance metrics.
|
|
summary: Get map service statistics
|
|
tags:
|
|
- Maps
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/:
|
|
get:
|
|
operationId: v1_parks_retrieve
|
|
description: List parks with basic filtering and pagination.
|
|
summary: List parks with filtering and pagination
|
|
parameters:
|
|
- in: query
|
|
name: country
|
|
schema:
|
|
type: string
|
|
- in: query
|
|
name: page
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: page_size
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
- in: query
|
|
name: state
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
post:
|
|
operationId: v1_parks_create
|
|
description: Create a new park.
|
|
summary: Create a new park
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/parks/{park_pk}/photos/:
|
|
get:
|
|
operationId: v1_parks_photos_list
|
|
description: Retrieve a paginated list of park photos with filtering capabilities.
|
|
summary: List park photos
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- name: search
|
|
required: false
|
|
in: query
|
|
description: A search term.
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Park Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedParkPhotoListOutputList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_parks_photos_create
|
|
description: Upload a new photo for a park. Requires authentication.
|
|
summary: Upload park photo
|
|
parameters:
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoCreateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoCreateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoCreateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutput'
|
|
examples:
|
|
ParkPhotoWithCloudflareImages:
|
|
value:
|
|
id: 456
|
|
image: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_url: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/def456ghi789/medium
|
|
large: https://imagedelivery.net/account-hash/def456ghi789/large
|
|
public: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
caption: Beautiful park entrance
|
|
alt_text: Main entrance gate with decorative archway
|
|
is_primary: true
|
|
is_approved: true
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T11:00:00Z'
|
|
uploaded_by_username: parkfan456
|
|
file_size: 1536000
|
|
dimensions:
|
|
- 1600
|
|
- 900
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete park photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/{park_pk}/photos/{id}/:
|
|
get:
|
|
operationId: v1_parks_photos_retrieve
|
|
description: Retrieve detailed information about a specific park photo.
|
|
summary: Get park photo details
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this park photo.
|
|
required: true
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutput'
|
|
examples:
|
|
ParkPhotoWithCloudflareImages:
|
|
value:
|
|
id: 456
|
|
image: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_url: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/def456ghi789/medium
|
|
large: https://imagedelivery.net/account-hash/def456ghi789/large
|
|
public: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
caption: Beautiful park entrance
|
|
alt_text: Main entrance gate with decorative archway
|
|
is_primary: true
|
|
is_approved: true
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T11:00:00Z'
|
|
uploaded_by_username: parkfan456
|
|
file_size: 1536000
|
|
dimensions:
|
|
- 1600
|
|
- 900
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete park photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
put:
|
|
operationId: v1_parks_photos_update
|
|
description: Update park photo information. Requires authentication and ownership
|
|
or admin privileges.
|
|
summary: Update park photo
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this park photo.
|
|
required: true
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutput'
|
|
examples:
|
|
ParkPhotoWithCloudflareImages:
|
|
value:
|
|
id: 456
|
|
image: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_url: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/def456ghi789/medium
|
|
large: https://imagedelivery.net/account-hash/def456ghi789/large
|
|
public: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
caption: Beautiful park entrance
|
|
alt_text: Main entrance gate with decorative archway
|
|
is_primary: true
|
|
is_approved: true
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T11:00:00Z'
|
|
uploaded_by_username: parkfan456
|
|
file_size: 1536000
|
|
dimensions:
|
|
- 1600
|
|
- 900
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete park photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
patch:
|
|
operationId: v1_parks_photos_partial_update
|
|
description: Partially update park photo information. Requires authentication
|
|
and ownership or admin privileges.
|
|
summary: Partially update park photo
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this park photo.
|
|
required: true
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedParkPhotoUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutput'
|
|
examples:
|
|
ParkPhotoWithCloudflareImages:
|
|
value:
|
|
id: 456
|
|
image: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_url: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/def456ghi789/medium
|
|
large: https://imagedelivery.net/account-hash/def456ghi789/large
|
|
public: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
caption: Beautiful park entrance
|
|
alt_text: Main entrance gate with decorative archway
|
|
is_primary: true
|
|
is_approved: true
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T11:00:00Z'
|
|
uploaded_by_username: parkfan456
|
|
file_size: 1536000
|
|
dimensions:
|
|
- 1600
|
|
- 900
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete park photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
delete:
|
|
operationId: v1_parks_photos_destroy
|
|
description: Delete a park photo. Requires authentication and ownership or admin
|
|
privileges.
|
|
summary: Delete park photo
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this park photo.
|
|
required: true
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/{park_pk}/photos/{id}/set_primary/:
|
|
post:
|
|
operationId: v1_parks_photos_set_primary_create
|
|
description: Set this photo as the primary photo for the park
|
|
summary: Set photo as primary
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this park photo.
|
|
required: true
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutputRequest'
|
|
examples:
|
|
ParkPhotoWithCloudflareImages:
|
|
value:
|
|
id: 456
|
|
image: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_url: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/def456ghi789/medium
|
|
large: https://imagedelivery.net/account-hash/def456ghi789/large
|
|
public: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
caption: Beautiful park entrance
|
|
alt_text: Main entrance gate with decorative archway
|
|
is_primary: true
|
|
is_approved: true
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T11:00:00Z'
|
|
uploaded_by_username: parkfan456
|
|
file_size: 1536000
|
|
dimensions:
|
|
- 1600
|
|
- 900
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete park photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/{park_pk}/photos/{id}/set_primary_legacy/:
|
|
post:
|
|
operationId: v1_parks_photos_set_primary_legacy_create
|
|
description: Legacy set primary action for backwards compatibility
|
|
summary: Set photo as primary (legacy)
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this park photo.
|
|
required: true
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutputRequest'
|
|
examples:
|
|
ParkPhotoWithCloudflareImages:
|
|
value:
|
|
id: 456
|
|
image: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_url: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/def456ghi789/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/def456ghi789/medium
|
|
large: https://imagedelivery.net/account-hash/def456ghi789/large
|
|
public: https://imagedelivery.net/account-hash/def456ghi789/public
|
|
caption: Beautiful park entrance
|
|
alt_text: Main entrance gate with decorative archway
|
|
is_primary: true
|
|
is_approved: true
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T11:00:00Z'
|
|
uploaded_by_username: parkfan456
|
|
file_size: 1536000
|
|
dimensions:
|
|
- 1600
|
|
- 900
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete park photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/{park_pk}/photos/bulk_approve/:
|
|
post:
|
|
operationId: v1_parks_photos_bulk_approve_create
|
|
description: Bulk approve or reject multiple park photos (admin only)
|
|
summary: Bulk approve/reject photos
|
|
parameters:
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoApprovalInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/{park_pk}/photos/stats/:
|
|
get:
|
|
operationId: v1_parks_photos_stats_retrieve
|
|
description: Get photo statistics for the park
|
|
summary: Get park photo statistics
|
|
parameters:
|
|
- in: path
|
|
name: park_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Park Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ParkPhotoStatsOutput'
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/{id}/:
|
|
get:
|
|
operationId: v1_parks_retrieve_2
|
|
summary: Retrieve, update or delete a park
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
put:
|
|
operationId: v1_parks_update
|
|
summary: Retrieve, update or delete a park
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
patch:
|
|
operationId: v1_parks_partial_update
|
|
summary: Retrieve, update or delete a park
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
delete:
|
|
operationId: v1_parks_destroy
|
|
summary: Retrieve, update or delete a park
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: Unspecified response body
|
|
description: ''
|
|
/api/v1/parks/filter-options/:
|
|
get:
|
|
operationId: v1_parks_filter_options_retrieve
|
|
description: Return static/dynamic filter options used by the frontend.
|
|
summary: Get filter options for parks
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/parks/search-suggestions/:
|
|
get:
|
|
operationId: v1_parks_search_suggestions_retrieve
|
|
summary: Search suggestions for park search box
|
|
parameters:
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/parks/search/companies/:
|
|
get:
|
|
operationId: v1_parks_search_companies_retrieve
|
|
summary: Search companies (operators/property owners) for autocomplete
|
|
parameters:
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Parks
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rankings/:
|
|
get:
|
|
operationId: v1_rankings_list
|
|
description: Get the current ride rankings calculated using the Internet Roller
|
|
Coaster Poll algorithm.
|
|
summary: List ride rankings
|
|
parameters:
|
|
- in: query
|
|
name: category
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- DR
|
|
- FR
|
|
- OT
|
|
- RC
|
|
- TR
|
|
- WR
|
|
description: Filter by ride category (RC, DR, FR, WR, TR, OT)
|
|
- in: query
|
|
name: min_riders
|
|
schema:
|
|
type: integer
|
|
description: Minimum number of mutual riders required
|
|
- in: query
|
|
name: ordering
|
|
schema:
|
|
type: string
|
|
description: Order results (rank, -rank, winning_percentage, -winning_percentage)
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: park
|
|
schema:
|
|
type: string
|
|
description: Filter by park slug
|
|
- in: query
|
|
name: ride__category
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- ''
|
|
- DR
|
|
- FR
|
|
- OT
|
|
- RC
|
|
- TR
|
|
- WR
|
|
description: |-
|
|
* `` - Select ride type
|
|
* `RC` - Roller Coaster
|
|
* `DR` - Dark Ride
|
|
* `FR` - Flat Ride
|
|
* `WR` - Water Ride
|
|
* `TR` - Transport
|
|
* `OT` - Other
|
|
tags:
|
|
- Rankings
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedRideRankingList'
|
|
examples:
|
|
RideRankingExample:
|
|
value:
|
|
count: 123
|
|
next: http://api.example.org/accounts/?page=4
|
|
previous: http://api.example.org/accounts/?page=2
|
|
results:
|
|
- id: 1
|
|
rank: 1
|
|
ride:
|
|
id: 123
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
park:
|
|
id: 45
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
category: RC
|
|
wins: 523
|
|
losses: 87
|
|
ties: 45
|
|
winning_percentage: 0.8234
|
|
mutual_riders_count: 1250
|
|
comparison_count: 655
|
|
average_rating: 9.2
|
|
last_calculated: '2024-01-15T02:00:00Z'
|
|
rank_change: 2
|
|
previous_rank: 3
|
|
summary: Example ranking response
|
|
description: A ride ranking with all metrics
|
|
description: ''
|
|
/api/v1/rankings/{ride_slug}/:
|
|
get:
|
|
operationId: v1_rankings_retrieve
|
|
description: Get detailed ranking information for a specific ride.
|
|
summary: Get ranking details
|
|
parameters:
|
|
- in: path
|
|
name: ride_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Rankings
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideRankingDetail'
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rankings/{ride_slug}/comparisons/:
|
|
get:
|
|
operationId: v1_rankings_comparisons_retrieve
|
|
description: Get head-to-head comparisons for a specific ride
|
|
summary: Get ride comparisons
|
|
parameters:
|
|
- in: path
|
|
name: ride_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Rankings
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rankings/{ride_slug}/history/:
|
|
get:
|
|
operationId: v1_rankings_history_list
|
|
description: Get historical ranking data for a specific ride.
|
|
summary: Get ranking history
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: ride__category
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- ''
|
|
- DR
|
|
- FR
|
|
- OT
|
|
- RC
|
|
- TR
|
|
- WR
|
|
description: |-
|
|
* `` - Select ride type
|
|
* `RC` - Roller Coaster
|
|
* `DR` - Dark Ride
|
|
* `FR` - Flat Ride
|
|
* `WR` - Water Ride
|
|
* `TR` - Transport
|
|
* `OT` - Other
|
|
- in: path
|
|
name: ride_slug
|
|
schema:
|
|
type: string
|
|
required: true
|
|
tags:
|
|
- Rankings
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedRankingSnapshotList'
|
|
description: ''
|
|
/api/v1/rankings/calculate/:
|
|
post:
|
|
operationId: v1_rankings_calculate_create
|
|
description: Manually trigger a ranking calculation (admin only).
|
|
summary: Trigger ranking calculation
|
|
tags:
|
|
- Rankings
|
|
- Admin
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rankings/statistics/:
|
|
get:
|
|
operationId: v1_rankings_statistics_retrieve
|
|
description: Get overall statistics about the ranking system.
|
|
summary: Get ranking statistics
|
|
tags:
|
|
- Rankings
|
|
- Statistics
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RankingStats'
|
|
description: ''
|
|
/api/v1/rides/:
|
|
get:
|
|
operationId: v1_rides_list
|
|
description: List rides with basic filtering and pagination.
|
|
summary: List rides with filtering and pagination
|
|
parameters:
|
|
- in: query
|
|
name: page
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: page_size
|
|
schema:
|
|
type: integer
|
|
- in: query
|
|
name: park_slug
|
|
schema:
|
|
type: string
|
|
- in: query
|
|
name: search
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RideListOutput'
|
|
examples:
|
|
RideListExample:
|
|
value:
|
|
- id: 1
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
category: ROLLER_COASTER
|
|
status: OPERATING
|
|
description: Hybrid roller coaster
|
|
park:
|
|
id: 1
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
average_rating: 4.8
|
|
capacity_per_hour: 1200
|
|
opening_date: '2018-05-05'
|
|
summary: Example ride list response
|
|
description: A typical ride in the list view
|
|
description: ''
|
|
post:
|
|
operationId: v1_rides_create
|
|
description: Create a new ride.
|
|
summary: Create a new ride
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideDetailOutput'
|
|
examples:
|
|
RideDetailExample:
|
|
value:
|
|
id: 1
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
category: ROLLER_COASTER
|
|
status: OPERATING
|
|
description: Hybrid roller coaster featuring RMC I-Box track
|
|
park:
|
|
id: 1
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
opening_date: '2018-05-05'
|
|
min_height_in: 48
|
|
capacity_per_hour: 1200
|
|
ride_duration_seconds: 150
|
|
average_rating: 4.8
|
|
manufacturer:
|
|
id: 1
|
|
name: Rocky Mountain Construction
|
|
slug: rocky-mountain-construction
|
|
summary: Example ride detail response
|
|
description: A complete ride detail response
|
|
description: ''
|
|
/api/v1/rides/{id}/:
|
|
get:
|
|
operationId: v1_rides_retrieve
|
|
summary: Retrieve, update or delete a ride
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideDetailOutput'
|
|
examples:
|
|
RideDetailExample:
|
|
value:
|
|
id: 1
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
category: ROLLER_COASTER
|
|
status: OPERATING
|
|
description: Hybrid roller coaster featuring RMC I-Box track
|
|
park:
|
|
id: 1
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
opening_date: '2018-05-05'
|
|
min_height_in: 48
|
|
capacity_per_hour: 1200
|
|
ride_duration_seconds: 150
|
|
average_rating: 4.8
|
|
manufacturer:
|
|
id: 1
|
|
name: Rocky Mountain Construction
|
|
slug: rocky-mountain-construction
|
|
summary: Example ride detail response
|
|
description: A complete ride detail response
|
|
description: ''
|
|
put:
|
|
operationId: v1_rides_update
|
|
summary: Retrieve, update or delete a ride
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideDetailOutput'
|
|
examples:
|
|
RideDetailExample:
|
|
value:
|
|
id: 1
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
category: ROLLER_COASTER
|
|
status: OPERATING
|
|
description: Hybrid roller coaster featuring RMC I-Box track
|
|
park:
|
|
id: 1
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
opening_date: '2018-05-05'
|
|
min_height_in: 48
|
|
capacity_per_hour: 1200
|
|
ride_duration_seconds: 150
|
|
average_rating: 4.8
|
|
manufacturer:
|
|
id: 1
|
|
name: Rocky Mountain Construction
|
|
slug: rocky-mountain-construction
|
|
summary: Example ride detail response
|
|
description: A complete ride detail response
|
|
description: ''
|
|
patch:
|
|
operationId: v1_rides_partial_update
|
|
summary: Retrieve, update or delete a ride
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideDetailOutput'
|
|
examples:
|
|
RideDetailExample:
|
|
value:
|
|
id: 1
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
category: ROLLER_COASTER
|
|
status: OPERATING
|
|
description: Hybrid roller coaster featuring RMC I-Box track
|
|
park:
|
|
id: 1
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
opening_date: '2018-05-05'
|
|
min_height_in: 48
|
|
capacity_per_hour: 1200
|
|
ride_duration_seconds: 150
|
|
average_rating: 4.8
|
|
manufacturer:
|
|
id: 1
|
|
name: Rocky Mountain Construction
|
|
slug: rocky-mountain-construction
|
|
summary: Example ride detail response
|
|
description: A complete ride detail response
|
|
description: ''
|
|
delete:
|
|
operationId: v1_rides_destroy
|
|
summary: Retrieve, update or delete a ride
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RideDetailOutput'
|
|
examples:
|
|
RideDetailExample:
|
|
value:
|
|
id: 1
|
|
name: Steel Vengeance
|
|
slug: steel-vengeance
|
|
category: ROLLER_COASTER
|
|
status: OPERATING
|
|
description: Hybrid roller coaster featuring RMC I-Box track
|
|
park:
|
|
id: 1
|
|
name: Cedar Point
|
|
slug: cedar-point
|
|
opening_date: '2018-05-05'
|
|
min_height_in: 48
|
|
capacity_per_hour: 1200
|
|
ride_duration_seconds: 150
|
|
average_rating: 4.8
|
|
manufacturer:
|
|
id: 1
|
|
name: Rocky Mountain Construction
|
|
slug: rocky-mountain-construction
|
|
summary: Example ride detail response
|
|
description: A complete ride detail response
|
|
description: ''
|
|
/api/v1/rides/{ride_pk}/photos/:
|
|
get:
|
|
operationId: v1_rides_photos_list
|
|
description: Retrieve a paginated list of ride photos with filtering capabilities.
|
|
summary: List ride photos
|
|
parameters:
|
|
- name: ordering
|
|
required: false
|
|
in: query
|
|
description: Which field to use when ordering the results.
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
required: false
|
|
in: query
|
|
description: A page number within the paginated result set.
|
|
schema:
|
|
type: integer
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
- name: search
|
|
required: false
|
|
in: query
|
|
description: A search term.
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Ride Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PaginatedRidePhotoListOutputList'
|
|
description: ''
|
|
post:
|
|
operationId: v1_rides_photos_create
|
|
description: Upload a new photo for a ride. Requires authentication.
|
|
summary: Upload ride photo
|
|
parameters:
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoCreateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoCreateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoCreateInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'201':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutput'
|
|
examples:
|
|
RidePhotoWithCloudflareImages:
|
|
value:
|
|
id: 123
|
|
image: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_url: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/abc123def456/medium
|
|
large: https://imagedelivery.net/account-hash/abc123def456/large
|
|
public: https://imagedelivery.net/account-hash/abc123def456/public
|
|
caption: Amazing roller coaster photo
|
|
alt_text: Steel roller coaster with multiple inversions
|
|
is_primary: true
|
|
is_approved: true
|
|
photo_type: exterior
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T10:00:00Z'
|
|
uploaded_by_username: photographer123
|
|
file_size: 2048576
|
|
dimensions:
|
|
- 1920
|
|
- 1080
|
|
ride_slug: steel-vengeance
|
|
ride_name: Steel Vengeance
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete ride photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/{ride_pk}/photos/{id}/:
|
|
get:
|
|
operationId: v1_rides_photos_retrieve
|
|
description: Retrieve detailed information about a specific ride photo.
|
|
summary: Get ride photo details
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this ride photo.
|
|
required: true
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutput'
|
|
examples:
|
|
RidePhotoWithCloudflareImages:
|
|
value:
|
|
id: 123
|
|
image: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_url: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/abc123def456/medium
|
|
large: https://imagedelivery.net/account-hash/abc123def456/large
|
|
public: https://imagedelivery.net/account-hash/abc123def456/public
|
|
caption: Amazing roller coaster photo
|
|
alt_text: Steel roller coaster with multiple inversions
|
|
is_primary: true
|
|
is_approved: true
|
|
photo_type: exterior
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T10:00:00Z'
|
|
uploaded_by_username: photographer123
|
|
file_size: 2048576
|
|
dimensions:
|
|
- 1920
|
|
- 1080
|
|
ride_slug: steel-vengeance
|
|
ride_name: Steel Vengeance
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete ride photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
put:
|
|
operationId: v1_rides_photos_update
|
|
description: Update ride photo information. Requires authentication and ownership
|
|
or admin privileges.
|
|
summary: Update ride photo
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this ride photo.
|
|
required: true
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutput'
|
|
examples:
|
|
RidePhotoWithCloudflareImages:
|
|
value:
|
|
id: 123
|
|
image: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_url: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/abc123def456/medium
|
|
large: https://imagedelivery.net/account-hash/abc123def456/large
|
|
public: https://imagedelivery.net/account-hash/abc123def456/public
|
|
caption: Amazing roller coaster photo
|
|
alt_text: Steel roller coaster with multiple inversions
|
|
is_primary: true
|
|
is_approved: true
|
|
photo_type: exterior
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T10:00:00Z'
|
|
uploaded_by_username: photographer123
|
|
file_size: 2048576
|
|
dimensions:
|
|
- 1920
|
|
- 1080
|
|
ride_slug: steel-vengeance
|
|
ride_name: Steel Vengeance
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete ride photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
patch:
|
|
operationId: v1_rides_photos_partial_update
|
|
description: Partially update ride photo information. Requires authentication
|
|
and ownership or admin privileges.
|
|
summary: Partially update ride photo
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this ride photo.
|
|
required: true
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/PatchedRidePhotoUpdateInputRequest'
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutput'
|
|
examples:
|
|
RidePhotoWithCloudflareImages:
|
|
value:
|
|
id: 123
|
|
image: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_url: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/abc123def456/medium
|
|
large: https://imagedelivery.net/account-hash/abc123def456/large
|
|
public: https://imagedelivery.net/account-hash/abc123def456/public
|
|
caption: Amazing roller coaster photo
|
|
alt_text: Steel roller coaster with multiple inversions
|
|
is_primary: true
|
|
is_approved: true
|
|
photo_type: exterior
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T10:00:00Z'
|
|
uploaded_by_username: photographer123
|
|
file_size: 2048576
|
|
dimensions:
|
|
- 1920
|
|
- 1080
|
|
ride_slug: steel-vengeance
|
|
ride_name: Steel Vengeance
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete ride photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
delete:
|
|
operationId: v1_rides_photos_destroy
|
|
description: Delete a ride photo. Requires authentication and ownership or admin
|
|
privileges.
|
|
summary: Delete ride photo
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this ride photo.
|
|
required: true
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'204':
|
|
description: No response body
|
|
'401':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/{ride_pk}/photos/{id}/set_primary/:
|
|
post:
|
|
operationId: v1_rides_photos_set_primary_create
|
|
description: Set this photo as the primary photo for the ride
|
|
summary: Set photo as primary
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this ride photo.
|
|
required: true
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutputRequest'
|
|
examples:
|
|
RidePhotoWithCloudflareImages:
|
|
value:
|
|
id: 123
|
|
image: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_url: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/abc123def456/medium
|
|
large: https://imagedelivery.net/account-hash/abc123def456/large
|
|
public: https://imagedelivery.net/account-hash/abc123def456/public
|
|
caption: Amazing roller coaster photo
|
|
alt_text: Steel roller coaster with multiple inversions
|
|
is_primary: true
|
|
is_approved: true
|
|
photo_type: exterior
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T10:00:00Z'
|
|
uploaded_by_username: photographer123
|
|
file_size: 2048576
|
|
dimensions:
|
|
- 1920
|
|
- 1080
|
|
ride_slug: steel-vengeance
|
|
ride_name: Steel Vengeance
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete ride photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/{ride_pk}/photos/{id}/set_primary_legacy/:
|
|
post:
|
|
operationId: v1_rides_photos_set_primary_legacy_create
|
|
description: Legacy set primary action for backwards compatibility
|
|
summary: Set photo as primary (legacy)
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
schema:
|
|
type: integer
|
|
description: A unique integer value identifying this ride photo.
|
|
required: true
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutputRequest'
|
|
examples:
|
|
RidePhotoWithCloudflareImages:
|
|
value:
|
|
id: 123
|
|
image: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_url: https://imagedelivery.net/account-hash/abc123def456/public
|
|
image_variants:
|
|
thumbnail: https://imagedelivery.net/account-hash/abc123def456/thumbnail
|
|
medium: https://imagedelivery.net/account-hash/abc123def456/medium
|
|
large: https://imagedelivery.net/account-hash/abc123def456/large
|
|
public: https://imagedelivery.net/account-hash/abc123def456/public
|
|
caption: Amazing roller coaster photo
|
|
alt_text: Steel roller coaster with multiple inversions
|
|
is_primary: true
|
|
is_approved: true
|
|
photo_type: exterior
|
|
created_at: '2023-01-01T12:00:00Z'
|
|
updated_at: '2023-01-01T12:00:00Z'
|
|
date_taken: '2023-01-01T10:00:00Z'
|
|
uploaded_by_username: photographer123
|
|
file_size: 2048576
|
|
dimensions:
|
|
- 1920
|
|
- 1080
|
|
ride_slug: steel-vengeance
|
|
ride_name: Steel Vengeance
|
|
park_slug: cedar-point
|
|
park_name: Cedar Point
|
|
summary: Complete ride photo response
|
|
description: Example response showing all fields including Cloudflare
|
|
Images URLs and variants
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoOutputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/{ride_pk}/photos/bulk_approve/:
|
|
post:
|
|
operationId: v1_rides_photos_bulk_approve_create
|
|
description: Bulk approve or reject multiple ride photos (admin only)
|
|
summary: Bulk approve/reject photos
|
|
parameters:
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoApprovalInputRequest'
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoApprovalInputRequest'
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoApprovalInputRequest'
|
|
required: true
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'400':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'403':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/{ride_pk}/photos/stats/:
|
|
get:
|
|
operationId: v1_rides_photos_stats_retrieve
|
|
description: Get photo statistics for the ride
|
|
summary: Get ride photo statistics
|
|
parameters:
|
|
- in: path
|
|
name: ride_pk
|
|
schema:
|
|
type: integer
|
|
required: true
|
|
tags:
|
|
- Ride Media
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/RidePhotoStatsOutput'
|
|
description: ''
|
|
'404':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/filter-options/:
|
|
get:
|
|
operationId: v1_rides_filter_options_retrieve
|
|
description: Return static/dynamic filter options used by the frontend.
|
|
summary: Get filter options for rides
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/search-suggestions/:
|
|
get:
|
|
operationId: v1_rides_search_suggestions_retrieve
|
|
summary: Search suggestions for ride search box
|
|
parameters:
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/rides/search/companies/:
|
|
get:
|
|
operationId: v1_rides_search_companies_retrieve
|
|
summary: Search companies (manufacturers/designers) for autocomplete
|
|
parameters:
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/rides/search/ride-models/:
|
|
get:
|
|
operationId: v1_rides_search_ride_models_retrieve
|
|
summary: Search ride models for autocomplete
|
|
parameters:
|
|
- in: query
|
|
name: q
|
|
schema:
|
|
type: string
|
|
tags:
|
|
- Rides
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
description: No response body
|
|
/api/v1/stats/:
|
|
get:
|
|
operationId: get_platform_stats
|
|
description: "Returns comprehensive aggregate statistics about the ThrillWiki\
|
|
\ platform.\n \n This endpoint provides detailed counts and\
|
|
\ breakdowns of all major entities including:\n - Parks, rides, and\
|
|
\ roller coasters\n - Companies (manufacturers, operators, designers,\
|
|
\ property owners)\n - Photos and reviews\n - Ride categories\
|
|
\ (roller coasters, dark rides, flat rides, etc.)\n - Status breakdowns\
|
|
\ (operating, closed, under construction, etc.)\n \n Results\
|
|
\ are cached for 5 minutes for optimal performance and automatically \n \
|
|
\ invalidated when relevant data changes.\n \n **No authentication\
|
|
\ required** - this is a public endpoint."
|
|
summary: Get platform statistics
|
|
tags:
|
|
- Statistics
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Stats'
|
|
examples:
|
|
SampleResponse:
|
|
value:
|
|
total_parks: 7
|
|
total_rides: 10
|
|
total_manufacturers: 6
|
|
total_operators: 7
|
|
total_designers: 4
|
|
total_property_owners: 0
|
|
total_roller_coasters: 8
|
|
total_photos: 0
|
|
total_park_photos: 0
|
|
total_ride_photos: 0
|
|
total_reviews: 8
|
|
total_park_reviews: 4
|
|
total_ride_reviews: 4
|
|
roller_coasters: 10
|
|
operating_parks: 7
|
|
operating_rides: 10
|
|
last_updated: '2025-08-28T17:34:59.677143+00:00'
|
|
relative_last_updated: just now
|
|
summary: Sample Response
|
|
description: Example of platform statistics response
|
|
description: ''
|
|
'500':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
error:
|
|
type: string
|
|
description: Error message if statistics calculation fails
|
|
description: ''
|
|
/api/v1/trending/content/:
|
|
get:
|
|
operationId: v1_trending_content_retrieve
|
|
description: Retrieve trending parks and rides based on view counts, ratings,
|
|
and recency.
|
|
summary: Get trending content
|
|
parameters:
|
|
- in: query
|
|
name: limit
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
description: 'Number of trending items to return (default: 20, max: 100)'
|
|
- in: query
|
|
name: timeframe
|
|
schema:
|
|
type: string
|
|
enum:
|
|
- day
|
|
- month
|
|
- week
|
|
default: week
|
|
description: 'Timeframe for trending calculation (day, week, month) - default:
|
|
week'
|
|
tags:
|
|
- Trending
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
/api/v1/trending/new/:
|
|
get:
|
|
operationId: v1_trending_new_retrieve
|
|
description: Retrieve recently added parks and rides.
|
|
summary: Get new content
|
|
parameters:
|
|
- in: query
|
|
name: days
|
|
schema:
|
|
type: integer
|
|
default: 30
|
|
description: 'Number of days to look back for new content (default: 30, max:
|
|
365)'
|
|
- in: query
|
|
name: limit
|
|
schema:
|
|
type: integer
|
|
default: 20
|
|
description: 'Number of new items to return (default: 20, max: 100)'
|
|
tags:
|
|
- Trending
|
|
security:
|
|
- cookieAuth: []
|
|
- tokenAuth: []
|
|
- {}
|
|
responses:
|
|
'200':
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: {}
|
|
description: ''
|
|
components:
|
|
schemas:
|
|
AuthStatusOutput:
|
|
type: object
|
|
description: Output serializer for authentication status.
|
|
properties:
|
|
authenticated:
|
|
type: boolean
|
|
description: Whether user is authenticated
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserOutput'
|
|
nullable: true
|
|
description: User information if authenticated
|
|
required:
|
|
- authenticated
|
|
- user
|
|
AuthStatusOutputRequest:
|
|
type: object
|
|
description: Output serializer for authentication status.
|
|
properties:
|
|
authenticated:
|
|
type: boolean
|
|
description: Whether user is authenticated
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserOutputRequest'
|
|
nullable: true
|
|
description: User information if authenticated
|
|
required:
|
|
- authenticated
|
|
- user
|
|
CategoryEnum:
|
|
enum:
|
|
- RC
|
|
- DR
|
|
- FR
|
|
- WR
|
|
- PK
|
|
type: string
|
|
description: |-
|
|
* `RC` - Roller Coaster
|
|
* `DR` - Dark Ride
|
|
* `FR` - Flat Ride
|
|
* `WR` - Water Ride
|
|
* `PK` - Park
|
|
HealthCheckOutput:
|
|
type: object
|
|
description: Output serializer for health check responses.
|
|
properties:
|
|
status:
|
|
$ref: '#/components/schemas/HealthCheckOutputStatusEnum'
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
version:
|
|
type: string
|
|
environment:
|
|
type: string
|
|
response_time_ms:
|
|
type: number
|
|
format: double
|
|
checks:
|
|
type: object
|
|
additionalProperties: {}
|
|
metrics:
|
|
type: object
|
|
additionalProperties: {}
|
|
required:
|
|
- checks
|
|
- environment
|
|
- metrics
|
|
- response_time_ms
|
|
- status
|
|
- timestamp
|
|
- version
|
|
HealthCheckOutputStatusEnum:
|
|
enum:
|
|
- healthy
|
|
- unhealthy
|
|
type: string
|
|
description: |-
|
|
* `healthy` - healthy
|
|
* `unhealthy` - unhealthy
|
|
HistorySummary:
|
|
type: object
|
|
description: Serializer for history summary information.
|
|
properties:
|
|
total_events:
|
|
type: integer
|
|
first_recorded:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
last_modified:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
required:
|
|
- first_recorded
|
|
- last_modified
|
|
- total_events
|
|
LoginInputRequest:
|
|
type: object
|
|
description: Input serializer for user login.
|
|
properties:
|
|
username:
|
|
type: string
|
|
minLength: 1
|
|
description: Username or email address
|
|
maxLength: 150
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: User password
|
|
required:
|
|
- password
|
|
- username
|
|
LoginOutput:
|
|
type: object
|
|
description: Output serializer for login response.
|
|
properties:
|
|
token:
|
|
type: string
|
|
description: Authentication token
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserOutput'
|
|
description: User information
|
|
message:
|
|
type: string
|
|
description: Success message
|
|
required:
|
|
- message
|
|
- token
|
|
- user
|
|
LogoutOutput:
|
|
type: object
|
|
description: Output serializer for logout response.
|
|
properties:
|
|
message:
|
|
type: string
|
|
description: Success message
|
|
required:
|
|
- message
|
|
LogoutOutputRequest:
|
|
type: object
|
|
description: Output serializer for logout response.
|
|
properties:
|
|
message:
|
|
type: string
|
|
minLength: 1
|
|
description: Success message
|
|
required:
|
|
- message
|
|
MapLocationDetail:
|
|
type: object
|
|
description: Serializer for detailed map location information.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
type:
|
|
type: string
|
|
name:
|
|
type: string
|
|
slug:
|
|
type: string
|
|
description:
|
|
type: string
|
|
latitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
longitude:
|
|
type: number
|
|
format: double
|
|
nullable: true
|
|
status:
|
|
type: string
|
|
location:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
stats:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
nearby_locations:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
required:
|
|
- description
|
|
- id
|
|
- latitude
|
|
- location
|
|
- longitude
|
|
- name
|
|
- nearby_locations
|
|
- slug
|
|
- stats
|
|
- status
|
|
- type
|
|
MapLocationsResponse:
|
|
type: object
|
|
description: Response serializer for map locations endpoint.
|
|
properties:
|
|
status:
|
|
type: string
|
|
default: success
|
|
locations:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
clusters:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
bounds:
|
|
type: object
|
|
additionalProperties: {}
|
|
total_count:
|
|
type: integer
|
|
default: 0
|
|
clustered:
|
|
type: boolean
|
|
default: false
|
|
required:
|
|
- locations
|
|
MapSearchResponse:
|
|
type: object
|
|
description: Response serializer for map search endpoint.
|
|
properties:
|
|
status:
|
|
type: string
|
|
default: success
|
|
results:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
query:
|
|
type: string
|
|
total_count:
|
|
type: integer
|
|
default: 0
|
|
page:
|
|
type: integer
|
|
default: 1
|
|
page_size:
|
|
type: integer
|
|
default: 20
|
|
required:
|
|
- query
|
|
- results
|
|
PaginatedParkHistoryEventList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ParkHistoryEvent'
|
|
PaginatedParkPhotoListOutputList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ParkPhotoListOutput'
|
|
PaginatedRankingSnapshotList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RankingSnapshot'
|
|
PaginatedRideHistoryEventList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RideHistoryEvent'
|
|
PaginatedRidePhotoListOutputList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RidePhotoListOutput'
|
|
PaginatedRideRankingList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RideRanking'
|
|
PaginatedTopListItemOutputList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TopListItemOutput'
|
|
PaginatedTopListOutputList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TopListOutput'
|
|
PaginatedUnifiedHistoryTimelineList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/UnifiedHistoryTimeline'
|
|
PaginatedUserProfileOutputList:
|
|
type: object
|
|
required:
|
|
- count
|
|
- results
|
|
properties:
|
|
count:
|
|
type: integer
|
|
example: 123
|
|
next:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=4
|
|
previous:
|
|
type: string
|
|
nullable: true
|
|
format: uri
|
|
example: http://api.example.org/accounts/?page=2
|
|
results:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/UserProfileOutput'
|
|
ParkHistoryEvent:
|
|
type: object
|
|
description: Serializer for park history events.
|
|
properties:
|
|
pgh_id:
|
|
type: integer
|
|
readOnly: true
|
|
pgh_created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
pgh_label:
|
|
type: string
|
|
readOnly: true
|
|
pgh_obj_id:
|
|
type: integer
|
|
readOnly: true
|
|
pgh_context:
|
|
readOnly: true
|
|
nullable: true
|
|
pgh_data:
|
|
readOnly: true
|
|
event_type:
|
|
type: string
|
|
readOnly: true
|
|
changes:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
required:
|
|
- changes
|
|
- event_type
|
|
- pgh_context
|
|
- pgh_created_at
|
|
- pgh_data
|
|
- pgh_id
|
|
- pgh_label
|
|
- pgh_obj_id
|
|
ParkHistoryOutput:
|
|
type: object
|
|
description: Output serializer for complete park history.
|
|
properties:
|
|
park:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
current_state:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
summary:
|
|
$ref: '#/components/schemas/HistorySummary'
|
|
events:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ParkHistoryEvent'
|
|
required:
|
|
- current_state
|
|
- events
|
|
- park
|
|
- summary
|
|
ParkPhotoApprovalInputRequest:
|
|
type: object
|
|
description: Input serializer for bulk photo approval operations.
|
|
properties:
|
|
photo_ids:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
description: List of photo IDs to approve
|
|
approve:
|
|
type: boolean
|
|
default: true
|
|
description: Whether to approve (True) or reject (False) the photos
|
|
required:
|
|
- photo_ids
|
|
ParkPhotoCreateInputRequest:
|
|
type: object
|
|
description: Input serializer for creating park photos.
|
|
properties:
|
|
image:
|
|
type: string
|
|
format: binary
|
|
description: Park photo stored on Cloudflare Images
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
required:
|
|
- image
|
|
ParkPhotoListOutput:
|
|
type: object
|
|
description: Optimized output serializer for park photo lists.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
image:
|
|
type: string
|
|
format: uri
|
|
readOnly: true
|
|
description: Park photo stored on Cloudflare Images
|
|
caption:
|
|
type: string
|
|
readOnly: true
|
|
is_primary:
|
|
type: boolean
|
|
readOnly: true
|
|
is_approved:
|
|
type: boolean
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
uploaded_by_username:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- caption
|
|
- created_at
|
|
- id
|
|
- image
|
|
- is_approved
|
|
- is_primary
|
|
- uploaded_by_username
|
|
ParkPhotoOutput:
|
|
type: object
|
|
description: Enhanced output serializer for park photos with Cloudflare Images
|
|
support.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
image:
|
|
type: string
|
|
format: uri
|
|
description: Park photo stored on Cloudflare Images
|
|
image_url:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
description: Full URL to the Cloudflare Images asset
|
|
readOnly: true
|
|
image_variants:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
format: uri
|
|
description: Available Cloudflare Images variants with their URLs
|
|
readOnly: true
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
is_approved:
|
|
type: boolean
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
date_taken:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
uploaded_by_username:
|
|
type: string
|
|
readOnly: true
|
|
file_size:
|
|
type: integer
|
|
nullable: true
|
|
description: File size in bytes
|
|
readOnly: true
|
|
dimensions:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
nullable: true
|
|
description: Image dimensions as [width, height] in pixels
|
|
readOnly: true
|
|
park_slug:
|
|
type: string
|
|
readOnly: true
|
|
park_name:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- dimensions
|
|
- file_size
|
|
- id
|
|
- image
|
|
- image_url
|
|
- image_variants
|
|
- park_name
|
|
- park_slug
|
|
- updated_at
|
|
- uploaded_by_username
|
|
ParkPhotoOutputRequest:
|
|
type: object
|
|
description: Enhanced output serializer for park photos with Cloudflare Images
|
|
support.
|
|
properties:
|
|
image:
|
|
type: string
|
|
format: binary
|
|
description: Park photo stored on Cloudflare Images
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
is_approved:
|
|
type: boolean
|
|
date_taken:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
required:
|
|
- image
|
|
ParkPhotoStatsOutput:
|
|
type: object
|
|
description: Output serializer for park photo statistics.
|
|
properties:
|
|
total_photos:
|
|
type: integer
|
|
approved_photos:
|
|
type: integer
|
|
pending_photos:
|
|
type: integer
|
|
has_primary:
|
|
type: boolean
|
|
recent_uploads:
|
|
type: integer
|
|
required:
|
|
- approved_photos
|
|
- has_primary
|
|
- pending_photos
|
|
- recent_uploads
|
|
- total_photos
|
|
ParkPhotoUpdateInputRequest:
|
|
type: object
|
|
description: Input serializer for updating park photos.
|
|
properties:
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
PasswordChangeInputRequest:
|
|
type: object
|
|
description: Input serializer for password change.
|
|
properties:
|
|
old_password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: Current password
|
|
new_password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: New password
|
|
new_password_confirm:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: New password confirmation
|
|
required:
|
|
- new_password
|
|
- new_password_confirm
|
|
- old_password
|
|
PasswordChangeOutput:
|
|
type: object
|
|
description: Output serializer for password change response.
|
|
properties:
|
|
detail:
|
|
type: string
|
|
description: Success message
|
|
required:
|
|
- detail
|
|
PasswordResetInputRequest:
|
|
type: object
|
|
description: Input serializer for password reset request.
|
|
properties:
|
|
email:
|
|
type: string
|
|
format: email
|
|
minLength: 1
|
|
description: Email address for password reset
|
|
required:
|
|
- email
|
|
PasswordResetOutput:
|
|
type: object
|
|
description: Output serializer for password reset response.
|
|
properties:
|
|
detail:
|
|
type: string
|
|
description: Success message
|
|
required:
|
|
- detail
|
|
PatchedParkPhotoUpdateInputRequest:
|
|
type: object
|
|
description: Input serializer for updating park photos.
|
|
properties:
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
PatchedRidePhotoUpdateInputRequest:
|
|
type: object
|
|
description: Input serializer for updating ride photos.
|
|
properties:
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
photo_type:
|
|
$ref: '#/components/schemas/PhotoTypeEnum'
|
|
is_primary:
|
|
type: boolean
|
|
PatchedTopListItemUpdateInputRequest:
|
|
type: object
|
|
properties:
|
|
object_id:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
notes:
|
|
type: string
|
|
top_list:
|
|
type: integer
|
|
content_type:
|
|
type: integer
|
|
PatchedTopListUpdateInputRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
description:
|
|
type: string
|
|
PatchedUserProfileUpdateInputRequest:
|
|
type: object
|
|
properties:
|
|
display_name:
|
|
type: string
|
|
minLength: 1
|
|
description: This is the name that will be displayed on the site
|
|
maxLength: 50
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
pronouns:
|
|
type: string
|
|
maxLength: 50
|
|
bio:
|
|
type: string
|
|
maxLength: 500
|
|
twitter:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
instagram:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
youtube:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
discord:
|
|
type: string
|
|
maxLength: 100
|
|
coaster_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
dark_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
flat_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
water_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
PerformanceMetricsOutput:
|
|
type: object
|
|
description: Output serializer for performance metrics.
|
|
properties:
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
database_analysis:
|
|
type: object
|
|
additionalProperties: {}
|
|
cache_performance:
|
|
type: object
|
|
additionalProperties: {}
|
|
recent_slow_queries:
|
|
type: array
|
|
items: {}
|
|
required:
|
|
- cache_performance
|
|
- database_analysis
|
|
- recent_slow_queries
|
|
- timestamp
|
|
PhotoTypeEnum:
|
|
enum:
|
|
- exterior
|
|
- queue
|
|
- station
|
|
- onride
|
|
- construction
|
|
- other
|
|
type: string
|
|
description: |-
|
|
* `exterior` - Exterior View
|
|
* `queue` - Queue Area
|
|
* `station` - Station
|
|
* `onride` - On-Ride
|
|
* `construction` - Construction
|
|
* `other` - Other
|
|
RankingSnapshot:
|
|
type: object
|
|
description: Serializer for ranking history snapshots.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
ride:
|
|
type: integer
|
|
ride_name:
|
|
type: string
|
|
readOnly: true
|
|
park_name:
|
|
type: string
|
|
readOnly: true
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
winning_percentage:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
|
|
snapshot_date:
|
|
type: string
|
|
format: date
|
|
description: Date when this ranking snapshot was taken
|
|
required:
|
|
- id
|
|
- park_name
|
|
- rank
|
|
- ride
|
|
- ride_name
|
|
- snapshot_date
|
|
- winning_percentage
|
|
RankingStats:
|
|
type: object
|
|
description: Serializer for ranking system statistics.
|
|
properties:
|
|
total_ranked_rides:
|
|
type: integer
|
|
total_comparisons:
|
|
type: integer
|
|
last_calculation_time:
|
|
type: string
|
|
format: date-time
|
|
calculation_duration:
|
|
type: number
|
|
format: double
|
|
top_rated_ride:
|
|
type: object
|
|
additionalProperties: {}
|
|
most_compared_ride:
|
|
type: object
|
|
additionalProperties: {}
|
|
biggest_rank_change:
|
|
type: object
|
|
additionalProperties: {}
|
|
required:
|
|
- biggest_rank_change
|
|
- calculation_duration
|
|
- last_calculation_time
|
|
- most_compared_ride
|
|
- top_rated_ride
|
|
- total_comparisons
|
|
- total_ranked_rides
|
|
RideDetailOutput:
|
|
type: object
|
|
description: Output serializer for ride detail view.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
slug:
|
|
type: string
|
|
category:
|
|
type: string
|
|
status:
|
|
type: string
|
|
post_closing_status:
|
|
type: string
|
|
nullable: true
|
|
description:
|
|
type: string
|
|
park:
|
|
$ref: '#/components/schemas/RideParkOutput'
|
|
park_area:
|
|
type: object
|
|
additionalProperties: {}
|
|
nullable: true
|
|
readOnly: true
|
|
opening_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
closing_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
status_since:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
min_height_in:
|
|
type: integer
|
|
nullable: true
|
|
max_height_in:
|
|
type: integer
|
|
nullable: true
|
|
capacity_per_hour:
|
|
type: integer
|
|
nullable: true
|
|
ride_duration_seconds:
|
|
type: integer
|
|
nullable: true
|
|
average_rating:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
|
|
nullable: true
|
|
manufacturer:
|
|
type: object
|
|
additionalProperties: {}
|
|
nullable: true
|
|
readOnly: true
|
|
designer:
|
|
type: object
|
|
additionalProperties: {}
|
|
nullable: true
|
|
readOnly: true
|
|
ride_model:
|
|
allOf:
|
|
- $ref: '#/components/schemas/RideModelOutput'
|
|
nullable: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
required:
|
|
- average_rating
|
|
- capacity_per_hour
|
|
- category
|
|
- closing_date
|
|
- created_at
|
|
- description
|
|
- designer
|
|
- id
|
|
- manufacturer
|
|
- max_height_in
|
|
- min_height_in
|
|
- name
|
|
- opening_date
|
|
- park
|
|
- park_area
|
|
- post_closing_status
|
|
- ride_duration_seconds
|
|
- ride_model
|
|
- slug
|
|
- status
|
|
- status_since
|
|
- updated_at
|
|
RideHistoryEvent:
|
|
type: object
|
|
description: Serializer for ride history events.
|
|
properties:
|
|
pgh_id:
|
|
type: integer
|
|
readOnly: true
|
|
pgh_created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
pgh_label:
|
|
type: string
|
|
readOnly: true
|
|
pgh_obj_id:
|
|
type: integer
|
|
readOnly: true
|
|
pgh_context:
|
|
readOnly: true
|
|
nullable: true
|
|
pgh_data:
|
|
readOnly: true
|
|
event_type:
|
|
type: string
|
|
readOnly: true
|
|
changes:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
required:
|
|
- changes
|
|
- event_type
|
|
- pgh_context
|
|
- pgh_created_at
|
|
- pgh_data
|
|
- pgh_id
|
|
- pgh_label
|
|
- pgh_obj_id
|
|
RideHistoryOutput:
|
|
type: object
|
|
description: Output serializer for complete ride history.
|
|
properties:
|
|
ride:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
current_state:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
summary:
|
|
$ref: '#/components/schemas/HistorySummary'
|
|
events:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/RideHistoryEvent'
|
|
required:
|
|
- current_state
|
|
- events
|
|
- ride
|
|
- summary
|
|
RideListOutput:
|
|
type: object
|
|
description: Output serializer for ride list view.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
slug:
|
|
type: string
|
|
category:
|
|
type: string
|
|
status:
|
|
type: string
|
|
description:
|
|
type: string
|
|
park:
|
|
$ref: '#/components/schemas/RideParkOutput'
|
|
average_rating:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
|
|
nullable: true
|
|
capacity_per_hour:
|
|
type: integer
|
|
nullable: true
|
|
opening_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
closing_date:
|
|
type: string
|
|
format: date
|
|
nullable: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
required:
|
|
- average_rating
|
|
- capacity_per_hour
|
|
- category
|
|
- closing_date
|
|
- created_at
|
|
- description
|
|
- id
|
|
- name
|
|
- opening_date
|
|
- park
|
|
- slug
|
|
- status
|
|
- updated_at
|
|
RideModelOutput:
|
|
type: object
|
|
description: Output serializer for ride model data.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
category:
|
|
type: string
|
|
manufacturer:
|
|
type: object
|
|
additionalProperties: {}
|
|
nullable: true
|
|
readOnly: true
|
|
required:
|
|
- category
|
|
- description
|
|
- id
|
|
- manufacturer
|
|
- name
|
|
RideParkOutput:
|
|
type: object
|
|
description: Output serializer for ride's park data.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
slug:
|
|
type: string
|
|
required:
|
|
- id
|
|
- name
|
|
- slug
|
|
RidePhotoApprovalInputRequest:
|
|
type: object
|
|
description: Input serializer for photo approval operations.
|
|
properties:
|
|
photo_ids:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
description: List of photo IDs to approve
|
|
approve:
|
|
type: boolean
|
|
default: true
|
|
description: Whether to approve (True) or reject (False) the photos
|
|
required:
|
|
- photo_ids
|
|
RidePhotoCreateInputRequest:
|
|
type: object
|
|
description: Input serializer for creating ride photos.
|
|
properties:
|
|
image:
|
|
type: string
|
|
format: binary
|
|
description: Ride photo stored on Cloudflare Images
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
photo_type:
|
|
$ref: '#/components/schemas/PhotoTypeEnum'
|
|
is_primary:
|
|
type: boolean
|
|
required:
|
|
- image
|
|
RidePhotoListOutput:
|
|
type: object
|
|
description: Simplified output serializer for ride photo lists.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
image:
|
|
type: string
|
|
format: uri
|
|
readOnly: true
|
|
description: Ride photo stored on Cloudflare Images
|
|
caption:
|
|
type: string
|
|
readOnly: true
|
|
photo_type:
|
|
allOf:
|
|
- $ref: '#/components/schemas/PhotoTypeEnum'
|
|
readOnly: true
|
|
is_primary:
|
|
type: boolean
|
|
readOnly: true
|
|
is_approved:
|
|
type: boolean
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
uploaded_by_username:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- caption
|
|
- created_at
|
|
- id
|
|
- image
|
|
- is_approved
|
|
- is_primary
|
|
- photo_type
|
|
- uploaded_by_username
|
|
RidePhotoOutput:
|
|
type: object
|
|
description: Output serializer for ride photos with Cloudflare Images support.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
image:
|
|
type: string
|
|
format: uri
|
|
description: Ride photo stored on Cloudflare Images
|
|
image_url:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
description: Full URL to the Cloudflare Images asset
|
|
readOnly: true
|
|
image_variants:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
format: uri
|
|
description: Available Cloudflare Images variants with their URLs
|
|
readOnly: true
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
is_approved:
|
|
type: boolean
|
|
photo_type:
|
|
$ref: '#/components/schemas/PhotoTypeEnum'
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
date_taken:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
uploaded_by_username:
|
|
type: string
|
|
readOnly: true
|
|
file_size:
|
|
type: integer
|
|
nullable: true
|
|
description: File size in bytes
|
|
readOnly: true
|
|
dimensions:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
nullable: true
|
|
description: Image dimensions as [width, height] in pixels
|
|
readOnly: true
|
|
ride_slug:
|
|
type: string
|
|
readOnly: true
|
|
ride_name:
|
|
type: string
|
|
readOnly: true
|
|
park_slug:
|
|
type: string
|
|
readOnly: true
|
|
park_name:
|
|
type: string
|
|
readOnly: true
|
|
required:
|
|
- created_at
|
|
- dimensions
|
|
- file_size
|
|
- id
|
|
- image
|
|
- image_url
|
|
- image_variants
|
|
- park_name
|
|
- park_slug
|
|
- ride_name
|
|
- ride_slug
|
|
- updated_at
|
|
- uploaded_by_username
|
|
RidePhotoOutputRequest:
|
|
type: object
|
|
description: Output serializer for ride photos with Cloudflare Images support.
|
|
properties:
|
|
image:
|
|
type: string
|
|
format: binary
|
|
description: Ride photo stored on Cloudflare Images
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
is_primary:
|
|
type: boolean
|
|
is_approved:
|
|
type: boolean
|
|
photo_type:
|
|
$ref: '#/components/schemas/PhotoTypeEnum'
|
|
date_taken:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
required:
|
|
- image
|
|
RidePhotoStatsOutput:
|
|
type: object
|
|
description: Output serializer for ride photo statistics.
|
|
properties:
|
|
total_photos:
|
|
type: integer
|
|
approved_photos:
|
|
type: integer
|
|
pending_photos:
|
|
type: integer
|
|
has_primary:
|
|
type: boolean
|
|
recent_uploads:
|
|
type: integer
|
|
by_type:
|
|
type: object
|
|
additionalProperties:
|
|
type: integer
|
|
description: Photo counts by type
|
|
required:
|
|
- approved_photos
|
|
- by_type
|
|
- has_primary
|
|
- pending_photos
|
|
- recent_uploads
|
|
- total_photos
|
|
RidePhotoUpdateInputRequest:
|
|
type: object
|
|
description: Input serializer for updating ride photos.
|
|
properties:
|
|
caption:
|
|
type: string
|
|
maxLength: 255
|
|
alt_text:
|
|
type: string
|
|
maxLength: 255
|
|
photo_type:
|
|
$ref: '#/components/schemas/PhotoTypeEnum'
|
|
is_primary:
|
|
type: boolean
|
|
RideRanking:
|
|
type: object
|
|
description: Serializer for ride rankings.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Overall rank position (1 = best)
|
|
ride:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
wins:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of rides this ride beats in pairwise comparisons
|
|
losses:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of rides that beat this ride in pairwise comparisons
|
|
ties:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of rides with equal preference in pairwise comparisons
|
|
winning_percentage:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
|
|
description: Win percentage where ties count as 0.5
|
|
mutual_riders_count:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Total number of users who have rated this ride
|
|
comparison_count:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of other rides this was compared against
|
|
average_rating:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
|
|
nullable: true
|
|
description: Average rating from all users who have rated this ride
|
|
last_calculated:
|
|
type: string
|
|
format: date-time
|
|
description: When this ranking was last calculated
|
|
rank_change:
|
|
type: integer
|
|
nullable: true
|
|
readOnly: true
|
|
previous_rank:
|
|
type: integer
|
|
nullable: true
|
|
readOnly: true
|
|
required:
|
|
- id
|
|
- previous_rank
|
|
- rank
|
|
- rank_change
|
|
- ride
|
|
- winning_percentage
|
|
RideRankingDetail:
|
|
type: object
|
|
description: Detailed serializer for a specific ride's ranking.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Overall rank position (1 = best)
|
|
ride:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
wins:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of rides this ride beats in pairwise comparisons
|
|
losses:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of rides that beat this ride in pairwise comparisons
|
|
ties:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of rides with equal preference in pairwise comparisons
|
|
winning_percentage:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,4})?$
|
|
description: Win percentage where ties count as 0.5
|
|
mutual_riders_count:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Total number of users who have rated this ride
|
|
comparison_count:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
description: Number of other rides this was compared against
|
|
average_rating:
|
|
type: string
|
|
format: decimal
|
|
pattern: ^-?\d{0,1}(?:\.\d{0,2})?$
|
|
nullable: true
|
|
description: Average rating from all users who have rated this ride
|
|
last_calculated:
|
|
type: string
|
|
format: date-time
|
|
description: When this ranking was last calculated
|
|
calculation_version:
|
|
type: string
|
|
description: Algorithm version used for calculation
|
|
maxLength: 10
|
|
head_to_head_comparisons:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
ranking_history:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
required:
|
|
- head_to_head_comparisons
|
|
- id
|
|
- rank
|
|
- ranking_history
|
|
- ride
|
|
- winning_percentage
|
|
SignupInputRequest:
|
|
type: object
|
|
description: Input serializer for user registration.
|
|
properties:
|
|
username:
|
|
type: string
|
|
minLength: 1
|
|
description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
|
|
only.
|
|
pattern: ^[\w.@+-]+$
|
|
maxLength: 150
|
|
email:
|
|
type: string
|
|
format: email
|
|
title: Email address
|
|
maxLength: 254
|
|
password:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: User password
|
|
password_confirm:
|
|
type: string
|
|
writeOnly: true
|
|
minLength: 1
|
|
description: Password confirmation
|
|
first_name:
|
|
type: string
|
|
maxLength: 150
|
|
last_name:
|
|
type: string
|
|
maxLength: 150
|
|
required:
|
|
- password
|
|
- password_confirm
|
|
- username
|
|
SignupOutput:
|
|
type: object
|
|
description: Output serializer for registration response.
|
|
properties:
|
|
token:
|
|
type: string
|
|
description: Authentication token
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/UserOutput'
|
|
description: User information
|
|
message:
|
|
type: string
|
|
description: Success message
|
|
required:
|
|
- message
|
|
- token
|
|
- user
|
|
SimpleHealthOutput:
|
|
type: object
|
|
description: Output serializer for simple health check.
|
|
properties:
|
|
status:
|
|
$ref: '#/components/schemas/SimpleHealthOutputStatusEnum'
|
|
timestamp:
|
|
type: string
|
|
format: date-time
|
|
error:
|
|
type: string
|
|
required:
|
|
- status
|
|
- timestamp
|
|
SimpleHealthOutputStatusEnum:
|
|
enum:
|
|
- ok
|
|
- error
|
|
type: string
|
|
description: |-
|
|
* `ok` - ok
|
|
* `error` - error
|
|
Stats:
|
|
type: object
|
|
description: |-
|
|
Serializer for platform statistics response.
|
|
|
|
This serializer defines the structure of the statistics API response,
|
|
including all the various counts and breakdowns available.
|
|
properties:
|
|
total_parks:
|
|
type: integer
|
|
description: Total number of parks in the database
|
|
total_rides:
|
|
type: integer
|
|
description: Total number of rides in the database
|
|
total_manufacturers:
|
|
type: integer
|
|
description: Total number of ride manufacturers
|
|
total_operators:
|
|
type: integer
|
|
description: Total number of park operators
|
|
total_designers:
|
|
type: integer
|
|
description: Total number of ride designers
|
|
total_property_owners:
|
|
type: integer
|
|
description: Total number of property owners
|
|
total_roller_coasters:
|
|
type: integer
|
|
description: Total number of roller coasters with detailed stats
|
|
total_photos:
|
|
type: integer
|
|
description: Total number of photos (parks + rides combined)
|
|
total_park_photos:
|
|
type: integer
|
|
description: Total number of park photos
|
|
total_ride_photos:
|
|
type: integer
|
|
description: Total number of ride photos
|
|
total_reviews:
|
|
type: integer
|
|
description: Total number of reviews (parks + rides)
|
|
total_park_reviews:
|
|
type: integer
|
|
description: Total number of park reviews
|
|
total_ride_reviews:
|
|
type: integer
|
|
description: Total number of ride reviews
|
|
roller_coasters:
|
|
type: integer
|
|
description: Number of rides categorized as roller coasters
|
|
dark_rides:
|
|
type: integer
|
|
description: Number of rides categorized as dark rides
|
|
flat_rides:
|
|
type: integer
|
|
description: Number of rides categorized as flat rides
|
|
water_rides:
|
|
type: integer
|
|
description: Number of rides categorized as water rides
|
|
transport_rides:
|
|
type: integer
|
|
description: Number of rides categorized as transport rides
|
|
other_rides:
|
|
type: integer
|
|
description: Number of rides categorized as other
|
|
operating_parks:
|
|
type: integer
|
|
description: Number of currently operating parks
|
|
temporarily_closed_parks:
|
|
type: integer
|
|
description: Number of temporarily closed parks
|
|
permanently_closed_parks:
|
|
type: integer
|
|
description: Number of permanently closed parks
|
|
under_construction_parks:
|
|
type: integer
|
|
description: Number of parks under construction
|
|
demolished_parks:
|
|
type: integer
|
|
description: Number of demolished parks
|
|
relocated_parks:
|
|
type: integer
|
|
description: Number of relocated parks
|
|
operating_rides:
|
|
type: integer
|
|
description: Number of currently operating rides
|
|
temporarily_closed_rides:
|
|
type: integer
|
|
description: Number of temporarily closed rides
|
|
sbno_rides:
|
|
type: integer
|
|
description: Number of rides standing but not operating
|
|
closing_rides:
|
|
type: integer
|
|
description: Number of rides in the process of closing
|
|
permanently_closed_rides:
|
|
type: integer
|
|
description: Number of permanently closed rides
|
|
under_construction_rides:
|
|
type: integer
|
|
description: Number of rides under construction
|
|
demolished_rides:
|
|
type: integer
|
|
description: Number of demolished rides
|
|
relocated_rides:
|
|
type: integer
|
|
description: Number of relocated rides
|
|
last_updated:
|
|
type: string
|
|
description: ISO timestamp when these statistics were last calculated
|
|
relative_last_updated:
|
|
type: string
|
|
description: Human-readable relative time since last update (e.g., '2 minutes
|
|
ago')
|
|
required:
|
|
- last_updated
|
|
- relative_last_updated
|
|
- total_designers
|
|
- total_manufacturers
|
|
- total_operators
|
|
- total_park_photos
|
|
- total_park_reviews
|
|
- total_parks
|
|
- total_photos
|
|
- total_property_owners
|
|
- total_reviews
|
|
- total_ride_photos
|
|
- total_ride_reviews
|
|
- total_rides
|
|
- total_roller_coasters
|
|
TopListCreateInputRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
description:
|
|
type: string
|
|
user:
|
|
type: integer
|
|
required:
|
|
- category
|
|
- title
|
|
- user
|
|
TopListItemCreateInputRequest:
|
|
type: object
|
|
properties:
|
|
object_id:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
notes:
|
|
type: string
|
|
top_list:
|
|
type: integer
|
|
content_type:
|
|
type: integer
|
|
required:
|
|
- content_type
|
|
- object_id
|
|
- rank
|
|
- top_list
|
|
TopListItemOutput:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
object_id:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
notes:
|
|
type: string
|
|
top_list:
|
|
type: integer
|
|
content_type:
|
|
type: integer
|
|
required:
|
|
- content_type
|
|
- created_at
|
|
- id
|
|
- object_id
|
|
- rank
|
|
- top_list
|
|
- updated_at
|
|
TopListItemOutputRequest:
|
|
type: object
|
|
properties:
|
|
object_id:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
notes:
|
|
type: string
|
|
top_list:
|
|
type: integer
|
|
content_type:
|
|
type: integer
|
|
required:
|
|
- content_type
|
|
- object_id
|
|
- rank
|
|
- top_list
|
|
TopListItemUpdateInputRequest:
|
|
type: object
|
|
properties:
|
|
object_id:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
rank:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: 0
|
|
notes:
|
|
type: string
|
|
top_list:
|
|
type: integer
|
|
content_type:
|
|
type: integer
|
|
required:
|
|
- content_type
|
|
- object_id
|
|
- rank
|
|
- top_list
|
|
TopListOutput:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/User'
|
|
readOnly: true
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TopListItemOutput'
|
|
readOnly: true
|
|
title:
|
|
type: string
|
|
maxLength: 100
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
description:
|
|
type: string
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- category
|
|
- created_at
|
|
- id
|
|
- items
|
|
- title
|
|
- updated_at
|
|
- user
|
|
TopListOutputRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
description:
|
|
type: string
|
|
required:
|
|
- category
|
|
- title
|
|
TopListUpdateInputRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
minLength: 1
|
|
maxLength: 100
|
|
category:
|
|
$ref: '#/components/schemas/CategoryEnum'
|
|
description:
|
|
type: string
|
|
required:
|
|
- category
|
|
- title
|
|
UnifiedHistoryTimeline:
|
|
type: object
|
|
description: Serializer for unified history timeline.
|
|
properties:
|
|
summary:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
events:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: {}
|
|
readOnly: true
|
|
required:
|
|
- events
|
|
- summary
|
|
User:
|
|
type: object
|
|
description: User serializer for API responses
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
username:
|
|
type: string
|
|
description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
|
|
only.
|
|
pattern: ^[\w.@+-]+$
|
|
maxLength: 150
|
|
email:
|
|
type: string
|
|
format: email
|
|
title: Email address
|
|
maxLength: 254
|
|
first_name:
|
|
type: string
|
|
maxLength: 150
|
|
last_name:
|
|
type: string
|
|
maxLength: 150
|
|
date_joined:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
is_active:
|
|
type: boolean
|
|
readOnly: true
|
|
title: Active
|
|
description: Designates whether this user should be treated as active. Unselect
|
|
this instead of deleting accounts.
|
|
avatar_url:
|
|
type: string
|
|
nullable: true
|
|
description: Get user avatar URL
|
|
readOnly: true
|
|
required:
|
|
- avatar_url
|
|
- date_joined
|
|
- id
|
|
- is_active
|
|
- username
|
|
UserOutput:
|
|
type: object
|
|
description: Output serializer for user data.
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
username:
|
|
type: string
|
|
description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
|
|
only.
|
|
pattern: ^[\w.@+-]+$
|
|
maxLength: 150
|
|
email:
|
|
type: string
|
|
format: email
|
|
title: Email address
|
|
maxLength: 254
|
|
first_name:
|
|
type: string
|
|
maxLength: 150
|
|
last_name:
|
|
type: string
|
|
maxLength: 150
|
|
is_active:
|
|
type: boolean
|
|
title: Active
|
|
description: Designates whether this user should be treated as active. Unselect
|
|
this instead of deleting accounts.
|
|
date_joined:
|
|
type: string
|
|
format: date-time
|
|
readOnly: true
|
|
required:
|
|
- date_joined
|
|
- id
|
|
- username
|
|
UserOutputRequest:
|
|
type: object
|
|
description: Output serializer for user data.
|
|
properties:
|
|
username:
|
|
type: string
|
|
minLength: 1
|
|
description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
|
|
only.
|
|
pattern: ^[\w.@+-]+$
|
|
maxLength: 150
|
|
email:
|
|
type: string
|
|
format: email
|
|
title: Email address
|
|
maxLength: 254
|
|
first_name:
|
|
type: string
|
|
maxLength: 150
|
|
last_name:
|
|
type: string
|
|
maxLength: 150
|
|
is_active:
|
|
type: boolean
|
|
title: Active
|
|
description: Designates whether this user should be treated as active. Unselect
|
|
this instead of deleting accounts.
|
|
required:
|
|
- username
|
|
UserProfileCreateInputRequest:
|
|
type: object
|
|
properties:
|
|
display_name:
|
|
type: string
|
|
minLength: 1
|
|
description: This is the name that will be displayed on the site
|
|
maxLength: 50
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
pronouns:
|
|
type: string
|
|
maxLength: 50
|
|
bio:
|
|
type: string
|
|
maxLength: 500
|
|
twitter:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
instagram:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
youtube:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
discord:
|
|
type: string
|
|
maxLength: 100
|
|
coaster_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
dark_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
flat_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
water_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
user:
|
|
type: integer
|
|
required:
|
|
- display_name
|
|
- user
|
|
UserProfileOutput:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
readOnly: true
|
|
user:
|
|
allOf:
|
|
- $ref: '#/components/schemas/User'
|
|
readOnly: true
|
|
avatar_url:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
readOnly: true
|
|
profile_id:
|
|
type: string
|
|
readOnly: true
|
|
description: Unique identifier for this profile that remains constant
|
|
display_name:
|
|
type: string
|
|
description: This is the name that will be displayed on the site
|
|
maxLength: 50
|
|
avatar:
|
|
type: string
|
|
format: uri
|
|
pronouns:
|
|
type: string
|
|
maxLength: 50
|
|
bio:
|
|
type: string
|
|
maxLength: 500
|
|
twitter:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
instagram:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
youtube:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
discord:
|
|
type: string
|
|
maxLength: 100
|
|
coaster_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
dark_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
flat_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
water_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
required:
|
|
- avatar_url
|
|
- display_name
|
|
- id
|
|
- profile_id
|
|
- user
|
|
UserProfileUpdateInputRequest:
|
|
type: object
|
|
properties:
|
|
display_name:
|
|
type: string
|
|
minLength: 1
|
|
description: This is the name that will be displayed on the site
|
|
maxLength: 50
|
|
avatar:
|
|
type: string
|
|
format: binary
|
|
pronouns:
|
|
type: string
|
|
maxLength: 50
|
|
bio:
|
|
type: string
|
|
maxLength: 500
|
|
twitter:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
instagram:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
youtube:
|
|
type: string
|
|
format: uri
|
|
maxLength: 200
|
|
discord:
|
|
type: string
|
|
maxLength: 100
|
|
coaster_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
dark_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
flat_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
water_ride_credits:
|
|
type: integer
|
|
maximum: 2147483647
|
|
minimum: -2147483648
|
|
required:
|
|
- display_name
|
|
UserRequest:
|
|
type: object
|
|
description: User serializer for API responses
|
|
properties:
|
|
username:
|
|
type: string
|
|
minLength: 1
|
|
description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
|
|
only.
|
|
pattern: ^[\w.@+-]+$
|
|
maxLength: 150
|
|
email:
|
|
type: string
|
|
format: email
|
|
title: Email address
|
|
maxLength: 254
|
|
first_name:
|
|
type: string
|
|
maxLength: 150
|
|
last_name:
|
|
type: string
|
|
maxLength: 150
|
|
required:
|
|
- username
|
|
securitySchemes:
|
|
cookieAuth:
|
|
type: apiKey
|
|
in: cookie
|
|
name: sessionid
|
|
tokenAuth:
|
|
type: apiKey
|
|
in: header
|
|
name: Authorization
|
|
description: Token-based authentication with required prefix "Token"
|
|
tags:
|
|
- name: Parks
|
|
description: Theme park operations
|
|
- name: Rides
|
|
description: Ride information and management
|
|
- name: Statistics
|
|
description: Statistical endpoints providing aggregated data and insights
|