{ "swagger": "2.0", "info": { "description": "멀티플레이어 보스 레이드 게임 플랫폼 백엔드 API", "title": "One of the Plans API", "contact": {}, "version": "1.0" }, "host": "a301.api.tolelom.xyz", "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" } } }