You've already forked CC-Framework.BriskGameServer
1927 lines
51 KiB
YAML
1927 lines
51 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: Brisk Game Service API
|
|
version: 0.2.0
|
|
description: Current implemented Brisk server API for internal integration.
|
|
servers:
|
|
- url: /api
|
|
tags:
|
|
- name: time
|
|
- name: bootstrap
|
|
- name: auth
|
|
- name: player
|
|
- name: config
|
|
- name: announcements
|
|
- name: ranks
|
|
- name: archives
|
|
- name: spaces
|
|
- name: admin-auth
|
|
- name: admin-audit
|
|
- name: admin-projects
|
|
- name: admin-configs
|
|
- name: admin-announcements
|
|
- name: admin-rank-groups
|
|
- name: admin-ranks
|
|
- name: admin-archives
|
|
- name: admin-players
|
|
- name: admin-spaces
|
|
components:
|
|
securitySchemes:
|
|
bearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: token
|
|
schemas:
|
|
SuccessEnvelope:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: integer
|
|
example: 0
|
|
message:
|
|
type: string
|
|
example: ok
|
|
data:
|
|
type: object
|
|
ErrorEnvelope:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
data:
|
|
nullable: true
|
|
ClientTimePayload:
|
|
type: object
|
|
properties:
|
|
server_time:
|
|
type: string
|
|
format: date-time
|
|
example: 2026-04-11T08:12:30Z
|
|
server_unix:
|
|
type: integer
|
|
format: int64
|
|
example: 1775895150
|
|
server_unix_ms:
|
|
type: integer
|
|
format: int64
|
|
example: 1775895150123
|
|
ExchangeRequest:
|
|
type: object
|
|
required: [game_key, login_provider]
|
|
properties:
|
|
game_key:
|
|
type: string
|
|
login_provider:
|
|
type: string
|
|
example: tap
|
|
code:
|
|
type: string
|
|
description: Optional for code-based login.
|
|
login_user_id:
|
|
type: string
|
|
description: Stable user identifier from client-verified provider login.
|
|
device_id:
|
|
type: string
|
|
client_version:
|
|
type: string
|
|
nickname:
|
|
type: string
|
|
description: Optional profile nickname to sync into project account.
|
|
avatar_url:
|
|
type: string
|
|
description: Optional profile avatar URL to sync into project account.
|
|
profile_json:
|
|
type: object
|
|
additionalProperties: true
|
|
description: Optional extra profile payload to sync into project account.
|
|
AdminLoginRequest:
|
|
type: object
|
|
required: [username, password]
|
|
properties:
|
|
username:
|
|
type: string
|
|
password:
|
|
type: string
|
|
CreateProjectRequest:
|
|
type: object
|
|
required: [name]
|
|
properties:
|
|
name:
|
|
type: string
|
|
current_version:
|
|
type: string
|
|
status:
|
|
type: string
|
|
maintenance_mode:
|
|
type: boolean
|
|
maintenance_message:
|
|
type: string
|
|
min_client_version:
|
|
type: string
|
|
max_archive_size_bytes:
|
|
type: integer
|
|
format: int64
|
|
max_archive_slots:
|
|
type: integer
|
|
UpdateProjectRequest:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
current_version:
|
|
type: string
|
|
status:
|
|
type: string
|
|
maintenance_mode:
|
|
type: boolean
|
|
maintenance_message:
|
|
type: string
|
|
min_client_version:
|
|
type: string
|
|
max_archive_size_bytes:
|
|
type: integer
|
|
format: int64
|
|
max_archive_slots:
|
|
type: integer
|
|
UpsertCurrentConfigRequest:
|
|
type: object
|
|
required: [project_id]
|
|
properties:
|
|
project_id:
|
|
type: integer
|
|
format: int64
|
|
feature_flags:
|
|
type: object
|
|
additionalProperties: true
|
|
dynamic_config:
|
|
type: object
|
|
additionalProperties: true
|
|
status:
|
|
type: string
|
|
CreateAnnouncementRequest:
|
|
type: object
|
|
required: [project_id, title, content, start_at, end_at]
|
|
properties:
|
|
project_id:
|
|
type: integer
|
|
format: int64
|
|
title:
|
|
type: string
|
|
content:
|
|
type: string
|
|
content_type:
|
|
type: string
|
|
start_at:
|
|
type: string
|
|
format: date-time
|
|
end_at:
|
|
type: string
|
|
format: date-time
|
|
status:
|
|
type: string
|
|
UpdateAnnouncementRequest:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
content:
|
|
type: string
|
|
content_type:
|
|
type: string
|
|
start_at:
|
|
type: string
|
|
format: date-time
|
|
end_at:
|
|
type: string
|
|
format: date-time
|
|
status:
|
|
type: string
|
|
BanPlayerRequest:
|
|
type: object
|
|
properties:
|
|
reason:
|
|
type: string
|
|
ban_until:
|
|
type: string
|
|
format: date-time
|
|
permanent:
|
|
type: boolean
|
|
CreateRankRequest:
|
|
type: object
|
|
required: [project_id, name]
|
|
properties:
|
|
project_id:
|
|
type: integer
|
|
format: int64
|
|
name:
|
|
type: string
|
|
status:
|
|
type: string
|
|
group_id:
|
|
type: integer
|
|
format: int64
|
|
rank_mode:
|
|
type: string
|
|
timezone:
|
|
type: string
|
|
snapshot_enabled:
|
|
type: boolean
|
|
update_strategy:
|
|
type: string
|
|
sort_order:
|
|
type: string
|
|
reset_hour:
|
|
type: integer
|
|
reset_minute:
|
|
type: integer
|
|
weekly_reset_day:
|
|
type: integer
|
|
monthly_reset_day:
|
|
type: integer
|
|
blacklist_player_ids:
|
|
type: array
|
|
items:
|
|
type: string
|
|
UpdateRankRequest:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
status:
|
|
type: string
|
|
group_id:
|
|
type: integer
|
|
format: int64
|
|
clear_group:
|
|
type: boolean
|
|
rank_mode:
|
|
type: string
|
|
timezone:
|
|
type: string
|
|
snapshot_enabled:
|
|
type: boolean
|
|
update_strategy:
|
|
type: string
|
|
sort_order:
|
|
type: string
|
|
reset_hour:
|
|
type: integer
|
|
reset_minute:
|
|
type: integer
|
|
weekly_reset_day:
|
|
type: integer
|
|
monthly_reset_day:
|
|
type: integer
|
|
blacklist_player_ids:
|
|
type: array
|
|
items:
|
|
type: string
|
|
AdminRankLeaderboardItem:
|
|
type: object
|
|
properties:
|
|
rank:
|
|
type: integer
|
|
format: int64
|
|
player_id:
|
|
type: string
|
|
project_account_id:
|
|
type: string
|
|
login_provider:
|
|
type: string
|
|
login_user_id:
|
|
type: string
|
|
score:
|
|
type: integer
|
|
format: int64
|
|
nickname:
|
|
type: string
|
|
avatar_url:
|
|
type: string
|
|
AdminRankLeaderboardResult:
|
|
type: object
|
|
properties:
|
|
rank_key:
|
|
type: string
|
|
leaderboard_key:
|
|
type: string
|
|
total:
|
|
type: integer
|
|
format: int64
|
|
page:
|
|
type: integer
|
|
page_size:
|
|
type: integer
|
|
filter_player_id:
|
|
type: string
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/AdminRankLeaderboardItem'
|
|
AdminRankDeletePlayerRecordResult:
|
|
type: object
|
|
properties:
|
|
rank_key:
|
|
type: string
|
|
player_id:
|
|
type: string
|
|
leaderboard_key:
|
|
type: string
|
|
removed:
|
|
type: integer
|
|
format: int64
|
|
AdminRankResetLeaderboardResult:
|
|
type: object
|
|
properties:
|
|
rank_key:
|
|
type: string
|
|
leaderboard_key:
|
|
type: string
|
|
removed:
|
|
type: integer
|
|
format: int64
|
|
CreateRankGroupRequest:
|
|
type: object
|
|
required: [project_id, name]
|
|
properties:
|
|
project_id:
|
|
type: integer
|
|
format: int64
|
|
name:
|
|
type: string
|
|
sort_order:
|
|
type: integer
|
|
UpdateRankGroupRequest:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
sort_order:
|
|
type: integer
|
|
ScoreRequest:
|
|
type: object
|
|
required: [score]
|
|
properties:
|
|
score:
|
|
type: integer
|
|
format: int64
|
|
SpaceContentUploadRequest:
|
|
type: object
|
|
required: [file]
|
|
properties:
|
|
base_version:
|
|
type: integer
|
|
format: int64
|
|
description: Optimistic lock base version. Use 0 for the first upload.
|
|
content_type:
|
|
type: string
|
|
description: Optional MIME type. Defaults to application/octet-stream when omitted.
|
|
checksum:
|
|
type: string
|
|
description: Optional SHA-256 hex checksum. When provided, the server validates it before saving.
|
|
file:
|
|
type: string
|
|
format: binary
|
|
SpaceMetadata:
|
|
type: object
|
|
properties:
|
|
project_account_id:
|
|
type: string
|
|
player_id:
|
|
type: string
|
|
login_provider:
|
|
type: string
|
|
login_user_id:
|
|
type: string
|
|
nickname:
|
|
type: string
|
|
avatar_url:
|
|
type: string
|
|
content_exists:
|
|
type: boolean
|
|
content_version:
|
|
type: integer
|
|
format: int64
|
|
content_type:
|
|
type: string
|
|
content_size_bytes:
|
|
type: integer
|
|
format: int64
|
|
content_checksum:
|
|
type: string
|
|
like_count:
|
|
type: integer
|
|
format: int64
|
|
today_like_count:
|
|
type: integer
|
|
format: int64
|
|
visit_count:
|
|
type: integer
|
|
format: int64
|
|
liked_by_me:
|
|
type: boolean
|
|
like_reset_at:
|
|
type: string
|
|
format: date-time
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
SpaceStats:
|
|
type: object
|
|
properties:
|
|
project_account_id:
|
|
type: string
|
|
player_id:
|
|
type: string
|
|
login_provider:
|
|
type: string
|
|
login_user_id:
|
|
type: string
|
|
nickname:
|
|
type: string
|
|
avatar_url:
|
|
type: string
|
|
content_exists:
|
|
type: boolean
|
|
content_version:
|
|
type: integer
|
|
format: int64
|
|
content_type:
|
|
type: string
|
|
content_size_bytes:
|
|
type: integer
|
|
format: int64
|
|
content_checksum:
|
|
type: string
|
|
like_count:
|
|
type: integer
|
|
format: int64
|
|
today_like_count:
|
|
type: integer
|
|
format: int64
|
|
visit_count:
|
|
type: integer
|
|
format: int64
|
|
like_reset_at:
|
|
type: string
|
|
format: date-time
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
SpaceContentUpdateResult:
|
|
type: object
|
|
properties:
|
|
player_id:
|
|
type: string
|
|
content_version:
|
|
type: integer
|
|
format: int64
|
|
content_type:
|
|
type: string
|
|
content_size_bytes:
|
|
type: integer
|
|
format: int64
|
|
content_checksum:
|
|
type: string
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
SpaceLikeResult:
|
|
type: object
|
|
properties:
|
|
liked:
|
|
type: boolean
|
|
created:
|
|
type: boolean
|
|
liked_by_me:
|
|
type: boolean
|
|
like_count:
|
|
type: integer
|
|
format: int64
|
|
today_like_count:
|
|
type: integer
|
|
format: int64
|
|
like_reset_at:
|
|
type: string
|
|
format: date-time
|
|
SpaceVisitItem:
|
|
type: object
|
|
properties:
|
|
visitor_player_id:
|
|
type: string
|
|
nickname:
|
|
type: string
|
|
avatar_url:
|
|
type: string
|
|
visited_at:
|
|
type: string
|
|
format: date-time
|
|
SpaceLikeItem:
|
|
type: object
|
|
properties:
|
|
player_id:
|
|
type: string
|
|
nickname:
|
|
type: string
|
|
avatar_url:
|
|
type: string
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
SpaceLikeListResponse:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/SpaceLikeItem'
|
|
paths:
|
|
/client/time:
|
|
get:
|
|
tags: [time]
|
|
summary: Get platform server time
|
|
responses:
|
|
'200':
|
|
description: Current platform UTC time
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: integer
|
|
example: 0
|
|
message:
|
|
type: string
|
|
example: ok
|
|
data:
|
|
$ref: '#/components/schemas/ClientTimePayload'
|
|
'429': { description: Rate limited }
|
|
'500': { description: Rate limit unavailable }
|
|
/client/bootstrap:
|
|
get:
|
|
tags: [bootstrap]
|
|
summary: Get startup config
|
|
parameters:
|
|
- in: query
|
|
name: game_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: client_version
|
|
required: false
|
|
schema: { type: string }
|
|
- in: query
|
|
name: device_id
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Bootstrap payload }
|
|
/auth/login/exchange:
|
|
post:
|
|
tags: [auth]
|
|
summary: Exchange login provider identity for Brisk token
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ExchangeRequest'
|
|
responses:
|
|
'200': { description: Login success }
|
|
'403': { description: Player banned }
|
|
'429': { description: Rate limited }
|
|
/auth/logout:
|
|
post:
|
|
tags: [auth]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Logout current session
|
|
responses:
|
|
'200': { description: Logout success }
|
|
/player/me:
|
|
get:
|
|
tags: [player]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get current player
|
|
responses:
|
|
'200': { description: Player info }
|
|
/config/current:
|
|
get:
|
|
tags: [config]
|
|
summary: Get current dynamic config
|
|
parameters:
|
|
- in: query
|
|
name: game_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: client_version
|
|
required: false
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Config payload }
|
|
/announcements:
|
|
get:
|
|
tags: [announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List active announcements
|
|
responses:
|
|
'200': { description: Announcement list }
|
|
/announcements/{id}/read:
|
|
post:
|
|
tags: [announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Mark announcement read
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Read recorded }
|
|
/ranks/{rank_key}/top:
|
|
get:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get top ranking list
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Top ranking list }
|
|
/ranks/{rank_key}/me:
|
|
get:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get current player rank
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Player rank }
|
|
/ranks/{rank_key}/around-me:
|
|
get:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get nearby ranking items
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: range
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Nearby ranks }
|
|
/ranks/{rank_key}/score:
|
|
post:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Submit score, keep only best
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ScoreRequest'
|
|
responses:
|
|
'200': { description: Score result }
|
|
'429': { description: Rate limited }
|
|
/ranks/{rank_key}/season/current:
|
|
get:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get current season info for rank
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Current season info }
|
|
/ranks/{rank_key}/history:
|
|
get:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get rank season history
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Rank season history }
|
|
/ranks/{rank_key}/history/{season_id}:
|
|
get:
|
|
tags: [ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get rank history detail by season
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: path
|
|
name: season_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Rank season detail }
|
|
/archives/slot/1/meta:
|
|
get:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get single-slot archive metadata
|
|
responses:
|
|
'200': { description: Archive metadata }
|
|
/archives/slots:
|
|
get:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List archive slots
|
|
responses:
|
|
'200': { description: Archive slot list }
|
|
/archives/slot/{slot_no}/meta:
|
|
get:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get archive metadata by slot
|
|
parameters:
|
|
- in: path
|
|
name: slot_no
|
|
required: true
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Archive metadata }
|
|
/archives/slot/1/upload:
|
|
post:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Upload single-slot archive
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required: [base_version, checksum, file]
|
|
properties:
|
|
base_version:
|
|
type: integer
|
|
checksum:
|
|
type: string
|
|
file:
|
|
type: string
|
|
format: binary
|
|
responses:
|
|
'200': { description: Upload success }
|
|
'409': { description: Version conflict }
|
|
'429': { description: Rate limited }
|
|
/archives/slot/{slot_no}/upload:
|
|
post:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Upload archive by slot
|
|
parameters:
|
|
- in: path
|
|
name: slot_no
|
|
required: true
|
|
schema: { type: integer }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required: [base_version, checksum, file]
|
|
properties:
|
|
base_version:
|
|
type: integer
|
|
checksum:
|
|
type: string
|
|
file:
|
|
type: string
|
|
format: binary
|
|
responses:
|
|
'200': { description: Upload success }
|
|
'409': { description: Version conflict }
|
|
'429': { description: Rate limited }
|
|
/archives/slot/1/download:
|
|
get:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Download single-slot archive
|
|
responses:
|
|
'200': { description: Binary archive stream }
|
|
/archives/slot/{slot_no}/download:
|
|
get:
|
|
tags: [archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Download archive by slot
|
|
parameters:
|
|
- in: path
|
|
name: slot_no
|
|
required: true
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Binary archive stream }
|
|
/spaces/{player_id}:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space metadata
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
description: Optional target login provider. When present, login_user_id is also required and overrides player_id lookup.
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
description: Optional target login user id used with login provider lookup.
|
|
responses:
|
|
'200':
|
|
description: Space metadata
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceMetadata'
|
|
/spaces/{player_id}/content:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Download player space content
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
description: Optional target login provider. When present, login_user_id is also required and overrides player_id lookup.
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
description: Optional target login user id used with login provider lookup.
|
|
responses:
|
|
'200':
|
|
description: Binary space content stream
|
|
headers:
|
|
X-Space-Version:
|
|
schema:
|
|
type: integer
|
|
format: int64
|
|
X-Space-Checksum:
|
|
schema:
|
|
type: string
|
|
content:
|
|
application/octet-stream:
|
|
schema:
|
|
type: string
|
|
format: binary
|
|
/spaces/{player_id}/stats:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space stats
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Space stats
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceStats'
|
|
/spaces/{player_id}/likes:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space likes
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: scope
|
|
schema:
|
|
type: string
|
|
enum: [history, cycle]
|
|
default: history
|
|
description: Whether to list historical likes or only likes from the current daily cycle.
|
|
responses:
|
|
'200':
|
|
description: Space likes
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceLikeListResponse'
|
|
/spaces/me/content:
|
|
put:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Upload my space content
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceContentUploadRequest'
|
|
responses:
|
|
'200':
|
|
description: Space content updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceContentUpdateResult'
|
|
'409': { description: Version conflict }
|
|
/spaces/{player_id}/like:
|
|
post:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Like player space
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Liked
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceLikeResult'
|
|
'429': { description: Rate limited }
|
|
delete:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Unlike player space
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Unliked
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceLikeResult'
|
|
'429': { description: Rate limited }
|
|
/spaces/by-login:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space metadata by login identity
|
|
parameters:
|
|
- in: query
|
|
name: login_provider
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Space metadata
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceMetadata'
|
|
/spaces/by-login/content:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Download player space content by login identity
|
|
parameters:
|
|
- in: query
|
|
name: login_provider
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Binary space content stream
|
|
headers:
|
|
X-Space-Version:
|
|
schema:
|
|
type: integer
|
|
format: int64
|
|
X-Space-Checksum:
|
|
schema:
|
|
type: string
|
|
content:
|
|
application/octet-stream:
|
|
schema:
|
|
type: string
|
|
format: binary
|
|
/spaces/by-login/stats:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space stats by login identity
|
|
parameters:
|
|
- in: query
|
|
name: login_provider
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Space stats
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceStats'
|
|
/spaces/by-login/likes:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space likes by login identity
|
|
parameters:
|
|
- in: query
|
|
name: login_provider
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: scope
|
|
schema:
|
|
type: string
|
|
enum: [history, cycle]
|
|
default: history
|
|
description: Whether to list historical likes or only likes from the current daily cycle.
|
|
responses:
|
|
'200':
|
|
description: Space likes
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceLikeListResponse'
|
|
/spaces/by-login/like:
|
|
post:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Like player space by login identity
|
|
parameters:
|
|
- in: query
|
|
name: login_provider
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Liked
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceLikeResult'
|
|
'429': { description: Rate limited }
|
|
delete:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Unlike player space by login identity
|
|
parameters:
|
|
- in: query
|
|
name: login_provider
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Unliked
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/SpaceLikeResult'
|
|
'429': { description: Rate limited }
|
|
/spaces/me/visits:
|
|
get:
|
|
tags: [spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get recent visitors
|
|
parameters:
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer, default: 50 }
|
|
description: Optional page size. Defaults to 50 and is capped at 100.
|
|
responses:
|
|
'200':
|
|
description: Visitor list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/SpaceVisitItem'
|
|
/admin/auth/login:
|
|
post:
|
|
tags: [admin-auth]
|
|
summary: Admin login
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminLoginRequest'
|
|
responses:
|
|
'200': { description: Admin login success }
|
|
'429': { description: Rate limited }
|
|
/admin/audit-logs:
|
|
get:
|
|
tags: [admin-audit]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List audit logs
|
|
parameters:
|
|
- in: query
|
|
name: action
|
|
schema: { type: string }
|
|
- in: query
|
|
name: resource_type
|
|
schema: { type: string }
|
|
- in: query
|
|
name: username
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Audit log list }
|
|
/admin/projects:
|
|
get:
|
|
tags: [admin-projects]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List projects
|
|
responses:
|
|
'200': { description: Project list }
|
|
post:
|
|
tags: [admin-projects]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Create project
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateProjectRequest'
|
|
responses:
|
|
'200': { description: Project created }
|
|
/admin/projects/{id}:
|
|
get:
|
|
tags: [admin-projects]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get project detail
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Project detail }
|
|
put:
|
|
tags: [admin-projects]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Update project
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdateProjectRequest'
|
|
responses:
|
|
'200': { description: Project updated }
|
|
/admin/projects/{id}/icon:
|
|
get:
|
|
tags: [admin-projects]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get project icon
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Project icon stream }
|
|
post:
|
|
tags: [admin-projects]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Upload project icon
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required: [file]
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
responses:
|
|
'200': { description: Project icon uploaded }
|
|
/admin/configs/current:
|
|
get:
|
|
tags: [admin-configs]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get current dynamic config for project
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Current config }
|
|
put:
|
|
tags: [admin-configs]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Save current dynamic config for project
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpsertCurrentConfigRequest'
|
|
responses:
|
|
'200': { description: Config saved }
|
|
/admin/announcements:
|
|
get:
|
|
tags: [admin-announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List announcements
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: status
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Announcement list }
|
|
post:
|
|
tags: [admin-announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Create announcement
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateAnnouncementRequest'
|
|
responses:
|
|
'200': { description: Announcement created }
|
|
/admin/announcements/{id}:
|
|
get:
|
|
tags: [admin-announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get announcement detail
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Announcement detail }
|
|
put:
|
|
tags: [admin-announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Update announcement
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdateAnnouncementRequest'
|
|
responses:
|
|
'200': { description: Announcement updated }
|
|
delete:
|
|
tags: [admin-announcements]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Delete announcement
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Announcement deleted }
|
|
/admin/rank-groups:
|
|
get:
|
|
tags: [admin-rank-groups]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List rank groups
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Rank groups }
|
|
post:
|
|
tags: [admin-rank-groups]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Create rank group
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateRankGroupRequest'
|
|
responses:
|
|
'200': { description: Rank group created }
|
|
/admin/rank-groups/{id}:
|
|
put:
|
|
tags: [admin-rank-groups]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Update rank group
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdateRankGroupRequest'
|
|
responses:
|
|
'200': { description: Rank group updated }
|
|
delete:
|
|
tags: [admin-rank-groups]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Delete rank group
|
|
parameters:
|
|
- in: path
|
|
name: id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Rank group deleted }
|
|
/admin/ranks:
|
|
get:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List rank definitions
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Rank definitions }
|
|
post:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Create rank definition
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CreateRankRequest'
|
|
responses:
|
|
'200': { description: Rank created }
|
|
/admin/ranks/{rank_key}:
|
|
get:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get rank definition detail
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Rank detail }
|
|
put:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Update rank definition
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/UpdateRankRequest'
|
|
responses:
|
|
'200': { description: Rank updated }
|
|
delete:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Delete rank definition
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Rank deleted }
|
|
/admin/ranks/{rank_key}/players/{player_id}:
|
|
delete:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Delete current leaderboard record by player id
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200':
|
|
description: Rank player record removed
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminRankDeletePlayerRecordResult'
|
|
/admin/ranks/{rank_key}/leaderboard:
|
|
get:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get current live leaderboard with pagination and filters
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: page
|
|
schema: { type: integer, default: 1 }
|
|
- in: query
|
|
name: page_size
|
|
schema: { type: integer, default: 20 }
|
|
- in: query
|
|
name: player_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_account_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_provider
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Current leaderboard snapshot
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminRankLeaderboardResult'
|
|
/admin/ranks/{rank_key}/reset:
|
|
post:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Reset current live leaderboard data for rank
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200':
|
|
description: Current leaderboard reset result
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/AdminRankResetLeaderboardResult'
|
|
/admin/ranks/{rank_key}/seasons:
|
|
get:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List rank seasons
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Rank seasons }
|
|
/admin/ranks/{rank_key}/seasons/{season_id}/logs:
|
|
get:
|
|
tags: [admin-ranks]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List rank settlement logs
|
|
parameters:
|
|
- in: path
|
|
name: rank_key
|
|
required: true
|
|
schema: { type: string }
|
|
- in: path
|
|
name: season_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Settlement logs }
|
|
/admin/archives/overview:
|
|
get:
|
|
tags: [admin-archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get archive overview
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Archive overview }
|
|
/admin/archives:
|
|
get:
|
|
tags: [admin-archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List archive players
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: player_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_account_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Archive player list }
|
|
/admin/archives/{player_id}:
|
|
get:
|
|
tags: [admin-archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get archive slots by player
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Archive detail }
|
|
/admin/archives/{player_id}/slots/{slot_no}/download:
|
|
get:
|
|
tags: [admin-archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Download archive slot
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: path
|
|
name: slot_no
|
|
required: true
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Archive file stream }
|
|
/admin/archives/{player_id}/slots/{slot_no}:
|
|
delete:
|
|
tags: [admin-archives]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Delete archive slot
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: path
|
|
name: slot_no
|
|
required: true
|
|
schema: { type: integer }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Archive slot deleted }
|
|
/admin/players:
|
|
get:
|
|
tags: [admin-players]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List players
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: player_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_account_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: login_user_id
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Player list }
|
|
/admin/players/{player_id}:
|
|
get:
|
|
tags: [admin-players]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player detail
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Player detail }
|
|
/admin/players/{player_id}/ban:
|
|
post:
|
|
tags: [admin-players]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Ban player
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
requestBody:
|
|
required: false
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/BanPlayerRequest'
|
|
responses:
|
|
'200': { description: Player banned }
|
|
/admin/players/{player_id}/unban:
|
|
post:
|
|
tags: [admin-players]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Unban player
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
responses:
|
|
'200': { description: Player unbanned }
|
|
/admin/spaces/overview:
|
|
get:
|
|
tags: [admin-spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get space module overview
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Space overview }
|
|
/admin/spaces:
|
|
get:
|
|
tags: [admin-spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: List player spaces
|
|
parameters:
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: player_id
|
|
schema: { type: string }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Space list }
|
|
/admin/spaces/{player_id}:
|
|
get:
|
|
tags: [admin-spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space metadata detail
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200': { description: Space detail }
|
|
/admin/spaces/{player_id}/content:
|
|
get:
|
|
tags: [admin-spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Download player space content
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
responses:
|
|
'200':
|
|
description: Binary space content stream
|
|
headers:
|
|
X-Space-Version:
|
|
schema:
|
|
type: integer
|
|
format: int64
|
|
X-Space-Checksum:
|
|
schema:
|
|
type: string
|
|
content:
|
|
application/octet-stream:
|
|
schema:
|
|
type: string
|
|
format: binary
|
|
/admin/spaces/{player_id}/likes:
|
|
get:
|
|
tags: [admin-spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space likes
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Space likes }
|
|
/admin/spaces/{player_id}/visits:
|
|
get:
|
|
tags: [admin-spaces]
|
|
security: [{ bearerAuth: [] }]
|
|
summary: Get player space visits
|
|
parameters:
|
|
- in: path
|
|
name: player_id
|
|
required: true
|
|
schema: { type: string }
|
|
- in: query
|
|
name: project_id
|
|
required: true
|
|
schema: { type: integer, format: int64 }
|
|
- in: query
|
|
name: limit
|
|
schema: { type: integer }
|
|
responses:
|
|
'200': { description: Space visits }
|