Files
a301_server/docs/docs.go
tolelom befea9dd68
Some checks failed
Server CI/CD / lint-and-build (push) Failing after 12m3s
Server CI/CD / deploy (push) Has been cancelled
feat: Swagger API 문서 추가 + 보스레이드/플레이어 레벨 시스템
- swaggo/swag 기반 전체 API 엔드포인트 Swagger 어노테이션 (59개)
- /swagger/ 경로에 Swagger UI 제공
- 보스레이드 데디서버 관리 (등록, 하트비트, 슬롯 리셋)
- 플레이어 레벨/경험치 시스템 및 스탯 성장

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 17:51:37 +09:00

4122 lines
138 KiB
Go

// Package docs Code generated by swaggo/swag. DO NOT EDIT
package docs
import "github.com/swaggo/swag"
const docTemplate = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{escape .Description}}",
"title": "{{.Title}}",
"contact": {},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/api/announcements/": {
"get": {
"description": "공지사항 목록을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Announcements"
],
"summary": "공지사항 목록 조회",
"parameters": [
{
"type": "integer",
"default": 0,
"description": "시작 위치",
"name": "offset",
"in": "query"
},
{
"type": "integer",
"default": 20,
"description": "조회 수",
"name": "limit",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.AnnouncementResponse"
}
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
},
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "새 공지사항을 생성합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Announcements"
],
"summary": "공지사항 생성 (관리자)",
"parameters": [
{
"description": "공지사항 내용",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.CreateAnnouncementRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/docs.AnnouncementResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/announcements/{id}": {
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "공지사항을 수정합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Announcements"
],
"summary": "공지사항 수정 (관리자)",
"parameters": [
{
"type": "integer",
"description": "공지사항 ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "수정할 내용",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.UpdateAnnouncementRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.AnnouncementResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
},
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "공지사항을 삭제합니다",
"tags": [
"Announcements"
],
"summary": "공지사항 삭제 (관리자)",
"parameters": [
{
"type": "integer",
"description": "공지사항 ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"description": "No Content"
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/launch-ticket": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "게임 런처용 일회성 티켓을 발급합니다",
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "런처 티켓 발급",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.LaunchTicketResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/login": {
"post": {
"description": "사용자 인증 후 JWT 토큰을 발급합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "로그인",
"parameters": [
{
"description": "로그인 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.LoginRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.LoginResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/logout": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 세션을 무효화합니다",
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "로그아웃",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.MessageResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/redeem-ticket": {
"post": {
"description": "일회성 티켓을 Access 토큰으로 교환합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "런처 티켓 교환",
"parameters": [
{
"description": "티켓",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.RedeemTicketRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.RedeemTicketResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/refresh": {
"post": {
"description": "Refresh 토큰으로 새 Access 토큰을 발급합니다 (쿠키 또는 body)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "토큰 갱신",
"parameters": [
{
"description": "Refresh 토큰 (쿠키 우선)",
"name": "body",
"in": "body",
"schema": {
"$ref": "#/definitions/docs.RefreshRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.RefreshResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/register": {
"post": {
"description": "새로운 사용자 계정을 생성합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "회원가입",
"parameters": [
{
"description": "회원가입 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.RegisterRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/docs.MessageResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/ssafy/callback": {
"post": {
"description": "SSAFY 인가 코드를 교환하여 로그인합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "SSAFY OAuth 콜백",
"parameters": [
{
"description": "인가 코드",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.SSAFYCallbackRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.LoginResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/auth/ssafy/login": {
"get": {
"description": "SSAFY OAuth 로그인 URL을 생성합니다",
"produces": [
"application/json"
],
"tags": [
"Auth"
],
"summary": "SSAFY 로그인 URL",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.SSAFYLoginURLResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/bossraid/entry": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "게임 클라이언트에서 보스 레이드 입장을 요청합니다. 인증된 유저가 입장 목록에 포함되어야 합니다.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Boss Raid"
],
"summary": "보스 레이드 입장 요청",
"parameters": [
{
"description": "입장 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.RequestEntryAuthRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/docs.RequestEntryResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/bossraid/my-entry-token": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 대기 중인 입장 토큰을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Boss Raid"
],
"summary": "내 입장 토큰 조회",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.MyEntryTokenResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/admin/mint": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "새 에셋을 발행합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Admin"
],
"summary": "에셋 발행 (관리자)",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "발행 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.MintAssetRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/admin/reward": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "유저에게 토큰 및 에셋 보상을 지급합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Admin"
],
"summary": "보상 지급 (관리자)",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "보상 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.GrantRewardRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/admin/template": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "새 에셋 템플릿을 등록합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Admin"
],
"summary": "템플릿 등록 (관리자)",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "템플릿 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.RegisterTemplateRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/asset/transfer": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "다른 유저에게 에셋을 전송합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "에셋 전송",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "전송 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.TransferAssetRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/asset/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "특정 에셋의 상세 정보를 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "에셋 상세 조회",
"parameters": [
{
"type": "string",
"description": "에셋 ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/assets": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 블록체인 에셋 목록을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "에셋 목록 조회",
"parameters": [
{
"type": "integer",
"default": 0,
"description": "시작 위치",
"name": "offset",
"in": "query"
},
{
"type": "integer",
"default": 50,
"description": "조회 수",
"name": "limit",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/balance": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 토큰 잔액을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "잔액 조회",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/inventory": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 인벤토리를 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "인벤토리 조회",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/inventory/equip": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "에셋을 장비 슬롯에 장착합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "아이템 장착",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "장착 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.EquipItemRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/inventory/unequip": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "에셋의 장비 슬롯 장착을 해제합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "아이템 장착 해제",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "해제 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.UnequipItemRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/market": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "마켓에 등록된 매물 목록을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "마켓 목록 조회",
"parameters": [
{
"type": "integer",
"default": 0,
"description": "시작 위치",
"name": "offset",
"in": "query"
},
{
"type": "integer",
"default": 50,
"description": "조회 수",
"name": "limit",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/market/buy": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "마켓에서 매물을 구매합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "마켓 구매",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "구매 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.BuyFromMarketRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/market/cancel": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "마켓에 등록한 매물을 취소합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "마켓 등록 취소",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "취소 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.CancelListingRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/market/list": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "에셋을 마켓에 등록합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "마켓 등록",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "등록 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.ListOnMarketRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/market/{id}": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "특정 마켓 매물의 상세 정보를 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "마켓 매물 상세 조회",
"parameters": [
{
"type": "string",
"description": "매물 ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/transfer": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "다른 유저에게 토큰을 전송합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Chain - Transactions"
],
"summary": "토큰 전송",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "전송 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.TransferRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/chain/wallet": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 블록체인 지갑 정보를 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Chain"
],
"summary": "지갑 정보 조회",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.WalletInfoResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/download/file": {
"get": {
"description": "게임 zip 파일을 다운로드합니다",
"produces": [
"application/octet-stream"
],
"tags": [
"Download"
],
"summary": "게임 파일 다운로드",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/download/info": {
"get": {
"description": "게임 및 런처 다운로드 정보를 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Download"
],
"summary": "다운로드 정보 조회",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.DownloadInfoResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/download/launcher": {
"get": {
"description": "런처 실행 파일을 다운로드합니다",
"produces": [
"application/octet-stream"
],
"tags": [
"Download"
],
"summary": "런처 다운로드",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/download/upload/game": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "게임 zip 파일을 스트리밍 업로드합니다. Body는 raw binary입니다.",
"consumes": [
"application/octet-stream"
],
"produces": [
"application/json"
],
"tags": [
"Download"
],
"summary": "게임 파일 업로드 (관리자)",
"parameters": [
{
"type": "string",
"default": "game.zip",
"description": "파일명",
"name": "filename",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.DownloadInfoResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/download/upload/launcher": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "런처 실행 파일을 스트리밍 업로드합니다. Body는 raw binary입니다.",
"consumes": [
"application/octet-stream"
],
"produces": [
"application/json"
],
"tags": [
"Download"
],
"summary": "런처 업로드 (관리자)",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.DownloadInfoResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/auth/verify": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "JWT 토큰을 검증하고 username을 반환합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Auth"
],
"summary": "토큰 검증 (내부 API)",
"parameters": [
{
"description": "검증할 토큰",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.VerifyTokenRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.VerifyTokenResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/complete": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "보스 처치 시 데디케이티드 서버에서 호출합니다. 보상을 분배합니다.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "레이드 완료 (내부 API)",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "완료 정보 및 보상",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.CompleteRaidRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.CompleteRaidResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/entry": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "MMO 서버에서 파티의 보스 레이드 입장을 요청합니다. 모든 플레이어의 entry token을 반환합니다.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "보스 레이드 입장 요청 (내부 API)",
"parameters": [
{
"description": "입장 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.RequestEntryRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/docs.InternalRequestEntryResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/fail": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "타임아웃 또는 전멸 시 데디케이티드 서버에서 호출합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "레이드 실패 (내부 API)",
"parameters": [
{
"description": "세션 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.SessionNameRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.RoomStatusResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/heartbeat": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "데디케이티드 서버 컨테이너가 주기적으로 호출합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "하트비트 (내부 API)",
"parameters": [
{
"description": "인스턴스 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.HeartbeatRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.StatusResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/register": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "데디케이티드 서버 컨테이너가 시작 시 호출합니다. 룸 슬롯을 자동 할당합니다.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "데디케이티드 서버 등록 (내부 API)",
"parameters": [
{
"description": "서버 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.RegisterServerRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/docs.RegisterServerResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/reset-room": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "레이드 종료 후 슬롯을 idle 상태로 되돌립니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "룸 슬롯 리셋 (내부 API)",
"parameters": [
{
"description": "세션 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.ResetRoomRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.ResetRoomResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/room": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "sessionName으로 보스 레이드 방 정보를 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "방 정보 조회 (내부 API)",
"parameters": [
{
"type": "string",
"description": "세션 이름",
"name": "sessionName",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/bossraid.BossRoom"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/server-status": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "데디케이티드 서버의 정보와 룸 슬롯 목록을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "서버 상태 조회 (내부 API)",
"parameters": [
{
"type": "string",
"description": "서버 이름",
"name": "serverName",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/start": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "Fusion 세션이 시작될 때 데디케이티드 서버에서 호출합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "레이드 시작 (내부 API)",
"parameters": [
{
"description": "세션 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.SessionNameRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.RoomStatusResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/bossraid/validate-entry": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "데디케이티드 서버에서 플레이어의 입장 토큰을 검증합니다. 일회성 소모.",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Boss Raid"
],
"summary": "입장 토큰 검증 (내부 API)",
"parameters": [
{
"description": "토큰",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.ValidateEntryTokenRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.ValidateEntryTokenResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/chain/assets": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 에셋 목록을 조회합니다 (게임 서버용)",
"produces": [
"application/json"
],
"tags": [
"Internal - Chain"
],
"summary": "에셋 목록 조회 (내부 API)",
"parameters": [
{
"type": "string",
"description": "유저명",
"name": "username",
"in": "query",
"required": true
},
{
"type": "integer",
"default": 0,
"description": "시작 위치",
"name": "offset",
"in": "query"
},
{
"type": "integer",
"default": 50,
"description": "조회 수",
"name": "limit",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/chain/balance": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 잔액을 조회합니다 (게임 서버용)",
"produces": [
"application/json"
],
"tags": [
"Internal - Chain"
],
"summary": "잔액 조회 (내부 API)",
"parameters": [
{
"type": "string",
"description": "유저명",
"name": "username",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/chain/inventory": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 인벤토리를 조회합니다 (게임 서버용)",
"produces": [
"application/json"
],
"tags": [
"Internal - Chain"
],
"summary": "인벤토리 조회 (내부 API)",
"parameters": [
{
"type": "string",
"description": "유저명",
"name": "username",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/chain/mint": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 에셋을 발행합니다 (게임 서버용)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Chain"
],
"summary": "에셋 발행 (내부 API)",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "발행 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.InternalMintAssetRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/chain/reward": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 유저에게 보상을 지급합니다 (게임 서버용)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Chain"
],
"summary": "보상 지급 (내부 API)",
"parameters": [
{
"type": "string",
"description": "멱등성 키",
"name": "Idempotency-Key",
"in": "header",
"required": true
},
{
"description": "보상 정보",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.InternalGrantRewardRequest"
}
}
],
"responses": {
"201": {
"description": "Created",
"schema": {
"type": "object",
"additionalProperties": true
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/player/profile": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 플레이어 프로필을 조회합니다 (게임 서버용)",
"produces": [
"application/json"
],
"tags": [
"Internal - Player"
],
"summary": "프로필 조회 (내부 API)",
"parameters": [
{
"type": "string",
"description": "유저명",
"name": "username",
"in": "query",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.PlayerProfileResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/internal/player/save": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "username으로 게임 데이터를 저장합니다 (게임 서버용)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Internal - Player"
],
"summary": "게임 데이터 저장 (내부 API)",
"parameters": [
{
"type": "string",
"description": "유저명",
"name": "username",
"in": "query",
"required": true
},
{
"description": "게임 데이터",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.GameDataRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.MessageResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/player/profile": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 플레이어 프로필을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Player"
],
"summary": "내 프로필 조회",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.PlayerProfileResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
},
"put": {
"security": [
{
"BearerAuth": []
}
],
"description": "현재 유저의 닉네임을 수정합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Player"
],
"summary": "프로필 수정",
"parameters": [
{
"description": "수정할 프로필",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.UpdateProfileRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/player.PlayerProfile"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/users/": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "모든 유저 목록을 조회합니다",
"produces": [
"application/json"
],
"tags": [
"Users"
],
"summary": "전체 유저 목록 (관리자)",
"parameters": [
{
"type": "integer",
"default": 0,
"description": "시작 위치",
"name": "offset",
"in": "query"
},
{
"type": "integer",
"default": 50,
"description": "조회 수",
"name": "limit",
"in": "query"
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.UserResponse"
}
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/users/{id}": {
"delete": {
"security": [
{
"BearerAuth": []
}
],
"description": "유저를 삭제합니다",
"tags": [
"Users"
],
"summary": "유저 삭제 (관리자)",
"parameters": [
{
"type": "integer",
"description": "유저 ID",
"name": "id",
"in": "path",
"required": true
}
],
"responses": {
"204": {
"description": "No Content"
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
},
"/api/users/{id}/role": {
"patch": {
"security": [
{
"BearerAuth": []
}
],
"description": "유저의 역할을 admin 또는 user로 변경합니다",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Users"
],
"summary": "유저 권한 변경 (관리자)",
"parameters": [
{
"type": "integer",
"description": "유저 ID",
"name": "id",
"in": "path",
"required": true
},
{
"description": "변경할 역할",
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/docs.UpdateRoleRequest"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/docs.MessageResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/docs.ErrorResponse"
}
}
}
}
}
},
"definitions": {
"bossraid.BossRoom": {
"type": "object",
"properties": {
"bossId": {
"type": "integer"
},
"completedAt": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"id": {
"type": "integer"
},
"maxPlayers": {
"type": "integer"
},
"players": {
"description": "Players is stored as a JSON text column for simplicity.\nTODO: For better query performance, consider migrating to a junction table\n(boss_room_players with room_id + username columns).",
"type": "string"
},
"sessionName": {
"type": "string"
},
"startedAt": {
"type": "string"
},
"status": {
"$ref": "#/definitions/bossraid.RoomStatus"
},
"updatedAt": {
"type": "string"
}
}
},
"bossraid.RoomStatus": {
"type": "string",
"enum": [
"waiting",
"in_progress",
"completed",
"failed"
],
"x-enum-varnames": [
"StatusWaiting",
"StatusInProgress",
"StatusCompleted",
"StatusFailed"
]
},
"docs.AnnouncementResponse": {
"type": "object",
"properties": {
"content": {
"type": "string",
"example": "3월 16일 서버 점검이 예정되어 있습니다."
},
"createdAt": {
"type": "string"
},
"id": {
"type": "integer",
"example": 1
},
"title": {
"type": "string",
"example": "서버 점검 안내"
},
"updatedAt": {
"type": "string"
}
}
},
"docs.BuyFromMarketRequest": {
"type": "object",
"properties": {
"listingId": {
"type": "string",
"example": "listing_001"
}
}
},
"docs.CancelListingRequest": {
"type": "object",
"properties": {
"listingId": {
"type": "string",
"example": "listing_001"
}
}
},
"docs.CompleteRaidRequest": {
"type": "object",
"properties": {
"rewards": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.PlayerReward"
}
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
}
}
},
"docs.CompleteRaidResponse": {
"type": "object",
"properties": {
"rewardResults": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.RewardResult"
}
},
"roomId": {
"type": "integer",
"example": 1
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
},
"status": {
"type": "string",
"example": "completed"
}
}
},
"docs.CreateAnnouncementRequest": {
"type": "object",
"properties": {
"content": {
"type": "string",
"example": "3월 16일 서버 점검이 예정되어 있습니다."
},
"title": {
"type": "string",
"example": "서버 점검 안내"
}
}
},
"docs.DownloadInfoResponse": {
"type": "object",
"properties": {
"createdAt": {
"type": "string"
},
"fileHash": {
"type": "string",
"example": "a1b2c3d4e5f6..."
},
"fileName": {
"type": "string",
"example": "A301_v1.0.zip"
},
"fileSize": {
"type": "string",
"example": "1.5 GB"
},
"id": {
"type": "integer",
"example": 1
},
"launcherSize": {
"type": "string",
"example": "25.3 MB"
},
"launcherUrl": {
"type": "string",
"example": "https://a301.api.tolelom.xyz/api/download/launcher"
},
"updatedAt": {
"type": "string"
},
"url": {
"type": "string",
"example": "https://a301.api.tolelom.xyz/api/download/file"
},
"version": {
"type": "string",
"example": "1.0.0"
}
}
},
"docs.EquipItemRequest": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"example": "asset_001"
},
"slot": {
"type": "string",
"example": "weapon"
}
}
},
"docs.ErrorResponse": {
"type": "object",
"properties": {
"error": {
"type": "string",
"example": "오류 메시지"
}
}
},
"docs.GameDataRequest": {
"type": "object",
"properties": {
"attackPower": {
"type": "number",
"example": 25
},
"attackRange": {
"type": "number",
"example": 3
},
"experience": {
"type": "integer",
"example": 1200
},
"lastPosX": {
"type": "number",
"example": 10.5
},
"lastPosY": {
"type": "number",
"example": 0
},
"lastPosZ": {
"type": "number",
"example": 20.3
},
"lastRotY": {
"type": "number",
"example": 90
},
"level": {
"type": "integer",
"example": 5
},
"maxHp": {
"type": "number",
"example": 150
},
"maxMp": {
"type": "number",
"example": 75
},
"sprintMultiplier": {
"type": "number",
"example": 1.8
},
"totalPlayTime": {
"type": "integer",
"example": 3600
}
}
},
"docs.GrantRewardRequest": {
"type": "object",
"properties": {
"assets": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.MintAssetPayload"
}
},
"recipientPubKey": {
"type": "string",
"example": "abcdef012345..."
},
"tokenAmount": {
"type": "integer",
"example": 1000
}
}
},
"docs.HeartbeatRequest": {
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"example": "container_abc"
}
}
},
"docs.InternalGrantRewardRequest": {
"type": "object",
"properties": {
"assets": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.MintAssetPayload"
}
},
"tokenAmount": {
"type": "integer",
"example": 1000
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.InternalMintAssetRequest": {
"type": "object",
"properties": {
"properties": {
"type": "object",
"additionalProperties": {}
},
"templateId": {
"type": "string",
"example": "sword_template"
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.InternalRequestEntryResponse": {
"type": "object",
"properties": {
"bossId": {
"type": "integer",
"example": 1
},
"players": {
"type": "array",
"items": {
"type": "string"
}
},
"roomId": {
"type": "integer",
"example": 1
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
},
"status": {
"type": "string",
"example": "waiting"
},
"tokens": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
},
"docs.LaunchTicketResponse": {
"type": "object",
"properties": {
"ticket": {
"type": "string",
"example": "ticket_abc123"
}
}
},
"docs.ListOnMarketRequest": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"example": "asset_001"
},
"price": {
"type": "integer",
"example": 500
}
}
},
"docs.LoginRequest": {
"type": "object",
"properties": {
"password": {
"type": "string",
"example": "mypassword"
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.LoginResponse": {
"type": "object",
"properties": {
"role": {
"type": "string",
"example": "user"
},
"token": {
"type": "string",
"example": "eyJhbGciOiJIUzI1NiIs..."
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.MessageResponse": {
"type": "object",
"properties": {
"message": {
"type": "string",
"example": "성공"
}
}
},
"docs.MintAssetPayload": {
"type": "object",
"properties": {
"owner": {
"type": "string",
"example": "abcdef012345..."
},
"properties": {
"type": "object",
"additionalProperties": {}
},
"template_id": {
"type": "string",
"example": "sword_template"
}
}
},
"docs.MintAssetRequest": {
"type": "object",
"properties": {
"ownerPubKey": {
"type": "string",
"example": "abcdef012345..."
},
"properties": {
"type": "object",
"additionalProperties": {}
},
"templateId": {
"type": "string",
"example": "sword_template"
}
}
},
"docs.MyEntryTokenResponse": {
"type": "object",
"properties": {
"entryToken": {
"type": "string",
"example": "token_abc"
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
}
}
},
"docs.PlayerProfileResponse": {
"type": "object",
"properties": {
"attackPower": {
"type": "number",
"example": 25
},
"attackRange": {
"type": "number",
"example": 3
},
"createdAt": {
"type": "string"
},
"experience": {
"type": "integer",
"example": 1200
},
"id": {
"type": "integer",
"example": 1
},
"lastPosX": {
"type": "number",
"example": 10.5
},
"lastPosY": {
"type": "number",
"example": 0
},
"lastPosZ": {
"type": "number",
"example": 20.3
},
"lastRotY": {
"type": "number",
"example": 90
},
"level": {
"type": "integer",
"example": 5
},
"maxHp": {
"type": "number",
"example": 150
},
"maxMp": {
"type": "number",
"example": 75
},
"nextExp": {
"type": "integer",
"example": 2000
},
"nickname": {
"type": "string",
"example": "용사"
},
"sprintMultiplier": {
"type": "number",
"example": 1.8
},
"totalPlayTime": {
"type": "integer",
"example": 3600
},
"updatedAt": {
"type": "string"
},
"userId": {
"type": "integer",
"example": 1
}
}
},
"docs.PlayerReward": {
"type": "object",
"properties": {
"assets": {
"type": "array",
"items": {
"$ref": "#/definitions/docs.MintAssetPayload"
}
},
"experience": {
"type": "integer",
"example": 500
},
"tokenAmount": {
"type": "integer",
"example": 100
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.RedeemTicketRequest": {
"type": "object",
"properties": {
"ticket": {
"type": "string",
"example": "ticket_abc123"
}
}
},
"docs.RedeemTicketResponse": {
"type": "object",
"properties": {
"token": {
"type": "string",
"example": "eyJhbGciOiJIUzI1NiIs..."
}
}
},
"docs.RefreshRequest": {
"type": "object",
"properties": {
"refreshToken": {
"type": "string"
}
}
},
"docs.RefreshResponse": {
"type": "object",
"properties": {
"token": {
"type": "string",
"example": "eyJhbGciOiJIUzI1NiIs..."
}
}
},
"docs.RegisterRequest": {
"type": "object",
"properties": {
"password": {
"type": "string",
"example": "mypassword"
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.RegisterServerRequest": {
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"example": "container_abc"
},
"maxRooms": {
"type": "integer",
"example": 10
},
"serverName": {
"type": "string",
"example": "Dedi1"
}
}
},
"docs.RegisterServerResponse": {
"type": "object",
"properties": {
"instanceId": {
"type": "string",
"example": "container_abc"
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
}
}
},
"docs.RegisterTemplateRequest": {
"type": "object",
"properties": {
"id": {
"type": "string",
"example": "sword_template"
},
"name": {
"type": "string",
"example": "Sword"
},
"schema": {
"type": "object",
"additionalProperties": {}
},
"tradeable": {
"type": "boolean",
"example": true
}
}
},
"docs.RequestEntryAuthRequest": {
"type": "object",
"properties": {
"bossId": {
"type": "integer",
"example": 1
},
"usernames": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"docs.RequestEntryRequest": {
"type": "object",
"properties": {
"bossId": {
"type": "integer",
"example": 1
},
"usernames": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"player1",
"player2"
]
}
}
},
"docs.RequestEntryResponse": {
"type": "object",
"properties": {
"bossId": {
"type": "integer",
"example": 1
},
"entryToken": {
"type": "string",
"example": "token_abc"
},
"players": {
"type": "array",
"items": {
"type": "string"
}
},
"roomId": {
"type": "integer",
"example": 1
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
},
"status": {
"type": "string",
"example": "waiting"
}
}
},
"docs.ResetRoomRequest": {
"type": "object",
"properties": {
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
}
}
},
"docs.ResetRoomResponse": {
"type": "object",
"properties": {
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
},
"status": {
"type": "string",
"example": "ok"
}
}
},
"docs.RewardResult": {
"type": "object",
"properties": {
"error": {
"type": "string"
},
"success": {
"type": "boolean",
"example": true
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.RoomStatusResponse": {
"type": "object",
"properties": {
"roomId": {
"type": "integer",
"example": 1
},
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
},
"status": {
"type": "string",
"example": "in_progress"
}
}
},
"docs.SSAFYCallbackRequest": {
"type": "object",
"properties": {
"code": {
"type": "string",
"example": "auth_code_123"
},
"state": {
"type": "string",
"example": "random_state_string"
}
}
},
"docs.SSAFYLoginURLResponse": {
"type": "object",
"properties": {
"url": {
"type": "string",
"example": "https://edu.ssafy.com/oauth/authorize?..."
}
}
},
"docs.SessionNameRequest": {
"type": "object",
"properties": {
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
}
}
},
"docs.StatusResponse": {
"type": "object",
"properties": {
"status": {
"type": "string",
"example": "ok"
}
}
},
"docs.TransferAssetRequest": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"example": "asset_001"
},
"to": {
"type": "string",
"example": "1a2b3c4d5e6f..."
}
}
},
"docs.TransferRequest": {
"type": "object",
"properties": {
"amount": {
"type": "integer",
"example": 100
},
"to": {
"type": "string",
"example": "1a2b3c4d5e6f..."
}
}
},
"docs.UnequipItemRequest": {
"type": "object",
"properties": {
"assetId": {
"type": "string",
"example": "asset_001"
}
}
},
"docs.UpdateAnnouncementRequest": {
"type": "object",
"properties": {
"content": {
"type": "string",
"example": "수정된 내용"
},
"title": {
"type": "string",
"example": "수정된 제목"
}
}
},
"docs.UpdateProfileRequest": {
"type": "object",
"properties": {
"nickname": {
"type": "string",
"example": "용사"
}
}
},
"docs.UpdateRoleRequest": {
"type": "object",
"properties": {
"role": {
"type": "string",
"example": "admin"
}
}
},
"docs.UserResponse": {
"type": "object",
"properties": {
"createdAt": {
"type": "string"
},
"id": {
"type": "integer",
"example": 1
},
"role": {
"type": "string",
"example": "user"
},
"ssafyId": {
"type": "string",
"example": "ssafy_123"
},
"updatedAt": {
"type": "string"
},
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.ValidateEntryTokenRequest": {
"type": "object",
"properties": {
"entryToken": {
"type": "string",
"example": "token_abc"
}
}
},
"docs.ValidateEntryTokenResponse": {
"type": "object",
"properties": {
"sessionName": {
"type": "string",
"example": "Dedi1_Room0"
},
"username": {
"type": "string",
"example": "player1"
},
"valid": {
"type": "boolean",
"example": true
}
}
},
"docs.VerifyTokenRequest": {
"type": "object",
"properties": {
"token": {
"type": "string",
"example": "eyJhbGciOiJIUzI1NiIs..."
}
}
},
"docs.VerifyTokenResponse": {
"type": "object",
"properties": {
"username": {
"type": "string",
"example": "player1"
}
}
},
"docs.WalletInfoResponse": {
"type": "object",
"properties": {
"address": {
"type": "string",
"example": "1a2b3c4d5e6f..."
},
"pubKeyHex": {
"type": "string",
"example": "abcdef012345..."
}
}
},
"player.PlayerProfile": {
"type": "object",
"properties": {
"attackPower": {
"type": "number"
},
"attackRange": {
"type": "number"
},
"createdAt": {
"type": "string"
},
"experience": {
"type": "integer"
},
"id": {
"type": "integer"
},
"lastPosX": {
"description": "마지막 위치",
"type": "number"
},
"lastPosY": {
"type": "number"
},
"lastPosZ": {
"type": "number"
},
"lastRotY": {
"type": "number"
},
"level": {
"description": "레벨 \u0026 경험치",
"type": "integer"
},
"maxHp": {
"description": "전투 스탯",
"type": "number"
},
"maxMp": {
"type": "number"
},
"nickname": {
"type": "string"
},
"sprintMultiplier": {
"type": "number"
},
"totalPlayTime": {
"description": "플레이 시간 (초 단위)",
"type": "integer"
},
"updatedAt": {
"type": "string"
},
"userId": {
"type": "integer"
}
}
}
},
"securityDefinitions": {
"ApiKeyAuth": {
"description": "내부 API 키 (게임 서버 ↔ API 서버 통신용)",
"type": "apiKey",
"name": "X-API-Key",
"in": "header"
},
"BearerAuth": {
"description": "JWT Bearer 토큰 (예: Bearer eyJhbGci...)",
"type": "apiKey",
"name": "Authorization",
"in": "header"
}
}
}`
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
Version: "1.0",
Host: "a301.api.tolelom.xyz",
BasePath: "/",
Schemes: []string{},
Title: "One of the Plans API",
Description: "멀티플레이어 보스 레이드 게임 플랫폼 백엔드 API",
InfoInstanceName: "swagger",
SwaggerTemplate: docTemplate,
LeftDelim: "{{",
RightDelim: "}}",
}
func init() {
swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
}