Files
cms-server/docs/swagger.json
Asai Neko d187d8ef9a
All checks were successful
Server Check Build (NixCN CMS) TeamCity build finished
Fix attendanceData panic
Signed-off-by: Asai Neko <sugar@sne.moe>
2026-03-28 12:59:18 +08:00

4506 lines
166 KiB
JSON

{
"schemes": [
"http",
"https"
],
"swagger": "2.0",
"info": {
"description": "API Docs based on Gin framework",
"title": "NixCN CMS API",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"name": "API Support",
"url": "http://www.swagger.io/support",
"email": "support@swagger.io"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "1.0"
},
"host": "localhost:8000",
"basePath": "/app/api/v1",
"paths": {
"/agenda/list": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns all agendas for the specified event, regardless of status. Manager only.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "List All Agendas",
"parameters": [
{
"type": "string",
"description": "Event ID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/service_agenda.AgendaListItem"
}
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/agenda/my-list": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns the calling user's agenda submissions for the specified event. User must be a joined attendee (Lv10+).",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "My Agenda List",
"parameters": [
{
"type": "string",
"description": "Event ID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/data.Agenda"
}
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Not an Attendee",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/agenda/review": {
"patch": {
"security": [
{
"Bearer": []
}
],
"description": "Manager sets the status of an agenda to approved or rejected. Not allowed after agenda is published.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "Review Agenda",
"parameters": [
{
"description": "Review Data",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_agenda.AgendaReviewData"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input / Already Published",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event or Agenda Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/agenda/schedule": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns all approved and scheduled agenda items, sorted by start_time ascending. Returns 403 if the agenda has not been published.",
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "Get Agenda Schedule",
"parameters": [
{
"type": "string",
"description": "Event ID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/data.AgendaDoc"
}
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Agenda Not Published",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
},
"patch": {
"security": [
{
"Bearer": []
}
],
"description": "Manager sets start_time and end_time on an approved agenda item. Available even after publish.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "Schedule Agenda",
"parameters": [
{
"description": "Schedule Data",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_agenda.AgendaScheduleData"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input / Not Approved",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Agenda Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/agenda/submit": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Creates a new agenda item for a specific attendance record.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "Submit Agenda",
"parameters": [
{
"description": "Agenda Submission Data",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_agenda.SubmitData"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_agenda.SubmitResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/agenda/update": {
"patch": {
"security": [
{
"Bearer": []
}
],
"description": "Submitter may edit their own pending agendas before the event deadline. Managers may edit any agenda with no restrictions.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Agenda"
],
"summary": "Update Agenda",
"parameters": [
{
"description": "Agenda Update Data",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_agenda.AgendaUpdateData"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input / Not Pending / Deadline Passed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Not Submitter",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Agenda Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/auth/exchange": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Exchanges client credentials and user session for a specific redirect authorization code.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authentication"
],
"summary": "Exchange Auth Code",
"parameters": [
{
"description": "Exchange Request Credentials",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_auth.ExchangeData"
}
}
],
"responses": {
"200": {
"description": "Successful exchange",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_auth.ExchangeResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/auth/magic": {
"post": {
"description": "Verifies Turnstile token and sends an authentication link via email. Returns the URI directly if debug mode is enabled.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authentication"
],
"summary": "Request Magic Link",
"parameters": [
{
"description": "Magic Link Request Data",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_auth.MagicData"
}
}
],
"responses": {
"200": {
"description": "Successful request",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_auth.MagicResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Turnstile Verification Failed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/auth/redirect": {
"get": {
"description": "Verifies the temporary email code, ensures the user exists (or creates one), validates the client's redirect URI, and finally performs a 302 redirect with a new authorization code.",
"consumes": [
"application/x-www-form-urlencoded"
],
"produces": [
"application/json",
"text/html"
],
"tags": [
"Authentication"
],
"summary": "Handle Auth Callback and Redirect",
"parameters": [
{
"type": "string",
"description": "Client Identifier",
"name": "client_id",
"in": "query",
"required": true
},
{
"type": "string",
"description": "Target Redirect URI",
"name": "redirect_uri",
"in": "query",
"required": true
},
{
"type": "string",
"description": "Temporary Verification Code",
"name": "code",
"in": "query",
"required": true
},
{
"type": "string",
"description": "Opaque state used to maintain state between the request and callback",
"name": "state",
"in": "query"
}
],
"responses": {
"302": {
"description": "Redirect to the provided RedirectUri with a new code",
"schema": {
"type": "string"
}
},
"400": {
"description": "Invalid Input / Client Not Found / URI Mismatch",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Invalid or Expired Verification Code",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/auth/refresh": {
"post": {
"description": "Accepts a valid refresh token to issue a new access token and a rotated refresh token.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authentication"
],
"summary": "Refresh Access Token",
"parameters": [
{
"description": "Refresh Token Body",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_auth.RefreshData"
}
}
],
"responses": {
"200": {
"description": "Successful rotation",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_auth.TokenResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Invalid Refresh Token",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/auth/token": {
"post": {
"description": "Verifies the provided authorization code and issues a pair of JWT tokens (Access and Refresh).",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Authentication"
],
"summary": "Exchange Code for Token",
"parameters": [
{
"description": "Token Request Body",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_auth.TokenData"
}
}
],
"responses": {
"200": {
"description": "Successful token issuance",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_auth.TokenResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Invalid or Expired Code",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/attendance": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Retrieves the paginated list of attendees with optional filters. Only accessible by the event owner (Manager). Supports name substring search and KYC status filtering.",
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Get Attendance List",
"parameters": [
{
"type": "string",
"description": "Event UUID",
"name": "event_id",
"in": "query",
"required": true
},
{
"type": "string",
"description": "Substring filter on attendee nickname",
"name": "name",
"in": "query"
},
{
"type": "string",
"description": "KYC filter: 'with_kyc' or 'without_kyc'",
"name": "kyc_status",
"in": "query"
},
{
"type": "integer",
"description": "Maximum number of results to return (default 20)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Number of results to skip (default 0)",
"name": "offset",
"in": "query"
},
{
"type": "string",
"description": "Sort field: 'checkin_at' (default) or 'id'",
"name": "sort_by",
"in": "query"
},
{
"type": "string",
"description": "Sort direction: 'asc' or 'desc' (default)",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Successful retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/service_event.AttendanceListResponse"
}
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Not Event Owner",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/checkin": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Creates a temporary check-in code for the authenticated user and event.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Generate Check-in Code",
"parameters": [
{
"type": "string",
"description": "Event UUID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "Successfully generated code",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.CheckinResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/checkin/query": {
"get": {
"description": "Returns the timestamp of when the user checked in, or null if not yet checked in.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Query Check-in Status",
"parameters": [
{
"type": "string",
"description": "Event UUID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "Current attendance status",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.CheckinQueryResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Record Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/checkin/submit": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Submits the generated code to mark the user as attended.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Submit Check-in Code",
"parameters": [
{
"description": "Checkin Code Data",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_event.CheckinSubmitData"
}
}
],
"responses": {
"200": {
"description": "Attendance marked successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Code or Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/create": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Allows a Lv30+ user to create a new event. Users at exactly Lv30 may only create events with type 'party'. Sets type and enable_kyc, which are immutable after creation.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Create an Event",
"parameters": [
{
"description": "Event Creation Details",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_event.EventCreateData"
}
}
],
"responses": {
"200": {
"description": "Successfully created the event",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.EventCreateResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Permission Denied / Type Not Allowed for this level",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error / Database Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/delete": {
"delete": {
"security": [
{
"Bearer": []
}
],
"description": "Permanently deletes an event. Requires Lv40+.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Delete an Event",
"parameters": [
{
"description": "Event to delete",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_event.EventDeleteData"
}
}
],
"responses": {
"200": {
"description": "Successfully deleted",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/guide": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Fetching attendance guide of an event using its UUID.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Get Event Guide",
"parameters": [
{
"type": "string",
"description": "Event UUID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "Successful retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.AttendanceGuideResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/info": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Fetches the name, start time, and end time of an event using its UUID.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Get Event Information",
"parameters": [
{
"type": "string",
"description": "Event UUID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "Successful retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.EventInfoResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/join": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Allows an authenticated user to join an event by providing the event ID. The user's role and state are initialized by the service.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Join an Event",
"parameters": [
{
"description": "Event Join Details (UserId and EventId are required)",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_event.EventJoinData"
}
}
],
"responses": {
"200": {
"description": "Successfully joined the event",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.EventJoinResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input or UUID Parse Failed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Unauthorized / Missing User ID / Event Limit Exceeded",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error / Database Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/list": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns a paginated list of events. Supports filtering by type and sorting. Lv30 users are automatically scoped to events they own.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "List Events",
"parameters": [
{
"type": "integer",
"description": "Maximum number of events to return (default 20)",
"name": "limit",
"in": "query"
},
{
"type": "integer",
"description": "Number of events to skip",
"name": "offset",
"in": "query",
"required": true
},
{
"type": "string",
"description": "Filter by event type: 'official' or 'party'",
"name": "type",
"in": "query"
},
{
"type": "string",
"description": "Sort field: 'start_time' (default), 'end_time', 'name'",
"name": "sort_by",
"in": "query"
},
{
"type": "string",
"description": "Sort direction: 'asc' or 'desc' (default)",
"name": "sort_order",
"in": "query"
}
],
"responses": {
"200": {
"description": "Successful paginated list retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.EventListResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/stats": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns join count, checkin count, KYC pass rate, and agenda submission count. Only accessible by the event owner (Manager).",
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Get Event Statistics",
"parameters": [
{
"type": "string",
"description": "Event UUID",
"name": "event_id",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "Statistics retrieved successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_event.EventStatsResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Not Event Owner",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/event/update": {
"patch": {
"security": [
{
"Bearer": []
}
],
"description": "Allows the event owner (Manager) to update name, subtitle, description, start_time, end_time, thumbnail, and is_agenda_published. Changes to type or enable_kyc are rejected. is_agenda_published is write-once: it can only be set to true (requires at least one agenda submission) and cannot be reverted.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Event"
],
"summary": "Update an Event",
"parameters": [
{
"description": "Fields to update (all optional except event_id)",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_event.EventUpdateData"
}
}
],
"responses": {
"200": {
"description": "Successfully updated",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input / Immutable Field / Agenda Pre-flight Failed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Not Event Owner",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Event Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/kyc/query": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Checks the current state of a KYC session and updates local database if approved.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"KYC"
],
"summary": "Query KYC Status",
"parameters": [
{
"description": "KYC query data (KycId)",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_kyc.KycQueryData"
}
}
],
"responses": {
"200": {
"description": "Query processed (success/pending/failed)",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_kyc.KycQueryResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid UUID or input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/kyc/session": {
"post": {
"security": [
{
"Bearer": []
}
],
"description": "Initializes a KYC process (CNRid or Passport) and returns the status or redirect URI.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"KYC"
],
"summary": "Create KYC Session",
"parameters": [
{
"description": "KYC session data (Type and Base64 Identity)",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_kyc.KycSessionData"
}
}
],
"responses": {
"200": {
"description": "Session created successfully",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_kyc.KycSessionResponse"
}
}
}
]
}
},
"400": {
"description": "Invalid input or decode failed",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Missing User ID",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error / KYC Service Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/stats/global": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns total users, user counts per permission_level, and per-event join/checkin counts.",
"produces": [
"application/json"
],
"tags": [
"Stats"
],
"summary": "Global Stats",
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_stats.GlobalStatsResponse"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/user/info": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Fetches the complete profile data for the user associated with the provided session/token.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"User"
],
"summary": "Get My User Information",
"responses": {
"200": {
"description": "Successful profile retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_user.UserInfoData"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "User Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error (UUID Parse Failed)",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/user/info/{user_id}": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Fetches the complete profile data for the user associated with the provided session/token.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"User"
],
"summary": "Get Other User Information",
"parameters": [
{
"type": "string",
"description": "Other user id",
"name": "user_id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Successful profile retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/service_user.UserInfoData"
}
}
}
]
}
},
"401": {
"description": "Missing User ID / Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "User Not Public",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "User Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error (UUID Parse Failed)",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/user/list": {
"get": {
"security": [
{
"Bearer": []
}
],
"description": "Returns a paginated list of users with permission_level included. Supports filtering by permission_level and sorting.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"User"
],
"summary": "List Users (Admin)",
"parameters": [
{
"type": "string",
"description": "Maximum number of users to return (default 20)",
"name": "limit",
"in": "query"
},
{
"type": "string",
"description": "Number of users to skip",
"name": "offset",
"in": "query",
"required": true
},
{
"type": "string",
"description": "Sort field: 'id' (default) | 'permission_level'",
"name": "sort_by",
"in": "query"
},
{
"type": "string",
"description": "Sort direction: 'asc' (default) | 'desc'",
"name": "sort_order",
"in": "query"
},
{
"type": "integer",
"description": "Filter by exact permission level",
"name": "permission_level",
"in": "query"
}
],
"responses": {
"200": {
"description": "Successful paginated list retrieval",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/definitions/service_user.UserListResponse"
}
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/user/update": {
"patch": {
"security": [
{
"Bearer": []
}
],
"description": "Updates specific profile fields such as username, nickname, subtitle, avatar (URL), and bio (Base64).\nValidation: Username (5-255 chars), Nickname (max 24 chars), Subtitle (max 32 chars).",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"User"
],
"summary": "Update User Information",
"parameters": [
{
"description": "Updated User Profile Data",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_user.UserInfoUpdateData"
}
}
],
"responses": {
"200": {
"description": "Successful profile update",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"401": {
"description": "Unauthorized",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
},
"/user/update/{user_id}": {
"patch": {
"security": [
{
"Bearer": []
}
],
"description": "Lv40+ operators may update any user with a strictly lower permission_level. Editable fields: all profile fields plus permission_level (new value must be below operator's own level).",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"User"
],
"summary": "Admin Update User",
"parameters": [
{
"type": "string",
"description": "Target User ID",
"name": "user_id",
"in": "path",
"required": true
},
{
"description": "Fields to update",
"name": "payload",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/service_user.UserInfoUpdateData"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"400": {
"description": "Invalid Input",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"403": {
"description": "Permission Matrix Violation",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"404": {
"description": "Target User Not Found",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"allOf": [
{
"$ref": "#/definitions/utils.RespStatus"
},
{
"type": "object",
"properties": {
"data": {
"type": "object"
}
}
}
]
}
}
}
}
}
},
"definitions": {
"data.Agenda": {
"type": "object",
"properties": {
"agenda_id": {
"type": "string"
},
"attendance_id": {
"type": "string"
},
"description": {
"description": "base64 encoded markdown",
"type": "string"
},
"end_time": {
"type": "string"
},
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"start_time": {
"type": "string"
},
"status": {
"description": "pending | approved | rejected",
"type": "string"
},
"uuid": {
"type": "string"
}
}
},
"data.AgendaDoc": {
"type": "object",
"properties": {
"agenda_id": {
"type": "string"
},
"attendance_id": {
"type": "string"
},
"description": {
"type": "string"
},
"end_time": {
"type": "string"
},
"name": {
"type": "string"
},
"start_time": {
"type": "string"
},
"status": {
"type": "string"
}
}
},
"data.EventStatDoc": {
"type": "object",
"properties": {
"checkin_count": {
"type": "integer"
},
"event_id": {
"type": "string"
},
"join_count": {
"type": "integer"
},
"name": {
"type": "string"
}
}
},
"data.PermissionLevelCount": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"permission_level": {
"type": "integer"
}
}
},
"service_agenda.AgendaListItem": {
"type": "object",
"properties": {
"agenda_id": {
"type": "string"
},
"attendance_id": {
"type": "string"
},
"description": {
"type": "string"
},
"end_time": {
"type": "string"
},
"name": {
"type": "string"
},
"start_time": {
"type": "string"
},
"status": {
"type": "string"
},
"user_profile": {
"$ref": "#/definitions/service_agenda.AgendaUserProfile"
}
}
},
"service_agenda.AgendaReviewData": {
"type": "object",
"required": [
"agenda_id",
"event_id",
"status"
],
"properties": {
"agenda_id": {
"type": "string"
},
"event_id": {
"type": "string"
},
"status": {
"description": "approved | rejected",
"type": "string"
}
}
},
"service_agenda.AgendaScheduleData": {
"type": "object",
"required": [
"agenda_id",
"end_time",
"start_time"
],
"properties": {
"agenda_id": {
"type": "string"
},
"end_time": {
"type": "string"
},
"start_time": {
"type": "string"
}
}
},
"service_agenda.AgendaUpdateData": {
"type": "object",
"required": [
"agenda_id"
],
"properties": {
"agenda_id": {
"type": "string"
},
"description": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"service_agenda.AgendaUserProfile": {
"type": "object",
"properties": {
"nickname": {
"type": "string"
},
"user_id": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"service_agenda.SubmitData": {
"type": "object",
"required": [
"description",
"event_id",
"name"
],
"properties": {
"description": {
"type": "string"
},
"event_id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"service_agenda.SubmitResponse": {
"type": "object",
"properties": {
"agenda_id": {
"type": "string"
}
}
},
"service_auth.ExchangeData": {
"type": "object",
"required": [
"client_id",
"redirect_uri"
],
"properties": {
"client_id": {
"type": "string"
},
"redirect_uri": {
"type": "string"
},
"state": {
"type": "string"
}
}
},
"service_auth.ExchangeResponse": {
"type": "object",
"required": [
"redirect_uri"
],
"properties": {
"redirect_uri": {
"type": "string"
}
}
},
"service_auth.MagicData": {
"type": "object",
"required": [
"client_id",
"email",
"redirect_uri",
"turnstile_token"
],
"properties": {
"client_id": {
"type": "string"
},
"client_ip": {
"type": "string"
},
"email": {
"type": "string"
},
"redirect_uri": {
"type": "string"
},
"state": {
"type": "string"
},
"turnstile_token": {
"type": "string"
}
}
},
"service_auth.MagicResponse": {
"type": "object",
"required": [
"uri"
],
"properties": {
"uri": {
"type": "string"
}
}
},
"service_auth.RefreshData": {
"type": "object",
"required": [
"refresh_token"
],
"properties": {
"refresh_token": {
"type": "string"
}
}
},
"service_auth.TokenData": {
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string"
}
}
},
"service_auth.TokenResponse": {
"type": "object",
"required": [
"access_token",
"refresh_token"
],
"properties": {
"access_token": {
"type": "string"
},
"refresh_token": {
"type": "string"
}
}
},
"service_event.AttendanceGuideResponse": {
"type": "object",
"required": [
"attendance_guide"
],
"properties": {
"attendance_guide": {
"type": "string"
}
}
},
"service_event.AttendanceListResponse": {
"type": "object",
"required": [
"attendance_id",
"user_info"
],
"properties": {
"attendance_id": {
"type": "string"
},
"checked_in_at": {
"type": "string"
},
"joined_at": {
"type": "string"
},
"kyc_info": {},
"kyc_status": {
"type": "string"
},
"kyc_type": {
"type": "string"
},
"user_info": {
"$ref": "#/definitions/service_user.UserInfoData"
}
}
},
"service_event.CheckinQueryResponse": {
"type": "object",
"properties": {
"checkin_at": {
"type": "string"
}
}
},
"service_event.CheckinResponse": {
"type": "object",
"required": [
"checkin_code"
],
"properties": {
"checkin_code": {
"type": "string"
}
}
},
"service_event.CheckinSubmitData": {
"type": "object",
"required": [
"checkin_code"
],
"properties": {
"checkin_code": {
"type": "string"
}
}
},
"service_event.EventCreateData": {
"type": "object",
"required": [
"name",
"type"
],
"properties": {
"attendance_guide": {
"type": "string"
},
"description": {
"type": "string"
},
"enable_kyc": {
"type": "boolean"
},
"end_time": {
"type": "string"
},
"limit": {
"type": "integer"
},
"name": {
"type": "string"
},
"quota": {
"type": "integer"
},
"start_time": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"service_event.EventCreateResponse": {
"type": "object",
"required": [
"event_id"
],
"properties": {
"event_id": {
"type": "string"
}
}
},
"service_event.EventDeleteData": {
"type": "object",
"required": [
"event_id"
],
"properties": {
"event_id": {
"type": "string"
}
}
},
"service_event.EventInfoResponse": {
"type": "object",
"required": [
"enable_kyc",
"end_time",
"event_id",
"name",
"start_time",
"subtitle",
"type"
],
"properties": {
"checkin_count": {
"type": "integer"
},
"description": {
"type": "string"
},
"enable_kyc": {
"type": "boolean"
},
"end_time": {
"type": "string"
},
"event_id": {
"type": "string"
},
"is_agenda_published": {
"type": "boolean"
},
"is_checked_in": {
"type": "boolean"
},
"is_joined": {
"type": "boolean"
},
"join_count": {
"type": "integer"
},
"limit": {
"type": "integer"
},
"name": {
"type": "string"
},
"owner": {
"type": "string"
},
"quota": {
"type": "integer"
},
"start_time": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"service_event.EventJoinData": {
"type": "object",
"required": [
"event_id"
],
"properties": {
"event_id": {
"type": "string"
},
"kyc_id": {
"type": "string"
}
}
},
"service_event.EventJoinResponse": {
"type": "object",
"required": [
"attendance_id"
],
"properties": {
"attendance_id": {
"type": "string"
}
}
},
"service_event.EventListItems": {
"type": "object",
"required": [
"enable_kyc",
"end_time",
"event_id",
"name",
"start_time",
"subtitle",
"type"
],
"properties": {
"checkin_count": {
"type": "integer"
},
"description": {
"type": "string"
},
"enable_kyc": {
"type": "boolean"
},
"end_time": {
"type": "string"
},
"event_id": {
"type": "string"
},
"is_agenda_published": {
"type": "boolean"
},
"is_checked_in": {
"type": "boolean"
},
"is_joined": {
"type": "boolean"
},
"join_count": {
"type": "integer"
},
"name": {
"type": "string"
},
"owner": {
"type": "string"
},
"start_time": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"service_event.EventListResponse": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/definitions/service_event.EventListItems"
}
},
"total": {
"type": "integer"
}
}
},
"service_event.EventStatsResponse": {
"type": "object",
"properties": {
"agenda_submission_count": {
"type": "integer"
},
"checkin_count": {
"type": "integer"
},
"join_count": {
"type": "integer"
},
"kyc_pass_rate": {
"type": "number"
}
}
},
"service_event.EventUpdateData": {
"type": "object",
"required": [
"event_id"
],
"properties": {
"attendance_guide": {
"type": "string"
},
"description": {
"type": "string"
},
"end_time": {
"type": "string"
},
"event_id": {
"type": "string"
},
"is_agenda_published": {
"type": "boolean"
},
"limit": {
"type": "integer"
},
"name": {
"type": "string"
},
"quota": {
"type": "integer"
},
"start_time": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"thumbnail": {
"type": "string"
}
}
},
"service_kyc.KycQueryData": {
"type": "object",
"required": [
"kyc_id"
],
"properties": {
"kyc_id": {
"type": "string"
}
}
},
"service_kyc.KycQueryResponse": {
"type": "object",
"required": [
"status"
],
"properties": {
"status": {
"description": "success | pending | failed",
"type": "string"
}
}
},
"service_kyc.KycSessionData": {
"type": "object",
"required": [
"identity",
"type"
],
"properties": {
"identity": {
"description": "base64 json",
"type": "string"
},
"type": {
"description": "cnrid | passport",
"type": "string"
}
}
},
"service_kyc.KycSessionResponse": {
"type": "object",
"required": [
"status"
],
"properties": {
"kyc_id": {
"type": "string"
},
"redirect_uri": {
"type": "string"
},
"status": {
"description": "success | processing",
"type": "string"
}
}
},
"service_stats.GlobalStatsResponse": {
"type": "object",
"properties": {
"event_join_checkin": {
"type": "array",
"items": {
"$ref": "#/definitions/data.EventStatDoc"
}
},
"total_users": {
"type": "integer"
},
"users_per_level": {
"type": "array",
"items": {
"$ref": "#/definitions/data.PermissionLevelCount"
}
}
}
},
"service_user.UserInfoData": {
"type": "object",
"required": [
"allow_public",
"email",
"permission_level",
"user_id",
"username"
],
"properties": {
"allow_public": {
"type": "boolean"
},
"avatar": {
"type": "string"
},
"bio": {
"type": "string"
},
"email": {
"type": "string"
},
"nickname": {
"type": "string"
},
"permission_level": {
"type": "integer"
},
"subtitle": {
"type": "string"
},
"user_id": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"service_user.UserInfoUpdateData": {
"type": "object",
"properties": {
"allow_public": {
"type": "boolean"
},
"avatar": {
"type": "string"
},
"bio": {
"type": "string"
},
"nickname": {
"type": "string"
},
"permission_level": {
"type": "integer"
},
"subtitle": {
"type": "string"
},
"user_id": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"service_user.UserListResponse": {
"type": "object",
"properties": {
"avatar": {
"type": "string"
},
"email": {
"type": "string"
},
"nickname": {
"type": "string"
},
"permission_level": {
"type": "integer"
},
"subtitle": {
"type": "string"
},
"user_id": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"utils.RespStatus": {
"type": "object",
"required": [
"code",
"data",
"error_id",
"status"
],
"properties": {
"code": {
"type": "integer"
},
"data": {},
"error_id": {
"type": "string"
},
"status": {
"type": "string"
}
}
}
},
"securityDefinitions": {
"Bearer": {
"type": "apiKey",
"name": "Authorization",
"in": "header"
}
}
}