Files
sodalive-backend-spring-boot/docs/20260724_AI캐릭터_관리자_API/api-contract.openapi.json

1261 lines
75 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "AI 캐릭터 관리자 API",
"version": "2.0.0",
"description": "클라이언트 개발용 정식 계약. 신규 관리자 endpoint와 path target을 사용하되 JSON 필드명, 타입, optional/nullable, 기본값과 성공 data 형태는 레거시 API를 유지한다. path로 이동한 ID만 body에서 제거한다."
},
"servers": [{"url": "/", "description": "현재 호스트"}],
"security": [{"bearerAuth": []}],
"tags": [
{"name": "Character", "description": "AI 캐릭터 조회·생성·수정"},
{"name": "AudioContent", "description": "오디오 콘텐츠 테마·조회·생성·수정"},
{"name": "Series", "description": "시리즈와 연결 콘텐츠 관리"},
{"name": "Community", "description": "커뮤니티 게시글 관리"},
{"name": "FanTalk", "description": "FanTalk 관리자 목록과 creator reply"}
],
"paths": {
"/api/v2/admin/ai-characters": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}],
"get": {
"tags": ["Character"],
"summary": "AI 캐릭터 목록/검색",
"operationId": "listAiCharacters",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["AdminChatCharacterController.getCharacterList", "AdminChatCharacterController.searchCharacters", "ChatCharacterListPageResponse", "ChatCharacterSearchListPageResponse"],
"parameters": [
{"name": "searchTerm", "in": "query", "required": false, "description": "생략하면 활성 목록, 지정하면 레거시 검색을 수행한다.", "schema": {"type": "string"}},
{"$ref": "#/components/parameters/Page"},
{"$ref": "#/components/parameters/Size"}
],
"responses": {
"200": {"$ref": "#/components/responses/CharacterListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"post": {
"tags": ["Character"],
"summary": "AI 캐릭터 생성",
"operationId": "createAiCharacter",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["AdminChatCharacterController.registerCharacter", "ChatCharacterRegisterRequest"],
"requestBody": {"$ref": "#/components/requestBodies/CharacterCreateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}],
"get": {
"tags": ["Character"],
"summary": "AI 캐릭터 상세",
"operationId": "getAiCharacter",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["AdminChatCharacterController.getCharacterDetail", "ChatCharacterDetailResponse"],
"responses": {
"200": {"$ref": "#/components/responses/CharacterDetailSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"put": {
"tags": ["Character"],
"summary": "AI 캐릭터 수정/soft delete",
"description": "레거시 ChatCharacterUpdateRequest의 id만 path characterId로 이동한다.",
"operationId": "updateAiCharacter",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["AdminChatCharacterController.updateCharacter", "ChatCharacterUpdateRequest"],
"requestBody": {"$ref": "#/components/requestBodies/CharacterUpdateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/audio-content-themes": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}],
"get": {
"tags": ["AudioContent"],
"summary": "활성 오디오 콘텐츠 테마 목록",
"operationId": "listAiCharacterAudioContentThemes",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["GetAudioContentThemeResponse"],
"responses": {
"200": {"$ref": "#/components/responses/AudioThemeListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/audio-contents": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}],
"get": {
"tags": ["AudioContent"],
"summary": "오디오 콘텐츠 목록/검색",
"operationId": "listAiCharacterAudioContents",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["CreatorAdminContentController.getAudioContentList", "CreatorAdminContentController.searchAudioContent", "GetCreatorAdminContentListResponse"],
"parameters": [
{"name": "search_word", "in": "query", "required": false, "description": "지정하면 레거시 검색을 수행하며 2자 이상이어야 한다.", "schema": {"type": "string"}},
{"$ref": "#/components/parameters/Page"},
{"$ref": "#/components/parameters/Size"}
],
"responses": {
"200": {"$ref": "#/components/responses/AudioContentListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"post": {
"tags": ["AudioContent"],
"summary": "오디오 콘텐츠 생성",
"operationId": "createAiCharacterAudioContent",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["AudioContentController.createAudioContent", "CreateAudioContentRequest", "CreateAudioContentResponse"],
"requestBody": {"$ref": "#/components/requestBodies/AudioContentCreateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/AudioContentCreateSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/audio-contents/{contentId}": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/ContentId"}],
"get": {
"tags": ["AudioContent"],
"summary": "오디오 콘텐츠 상세",
"operationId": "getAiCharacterAudioContent",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["AudioContentController.getDetail", "GetAudioContentDetailResponse"],
"parameters": [{"$ref": "#/components/parameters/Timezone"}],
"responses": {
"200": {"$ref": "#/components/responses/AudioContentDetailSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"put": {
"tags": ["AudioContent"],
"summary": "오디오 콘텐츠 수정/soft delete",
"description": "레거시 UpdateCreatorAdminContentRequest의 id만 path contentId로 이동한다.",
"operationId": "updateAiCharacterAudioContent",
"x-implementation-status": "implemented-contract-alignment-required",
"x-legacy-sources": ["CreatorAdminContentController.modifyAudioContent", "UpdateCreatorAdminContentRequest"],
"requestBody": {"$ref": "#/components/requestBodies/AudioContentUpdateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/series": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}],
"get": {
"tags": ["Series"],
"summary": "시리즈 목록",
"operationId": "listAiCharacterSeries",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.getSeriesList", "GetCreatorAdminContentSeriesListResponse"],
"parameters": [{"$ref": "#/components/parameters/Page"}, {"$ref": "#/components/parameters/Size"}],
"responses": {
"200": {"$ref": "#/components/responses/SeriesListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"post": {
"tags": ["Series"],
"summary": "시리즈 생성",
"operationId": "createAiCharacterSeries",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.createSeries", "CreateSeriesRequest"],
"requestBody": {"$ref": "#/components/requestBodies/SeriesCreateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/series/orders": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}],
"put": {
"tags": ["Series"],
"summary": "시리즈 순서 변경",
"operationId": "reorderAiCharacterSeries",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.updateSeriesOrders", "UpdateOrdersRequest"],
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeriesOrderUpdateRequest"}}}},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/series/{seriesId}": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/SeriesId"}],
"get": {
"tags": ["Series"],
"summary": "시리즈 상세",
"operationId": "getAiCharacterSeries",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.getDetail", "GetCreatorAdminContentSeriesDetailResponse"],
"responses": {
"200": {"$ref": "#/components/responses/SeriesDetailSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"put": {
"tags": ["Series"],
"summary": "시리즈 수정/soft delete",
"description": "레거시 ModifySeriesRequest의 seriesId만 path로 이동한다.",
"operationId": "updateAiCharacterSeries",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.modifySeries", "ModifySeriesRequest"],
"requestBody": {"$ref": "#/components/requestBodies/SeriesUpdateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/series/{seriesId}/contents": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/SeriesId"}],
"get": {
"tags": ["Series"],
"summary": "시리즈 연결 콘텐츠 목록",
"operationId": "listAiCharacterSeriesContents",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.getSeriesContent", "GetCreatorAdminContentSeriesContentResponse"],
"parameters": [{"$ref": "#/components/parameters/Page"}, {"$ref": "#/components/parameters/Size"}],
"responses": {
"200": {"$ref": "#/components/responses/SeriesContentListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"post": {
"tags": ["Series"],
"summary": "시리즈 콘텐츠 연결",
"description": "레거시 AddingContentToTheSeriesRequest의 seriesId만 path로 이동한다.",
"operationId": "addAiCharacterSeriesContents",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.addingContentToTheSeries", "AddingContentToTheSeriesRequest"],
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeriesContentAddRequest"}}}},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/series/{seriesId}/contents/search": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/SeriesId"}],
"get": {
"tags": ["Series"],
"summary": "시리즈 미연결 콘텐츠 검색",
"operationId": "searchAiCharacterContentsNotInSeries",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.searchContentNotInSeries", "SearchContentNotInSeriesResponse"],
"parameters": [{"name": "search_word", "in": "query", "required": true, "schema": {"type": "string"}}],
"responses": {
"200": {"$ref": "#/components/responses/SeriesContentSearchSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/series/{seriesId}/contents/{contentId}": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/SeriesId"}, {"$ref": "#/components/parameters/ContentId"}],
"delete": {
"tags": ["Series"],
"summary": "시리즈 콘텐츠 연결 해제",
"description": "레거시 RemoveContentToTheSeriesRequest의 seriesId와 contentId를 path로 이동해 body가 없다.",
"operationId": "removeAiCharacterSeriesContent",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorAdminContentSeriesController.removeContentInTheSeries", "RemoveContentToTheSeriesRequest"],
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/community-posts": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}],
"get": {
"tags": ["Community"],
"summary": "커뮤니티 게시글 목록",
"operationId": "listAiCharacterCommunityPosts",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorCommunityController.getCommunityPostList", "GetCommunityPostListResponse"],
"parameters": [{"$ref": "#/components/parameters/Timezone"}, {"$ref": "#/components/parameters/Page"}, {"$ref": "#/components/parameters/Size"}],
"responses": {
"200": {"$ref": "#/components/responses/CommunityPostListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
},
"post": {
"tags": ["Community"],
"summary": "커뮤니티 게시글 등록",
"operationId": "createAiCharacterCommunityPost",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorCommunityController.createCommunityPost", "CreateCommunityPostRequest"],
"requestBody": {"$ref": "#/components/requestBodies/CommunityPostCreateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/community-posts/{postId}": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/PostId"}],
"put": {
"tags": ["Community"],
"summary": "커뮤니티 게시글 수정/고정/soft delete",
"description": "ModifyCommunityPostRequest의 creatorCommunityId와 UpdateCommunityPostFixedRequest의 postId를 path로 이동하고 나머지 레거시 필드를 하나의 request에 합친다.",
"operationId": "updateAiCharacterCommunityPost",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorCommunityController.modifyCommunityPost", "CreatorCommunityController.updateCommunityPostFixed", "ModifyCommunityPostRequest", "UpdateCommunityPostFixedRequest"],
"requestBody": {"$ref": "#/components/requestBodies/CommunityPostUpdateMultipart"},
"responses": {
"200": {"$ref": "#/components/responses/NullSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/fan-talks": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}],
"get": {
"tags": ["FanTalk"],
"summary": "FanTalk 관리자 목록",
"description": "공개 v2 응답 필드 형태를 유지하되 관리자 target/ownership 정책을 사용하고 viewer/block 필터를 적용하지 않는다.",
"operationId": "listAiCharacterFanTalks",
"x-implementation-status": "planned",
"x-legacy-sources": ["CreatorChannelFanTalkController.getFanTalkTab", "CreatorChannelFanTalkTabResponse"],
"parameters": [{"$ref": "#/components/parameters/FanTalkPage"}, {"$ref": "#/components/parameters/FanTalkSize"}],
"responses": {
"200": {"$ref": "#/components/responses/FanTalkListSuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
},
"/api/v2/admin/ai-characters/{characterId}/fan-talks/{fanTalkId}/replies": {
"parameters": [{"$ref": "#/components/parameters/AcceptLanguage"}, {"$ref": "#/components/parameters/CharacterId"}, {"$ref": "#/components/parameters/FanTalkId"}],
"post": {
"tags": ["FanTalk"],
"summary": "FanTalk 답변 작성",
"description": "사용자가 승인한 예외로 신규 관리자 축약 응답을 반환한다.",
"operationId": "createAiCharacterFanTalkReply",
"x-implementation-status": "planned",
"x-legacy-sources": ["ExplorerController.writeCheers", "PostWriteCheersRequest", "CreatorChannelFanTalkReplyResponse"],
"requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FanTalkReplyCreateRequest"}}}},
"responses": {
"200": {"$ref": "#/components/responses/FanTalkReplySuccess"},
"400": {"$ref": "#/components/responses/BadRequest"},
"401": {"$ref": "#/components/responses/Unauthorized"},
"403": {"$ref": "#/components/responses/Forbidden"},
"404": {"$ref": "#/components/responses/NotFound"},
"405": {"$ref": "#/components/responses/MethodNotAllowed"},
"406": {"$ref": "#/components/responses/NotAcceptable"},
"415": {"$ref": "#/components/responses/UnsupportedMediaType"},
"500": {"$ref": "#/components/responses/InternalServerError"}
}
}
}
},
"components": {
"securitySchemes": {
"bearerAuth": {"type": "http", "scheme": "bearer", "bearerFormat": "JWT"}
},
"parameters": {
"AcceptLanguage": {
"name": "Accept-Language",
"in": "header",
"required": false,
"description": "ko, en, ja는 해당 언어를 사용한다. header가 없거나 그 밖의 문자열이면 KO로 fallback한다.",
"schema": {"type": "string", "default": "ko", "examples": ["ko", "en", "ja"]}
},
"CharacterId": {"name": "characterId", "in": "path", "required": true, "schema": {"type": "integer", "format": "int64"}},
"ContentId": {"name": "contentId", "in": "path", "required": true, "schema": {"type": "integer", "format": "int64"}},
"SeriesId": {"name": "seriesId", "in": "path", "required": true, "schema": {"type": "integer", "format": "int64"}},
"PostId": {"name": "postId", "in": "path", "required": true, "schema": {"type": "integer", "format": "int64"}},
"FanTalkId": {"name": "fanTalkId", "in": "path", "required": true, "schema": {"type": "integer", "format": "int64"}},
"Page": {"name": "page", "in": "query", "required": false, "schema": {"type": "integer", "format": "int32", "default": 0, "minimum": 0}},
"Size": {"name": "size", "in": "query", "required": false, "schema": {"type": "integer", "format": "int32", "default": 20, "minimum": 1}},
"FanTalkPage": {"name": "page", "in": "query", "required": false, "description": "공개 v2 정책에서 0 이상으로 보정한다.", "schema": {"type": "integer", "format": "int32", "default": 0}},
"FanTalkSize": {"name": "size", "in": "query", "required": false, "description": "공개 v2 정책에서 20..50으로 보정한다.", "schema": {"type": "integer", "format": "int32", "default": 20}},
"Timezone": {"name": "timezone", "in": "query", "required": true, "example": "Asia/Seoul", "schema": {"type": "string"}}
},
"requestBodies": {
"CharacterCreateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/CharacterCreateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"CharacterUpdateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/CharacterUpdateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"AudioContentCreateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/AudioContentCreateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"AudioContentUpdateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/AudioContentUpdateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"SeriesCreateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/SeriesCreateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"SeriesUpdateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/SeriesUpdateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"CommunityPostCreateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/CommunityPostCreateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
},
"CommunityPostUpdateMultipart": {
"required": true,
"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/CommunityPostUpdateMultipart"}, "encoding": {"request": {"contentType": "application/json"}}}}
}
},
"responses": {
"CharacterListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CharacterListApiResponse"}}}},
"CharacterDetailSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CharacterDetailApiResponse"}}}},
"AudioThemeListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AudioThemeListApiResponse"}}}},
"AudioContentListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AudioContentListApiResponse"}}}},
"AudioContentCreateSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AudioContentCreateApiResponse"}}}},
"AudioContentDetailSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AudioContentDetailApiResponse"}}}},
"SeriesListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeriesListApiResponse"}}}},
"SeriesDetailSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeriesDetailApiResponse"}}}},
"SeriesContentListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeriesContentListApiResponse"}}}},
"SeriesContentSearchSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeriesContentSearchApiResponse"}}}},
"CommunityPostListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CommunityPostListApiResponse"}}}},
"FanTalkListSuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FanTalkListApiResponse"}}}},
"FanTalkReplySuccess": {"description": "성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FanTalkReplyApiResponse"}}}},
"NullSuccess": {"description": "레거시 mutation 성공", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NullSuccessResponse"}}}},
"BadRequest": {"description": "잘못된 요청/target/domain 오류", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"Unauthorized": {"description": "인증 실패", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"Forbidden": {"description": "인가 실패", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"NotFound": {"description": "미매핑 경로", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"MethodNotAllowed": {"description": "지원하지 않는 method", "headers": {"Allow": {"schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"NotAcceptable": {"description": "지원하지 않는 응답 media type", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"UnsupportedMediaType": {"description": "지원하지 않는 요청 media type", "headers": {"Accept": {"schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}},
"InternalServerError": {"description": "서버 오류", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApiErrorResponse"}}}}
},
"schemas": {
"NullableString": {"type": ["string", "null"]},
"NullableInt32": {"type": ["integer", "null"], "format": "int32"},
"NullableInt64": {"type": ["integer", "null"], "format": "int64"},
"NullableBoolean": {"type": ["boolean", "null"]},
"BinaryFile": {"type": "string", "format": "binary"},
"PurchaseOption": {"type": "string", "enum": ["BOTH", "BUY_ONLY", "RENT_ONLY"]},
"OrderType": {"type": "string", "enum": ["RENTAL", "KEEP"]},
"CharacterType": {"type": "string", "enum": ["Clone", "Character"]},
"SeriesPublishedDaysOfWeek": {"type": "string", "enum": ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "RANDOM"]},
"SeriesState": {"type": "string", "enum": ["PROCEEDING", "SUSPEND", "COMPLETE"]},
"ApiSuccessBase": {
"type": "object",
"required": ["success"],
"properties": {
"success": {"type": "boolean", "const": true}
}
},
"ApiErrorResponse": {
"type": "object",
"required": ["success", "message", "data", "errorProperty"],
"properties": {
"success": {"type": "boolean", "const": false},
"message": {"type": "string"},
"data": {"type": ["object", "null"], "const": null},
"errorProperty": {"type": ["string", "null"]}
}
},
"NullSuccessResponse": {
"allOf": [
{"$ref": "#/components/schemas/ApiSuccessBase"},
{
"type": "object",
"required": ["message", "data", "errorProperty"],
"properties": {
"message": {"type": ["string", "null"]},
"data": {"type": ["object", "null"], "const": null},
"errorProperty": {"type": ["string", "null"], "const": null}
}
}
]
},
"CharacterRelationship": {
"type": "object",
"additionalProperties": false,
"required": ["personName", "relationshipName", "description", "importance", "relationshipType", "currentStatus"],
"properties": {
"personName": {"type": "string"},
"relationshipName": {"type": "string"},
"description": {"type": "string"},
"importance": {"type": "integer", "format": "int32"},
"relationshipType": {"type": "string"},
"currentStatus": {"type": "string"}
}
},
"CharacterPersonality": {
"type": "object",
"additionalProperties": false,
"required": ["trait", "description"],
"properties": {"trait": {"type": "string"}, "description": {"type": "string"}}
},
"CharacterBackground": {
"type": "object",
"additionalProperties": false,
"required": ["topic", "description"],
"properties": {"topic": {"type": "string"}, "description": {"type": "string"}}
},
"CharacterMemory": {
"type": "object",
"additionalProperties": false,
"required": ["title", "content", "emotion"],
"properties": {"title": {"type": "string"}, "content": {"type": "string"}, "emotion": {"type": "string"}}
},
"OriginalWorkBrief": {
"type": "object",
"additionalProperties": false,
"required": ["id", "imageUrl", "title"],
"properties": {
"id": {"type": "integer", "format": "int64"},
"imageUrl": {"$ref": "#/components/schemas/NullableString"},
"title": {"type": "string"}
}
},
"CharacterCreateRequest": {
"type": "object",
"additionalProperties": false,
"required": ["name", "systemPrompt", "description"],
"properties": {
"name": {"type": "string"},
"systemPrompt": {"type": "string"},
"description": {"type": "string"},
"age": {"$ref": "#/components/schemas/NullableString"},
"gender": {"$ref": "#/components/schemas/NullableString"},
"mbti": {"$ref": "#/components/schemas/NullableString"},
"speechPattern": {"$ref": "#/components/schemas/NullableString"},
"speechStyle": {"$ref": "#/components/schemas/NullableString"},
"appearance": {"$ref": "#/components/schemas/NullableString"},
"region": {"type": "string", "default": "KR"},
"originalTitle": {"$ref": "#/components/schemas/NullableString"},
"originalLink": {"$ref": "#/components/schemas/NullableString"},
"originalWorkId": {"$ref": "#/components/schemas/NullableInt64"},
"characterType": {"$ref": "#/components/schemas/NullableString"},
"tags": {"type": "array", "items": {"type": "string"}, "default": []},
"hobbies": {"type": "array", "items": {"type": "string"}, "default": []},
"values": {"type": "array", "items": {"type": "string"}, "default": []},
"goals": {"type": "array", "items": {"type": "string"}, "default": []},
"relationships": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterRelationship"}, "default": []},
"personalities": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterPersonality"}, "default": []},
"backgrounds": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterBackground"}, "default": []},
"memories": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterMemory"}, "default": []}
}
},
"CharacterUpdateRequest": {
"type": "object",
"additionalProperties": false,
"description": "ChatCharacterUpdateRequest에서 path로 이동한 id만 제거한 형태다. isActive=false와 다른 필드를 함께 보내는 것도 레거시 request 계약상 허용되며, 이 경우 레거시 service는 비활성화만 반영하고 나머지 JSON 필드는 적용하지 않는다.",
"properties": {
"name": {"$ref": "#/components/schemas/NullableString"},
"systemPrompt": {"$ref": "#/components/schemas/NullableString"},
"description": {"$ref": "#/components/schemas/NullableString"},
"age": {"$ref": "#/components/schemas/NullableString"},
"gender": {"$ref": "#/components/schemas/NullableString"},
"mbti": {"$ref": "#/components/schemas/NullableString"},
"speechPattern": {"$ref": "#/components/schemas/NullableString"},
"speechStyle": {"$ref": "#/components/schemas/NullableString"},
"appearance": {"$ref": "#/components/schemas/NullableString"},
"originalTitle": {"$ref": "#/components/schemas/NullableString"},
"originalLink": {"$ref": "#/components/schemas/NullableString"},
"originalWorkId": {"$ref": "#/components/schemas/NullableInt64"},
"characterType": {"$ref": "#/components/schemas/NullableString"},
"isActive": {"$ref": "#/components/schemas/NullableBoolean"},
"tags": {"type": ["array", "null"], "items": {"type": "string"}},
"hobbies": {"type": ["array", "null"], "items": {"type": "string"}},
"values": {"type": ["array", "null"], "items": {"type": "string"}},
"goals": {"type": ["array", "null"], "items": {"type": "string"}},
"relationships": {"type": ["array", "null"], "items": {"$ref": "#/components/schemas/CharacterRelationship"}},
"personalities": {"type": ["array", "null"], "items": {"$ref": "#/components/schemas/CharacterPersonality"}},
"backgrounds": {"type": ["array", "null"], "items": {"$ref": "#/components/schemas/CharacterBackground"}},
"memories": {"type": ["array", "null"], "items": {"$ref": "#/components/schemas/CharacterMemory"}}
}
},
"CharacterCreateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["image", "request"],
"properties": {"image": {"$ref": "#/components/schemas/BinaryFile"}, "request": {"$ref": "#/components/schemas/CharacterCreateRequest"}}
},
"CharacterUpdateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["request"],
"properties": {"image": {"$ref": "#/components/schemas/BinaryFile"}, "request": {"$ref": "#/components/schemas/CharacterUpdateRequest"}}
},
"CharacterListItem": {
"type": "object",
"additionalProperties": false,
"required": ["id", "name", "imageUrl", "description", "gender", "age", "mbti", "speechStyle", "speechPattern", "region", "tags", "createdAt", "updatedAt"],
"properties": {
"id": {"type": "integer", "format": "int64"},
"name": {"type": "string"},
"imageUrl": {"$ref": "#/components/schemas/NullableString"},
"description": {"type": "string"},
"gender": {"$ref": "#/components/schemas/NullableString"},
"age": {"$ref": "#/components/schemas/NullableInt32"},
"mbti": {"$ref": "#/components/schemas/NullableString"},
"speechStyle": {"$ref": "#/components/schemas/NullableString"},
"speechPattern": {"$ref": "#/components/schemas/NullableString"},
"region": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"createdAt": {"type": ["string", "null"], "description": "Asia/Seoul yyyy-MM-dd HH:mm:ss"},
"updatedAt": {"type": ["string", "null"], "description": "Asia/Seoul yyyy-MM-dd HH:mm:ss"}
}
},
"CharacterListResponse": {
"type": "object",
"additionalProperties": false,
"required": ["totalCount", "content"],
"properties": {
"totalCount": {"type": "integer", "format": "int64"},
"content": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterListItem"}}
}
},
"CharacterDetailResponse": {
"type": "object",
"additionalProperties": false,
"required": ["id", "characterUUID", "name", "imageUrl", "description", "systemPrompt", "characterType", "age", "gender", "mbti", "speechPattern", "speechStyle", "appearance", "region", "isActive", "tags", "hobbies", "values", "goals", "relationships", "personalities", "backgrounds", "memories", "originalWork"],
"properties": {
"id": {"type": "integer", "format": "int64"},
"characterUUID": {"type": "string"},
"name": {"type": "string"},
"imageUrl": {"$ref": "#/components/schemas/NullableString"},
"description": {"type": "string"},
"systemPrompt": {"type": "string"},
"characterType": {"$ref": "#/components/schemas/CharacterType"},
"age": {"$ref": "#/components/schemas/NullableInt32"},
"gender": {"$ref": "#/components/schemas/NullableString"},
"mbti": {"$ref": "#/components/schemas/NullableString"},
"speechPattern": {"$ref": "#/components/schemas/NullableString"},
"speechStyle": {"$ref": "#/components/schemas/NullableString"},
"appearance": {"$ref": "#/components/schemas/NullableString"},
"region": {"type": "string"},
"isActive": {"type": "boolean"},
"tags": {"type": "array", "items": {"type": "string"}},
"hobbies": {"type": "array", "items": {"type": "string"}},
"values": {"type": "array", "items": {"type": "string"}},
"goals": {"type": "array", "items": {"type": "string"}},
"relationships": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterRelationship"}},
"personalities": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterPersonality"}},
"backgrounds": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterBackground"}},
"memories": {"type": "array", "items": {"$ref": "#/components/schemas/CharacterMemory"}},
"originalWork": {"oneOf": [{"$ref": "#/components/schemas/OriginalWorkBrief"}, {"type": "null"}]}
}
},
"CharacterListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/CharacterListResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"CharacterDetailApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/CharacterDetailResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"AudioContentTheme": {
"type": "object",
"additionalProperties": false,
"required": ["id", "theme", "image"],
"properties": {"id": {"type": "integer", "format": "int64"}, "theme": {"type": "string"}, "image": {"type": "string"}}
},
"AudioThemeListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"type": "array", "items": {"$ref": "#/components/schemas/AudioContentTheme"}}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"AudioContentCreateRequest": {
"type": "object",
"additionalProperties": false,
"required": ["title", "detail", "tags", "price"],
"properties": {
"title": {"type": "string"},
"detail": {"type": "string"},
"tags": {"type": "string"},
"price": {"type": "integer", "format": "int32"},
"purchaseOption": {"$ref": "#/components/schemas/PurchaseOption", "default": "BOTH"},
"limited": {"$ref": "#/components/schemas/NullableInt32"},
"timezone": {"type": "string", "default": "Asia/Seoul"},
"releaseDate": {"type": ["string", "null"], "description": "yyyy-MM-dd HH:mm"},
"themeId": {"type": "integer", "format": "int64", "default": 0, "description": "0은 binding 기본값이며 domain validation에서 유효하지 않다."},
"isAdult": {"type": "boolean", "default": false},
"isGeneratePreview": {"type": "boolean", "default": false},
"isOnlyRental": {"type": "boolean", "default": false},
"isPointAvailable": {"type": "boolean", "default": false},
"isCommentAvailable": {"type": "boolean", "default": false},
"isFullDetailVisible": {"type": "boolean", "default": true},
"previewStartTime": {"type": ["string", "null"], "description": "HH:mm:ss"},
"previewEndTime": {"type": ["string", "null"], "description": "HH:mm:ss"},
"languageCode": {"$ref": "#/components/schemas/NullableString"}
}
},
"AudioContentUpdateRequest": {
"type": "object",
"additionalProperties": false,
"properties": {
"title": {"$ref": "#/components/schemas/NullableString"},
"detail": {"$ref": "#/components/schemas/NullableString"},
"tags": {"$ref": "#/components/schemas/NullableString"},
"price": {"$ref": "#/components/schemas/NullableInt32"},
"isAdult": {"$ref": "#/components/schemas/NullableBoolean"},
"isActive": {"$ref": "#/components/schemas/NullableBoolean"},
"isPointAvailable": {"$ref": "#/components/schemas/NullableBoolean"},
"isCommentAvailable": {"$ref": "#/components/schemas/NullableBoolean"}
}
},
"AudioContentCreateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["contentFile", "coverImage", "request"],
"properties": {
"contentFile": {"$ref": "#/components/schemas/BinaryFile"},
"coverImage": {"$ref": "#/components/schemas/BinaryFile"},
"request": {"$ref": "#/components/schemas/AudioContentCreateRequest"}
}
},
"AudioContentUpdateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["request"],
"properties": {
"coverImage": {"$ref": "#/components/schemas/BinaryFile"},
"request": {"$ref": "#/components/schemas/AudioContentUpdateRequest"}
}
},
"AudioContentListItem": {
"type": "object",
"additionalProperties": false,
"required": ["audioContentId", "title", "detail", "coverImageUrl", "creatorNickname", "theme", "price", "totalContentCount", "remainingContentCount", "isAdult", "isPointAvailable", "isCommentAvailable", "remainingTime", "contentUrl", "date", "releaseDate", "tags"],
"properties": {
"audioContentId": {"type": "integer", "format": "int64"},
"title": {"type": "string"},
"detail": {"type": "string"},
"coverImageUrl": {"type": "string"},
"creatorNickname": {"type": "string"},
"theme": {"type": "string"},
"price": {"type": "integer", "format": "int32"},
"totalContentCount": {"$ref": "#/components/schemas/NullableInt32"},
"remainingContentCount": {"$ref": "#/components/schemas/NullableInt32"},
"isAdult": {"type": "boolean"},
"isPointAvailable": {"type": "boolean"},
"isCommentAvailable": {"type": "boolean"},
"remainingTime": {"type": "string"},
"contentUrl": {"type": "string", "description": "signed URL"},
"date": {"type": "string"},
"releaseDate": {"$ref": "#/components/schemas/NullableString"},
"tags": {"type": "string"}
}
},
"AudioContentListResponse": {
"type": "object",
"additionalProperties": false,
"required": ["totalCount", "items"],
"properties": {"totalCount": {"type": "integer", "format": "int32"}, "items": {"type": "array", "items": {"$ref": "#/components/schemas/AudioContentListItem"}}}
},
"AudioContentListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/AudioContentListResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"AudioContentCreateResponse": {
"type": "object",
"additionalProperties": false,
"required": ["contentId"],
"properties": {"contentId": {"type": "integer", "format": "int64"}}
},
"AudioContentCreateApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/AudioContentCreateResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"OtherContentResponse": {
"type": "object",
"additionalProperties": false,
"required": ["contentId", "title", "coverUrl"],
"properties": {"contentId": {"type": "integer", "format": "int64"}, "title": {"type": "string"}, "coverUrl": {"type": "string"}}
},
"AudioContentCreator": {
"type": "object",
"additionalProperties": false,
"required": ["creatorId", "nickname", "profileImageUrl", "isFollowing", "isFollow", "isNotify"],
"properties": {
"creatorId": {"type": "integer", "format": "int64"},
"nickname": {"type": "string"},
"profileImageUrl": {"type": "string"},
"isFollowing": {"type": "boolean"},
"isFollow": {"type": "boolean"},
"isNotify": {"type": "boolean"}
}
},
"ContentBuyer": {
"type": "object",
"additionalProperties": false,
"required": ["nickname", "profileImageUrl"],
"properties": {"nickname": {"type": "string"}, "profileImageUrl": {"type": "string"}}
},
"AudioContentComment": {
"type": "object",
"additionalProperties": false,
"required": ["id", "writerId", "nickname", "profileUrl", "comment", "languageCode", "isSecret", "donationCan", "date", "replyCount"],
"properties": {
"id": {"type": "integer", "format": "int64"},
"writerId": {"type": "integer", "format": "int64"},
"nickname": {"type": "string"},
"profileUrl": {"type": "string"},
"comment": {"type": "string"},
"languageCode": {"$ref": "#/components/schemas/NullableString"},
"isSecret": {"type": "boolean"},
"donationCan": {"type": "integer", "format": "int32"},
"date": {"type": "string"},
"replyCount": {"type": "integer", "format": "int32"}
}
},
"TranslatedContent": {
"type": "object",
"additionalProperties": false,
"required": ["title", "detail", "tags"],
"properties": {"title": {"$ref": "#/components/schemas/NullableString"}, "detail": {"$ref": "#/components/schemas/NullableString"}, "tags": {"$ref": "#/components/schemas/NullableString"}}
},
"AudioContentDetailResponse": {
"type": "object",
"additionalProperties": false,
"required": ["contentId", "title", "detail", "languageCode", "coverImageUrl", "contentUrl", "themeStr", "tag", "price", "duration", "releaseDate", "totalContentCount", "remainingContentCount", "orderSequence", "isActivePreview", "isAdult", "isMosaic", "isOnlyRental", "existOrdered", "purchaseOption", "orderType", "remainingTime", "creatorOtherContentList", "sameThemeOtherContentList", "isCommentAvailable", "isLike", "likeCount", "commentList", "commentCount", "isPin", "isAvailablePin", "creator", "previousContent", "nextContent", "buyerList", "isAvailableUsePoint", "translated"],
"properties": {
"contentId": {"type": "integer", "format": "int64"},
"title": {"type": "string"},
"detail": {"type": "string"},
"languageCode": {"$ref": "#/components/schemas/NullableString"},
"coverImageUrl": {"type": "string"},
"contentUrl": {"type": "string"},
"themeStr": {"type": "string"},
"tag": {"type": "string"},
"price": {"type": "integer", "format": "int32"},
"duration": {"type": "string"},
"releaseDate": {"$ref": "#/components/schemas/NullableString"},
"totalContentCount": {"$ref": "#/components/schemas/NullableInt32"},
"remainingContentCount": {"$ref": "#/components/schemas/NullableInt32"},
"orderSequence": {"$ref": "#/components/schemas/NullableInt32"},
"isActivePreview": {"type": "boolean"},
"isAdult": {"type": "boolean"},
"isMosaic": {"type": "boolean"},
"isOnlyRental": {"type": "boolean"},
"existOrdered": {"type": "boolean"},
"purchaseOption": {"$ref": "#/components/schemas/PurchaseOption"},
"orderType": {"oneOf": [{"$ref": "#/components/schemas/OrderType"}, {"type": "null"}]},
"remainingTime": {"$ref": "#/components/schemas/NullableString"},
"creatorOtherContentList": {"type": "array", "items": {"$ref": "#/components/schemas/OtherContentResponse"}},
"sameThemeOtherContentList": {"type": "array", "items": {"$ref": "#/components/schemas/OtherContentResponse"}},
"isCommentAvailable": {"type": "boolean"},
"isLike": {"type": "boolean"},
"likeCount": {"type": "integer", "format": "int32"},
"commentList": {"type": "array", "items": {"$ref": "#/components/schemas/AudioContentComment"}},
"commentCount": {"type": "integer", "format": "int32"},
"isPin": {"type": "boolean"},
"isAvailablePin": {"type": "boolean"},
"creator": {"$ref": "#/components/schemas/AudioContentCreator"},
"previousContent": {"oneOf": [{"$ref": "#/components/schemas/OtherContentResponse"}, {"type": "null"}]},
"nextContent": {"oneOf": [{"$ref": "#/components/schemas/OtherContentResponse"}, {"type": "null"}]},
"buyerList": {"type": "array", "items": {"$ref": "#/components/schemas/ContentBuyer"}},
"isAvailableUsePoint": {"type": "boolean"},
"translated": {"oneOf": [{"$ref": "#/components/schemas/TranslatedContent"}, {"type": "null"}]}
}
},
"AudioContentDetailApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/AudioContentDetailResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"SeriesCreateRequest": {
"type": "object",
"additionalProperties": false,
"required": ["title", "introduction", "publishedDaysOfWeek", "keyword"],
"properties": {
"title": {"type": "string"},
"introduction": {"type": "string"},
"publishedDaysOfWeek": {"type": "array", "uniqueItems": true, "items": {"$ref": "#/components/schemas/SeriesPublishedDaysOfWeek"}},
"keyword": {"type": "string"},
"genreId": {"type": "integer", "format": "int64", "default": 0, "description": "0은 binding 기본값이며 domain validation에서 유효하지 않다."},
"isAdult": {"type": "boolean", "default": false},
"writer": {"$ref": "#/components/schemas/NullableString"},
"studio": {"$ref": "#/components/schemas/NullableString"}
}
},
"SeriesUpdateRequest": {
"type": "object",
"additionalProperties": false,
"properties": {
"title": {"$ref": "#/components/schemas/NullableString"},
"introduction": {"$ref": "#/components/schemas/NullableString"},
"publishedDaysOfWeek": {"type": ["array", "null"], "uniqueItems": true, "items": {"$ref": "#/components/schemas/SeriesPublishedDaysOfWeek"}},
"genreId": {"$ref": "#/components/schemas/NullableInt64"},
"isAdult": {"$ref": "#/components/schemas/NullableBoolean"},
"state": {"oneOf": [{"$ref": "#/components/schemas/SeriesState"}, {"type": "null"}]},
"isActive": {"$ref": "#/components/schemas/NullableBoolean"},
"writer": {"$ref": "#/components/schemas/NullableString"},
"studio": {"$ref": "#/components/schemas/NullableString"}
}
},
"SeriesCreateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["image", "request"],
"properties": {"image": {"$ref": "#/components/schemas/BinaryFile"}, "request": {"$ref": "#/components/schemas/SeriesCreateRequest"}}
},
"SeriesUpdateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["request"],
"properties": {"image": {"$ref": "#/components/schemas/BinaryFile"}, "request": {"$ref": "#/components/schemas/SeriesUpdateRequest"}}
},
"SeriesListItem": {
"type": "object",
"additionalProperties": false,
"required": ["seriesId", "title", "introduction", "coverImageUrl", "publishedDaysOfWeek", "genreId", "isAdult", "state", "isActive", "writer", "studio"],
"properties": {
"seriesId": {"type": "integer", "format": "int64"},
"title": {"type": "string"},
"introduction": {"type": "string"},
"coverImageUrl": {"type": "string"},
"publishedDaysOfWeek": {"type": "array", "items": {"$ref": "#/components/schemas/SeriesPublishedDaysOfWeek"}},
"genreId": {"type": "integer", "format": "int64"},
"isAdult": {"type": "boolean"},
"state": {"$ref": "#/components/schemas/SeriesState"},
"isActive": {"type": "boolean"},
"writer": {"$ref": "#/components/schemas/NullableString"},
"studio": {"$ref": "#/components/schemas/NullableString"}
}
},
"SeriesListResponse": {
"type": "object",
"additionalProperties": false,
"required": ["totalCount", "items"],
"properties": {"totalCount": {"type": "integer", "format": "int32"}, "items": {"type": "array", "items": {"$ref": "#/components/schemas/SeriesListItem"}}}
},
"SeriesDetailResponse": {
"type": "object",
"additionalProperties": false,
"required": ["seriesId", "title", "introduction", "coverImageUrl", "publishedDaysOfWeek", "genre", "keywords", "isAdult", "state", "writer", "studio"],
"properties": {
"seriesId": {"type": "integer", "format": "int64"},
"title": {"type": "string"},
"introduction": {"type": "string"},
"coverImageUrl": {"type": "string"},
"publishedDaysOfWeek": {"type": "string", "description": "예: 월, 수"},
"genre": {"type": "string"},
"keywords": {"type": "string"},
"isAdult": {"type": "boolean"},
"state": {"type": "string", "description": "레거시 String 필드. 현재 관찰 값: 연재중, 휴재중, 완결"},
"writer": {"$ref": "#/components/schemas/NullableString"},
"studio": {"$ref": "#/components/schemas/NullableString"}
}
},
"SeriesContentListItem": {
"type": "object",
"additionalProperties": false,
"required": ["contentId", "coverImage", "title", "isAdult"],
"properties": {"contentId": {"type": "integer", "format": "int64"}, "coverImage": {"type": "string"}, "title": {"type": "string"}, "isAdult": {"type": "boolean"}}
},
"SeriesContentListResponse": {
"type": "object",
"additionalProperties": false,
"required": ["totalCount", "items"],
"properties": {"totalCount": {"type": "integer", "format": "int32"}, "items": {"type": "array", "items": {"$ref": "#/components/schemas/SeriesContentListItem"}}}
},
"SeriesContentSearchItem": {
"type": "object",
"additionalProperties": false,
"required": ["contentId", "title", "coverImage"],
"properties": {"contentId": {"type": "integer", "format": "int64"}, "title": {"type": "string"}, "coverImage": {"type": "string"}}
},
"SeriesContentAddRequest": {
"type": "object",
"additionalProperties": false,
"required": ["contentIdList"],
"properties": {"contentIdList": {"type": "array", "items": {"type": "integer", "format": "int64"}}}
},
"SeriesOrderUpdateRequest": {
"type": "object",
"additionalProperties": false,
"required": ["ids"],
"properties": {"ids": {"type": "array", "items": {"type": "integer", "format": "int64"}}}
},
"SeriesListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/SeriesListResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"SeriesDetailApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/SeriesDetailResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"SeriesContentListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/SeriesContentListResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"SeriesContentSearchApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"type": "array", "items": {"$ref": "#/components/schemas/SeriesContentSearchItem"}}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"CommunityPostComment": {
"type": "object",
"additionalProperties": false,
"required": ["id", "writerId", "nickname", "profileUrl", "comment", "isSecret", "date", "replyCount"],
"properties": {
"id": {"type": "integer", "format": "int64"},
"writerId": {"type": "integer", "format": "int64"},
"nickname": {"type": "string"},
"profileUrl": {"type": "string"},
"comment": {"type": "string"},
"isSecret": {"type": "boolean"},
"date": {"type": "string"},
"replyCount": {"type": "integer", "format": "int32"}
}
},
"CommunityPostListItem": {
"type": "object",
"additionalProperties": false,
"required": ["postId", "creatorId", "creatorNickname", "creatorProfileUrl", "imageUrl", "audioUrl", "content", "price", "date", "dateUtc", "isCommentAvailable", "isAdult", "isFixed", "isLike", "existOrdered", "likeCount", "commentCount", "firstComment"],
"properties": {
"postId": {"type": "integer", "format": "int64"},
"creatorId": {"type": "integer", "format": "int64"},
"creatorNickname": {"type": "string"},
"creatorProfileUrl": {"type": "string"},
"imageUrl": {"$ref": "#/components/schemas/NullableString"},
"audioUrl": {"$ref": "#/components/schemas/NullableString"},
"content": {"type": "string"},
"price": {"type": "integer", "format": "int32"},
"date": {"type": "string"},
"dateUtc": {"type": "string"},
"isCommentAvailable": {"type": "boolean"},
"isAdult": {"type": "boolean"},
"isFixed": {"type": "boolean"},
"isLike": {"type": "boolean"},
"existOrdered": {"type": "boolean"},
"likeCount": {"type": "integer", "format": "int32"},
"commentCount": {"type": "integer", "format": "int32"},
"firstComment": {"oneOf": [{"$ref": "#/components/schemas/CommunityPostComment"}, {"type": "null"}]}
}
},
"CommunityPostCreateRequest": {
"type": "object",
"additionalProperties": false,
"required": ["content", "isCommentAvailable", "isAdult"],
"properties": {
"content": {"type": "string"},
"isCommentAvailable": {"type": "boolean"},
"isAdult": {"type": "boolean"},
"price": {"type": "integer", "format": "int32", "default": 0}
}
},
"CommunityPostUpdateRequest": {
"type": "object",
"additionalProperties": false,
"properties": {
"content": {"$ref": "#/components/schemas/NullableString"},
"isCommentAvailable": {"$ref": "#/components/schemas/NullableBoolean"},
"isAdult": {"$ref": "#/components/schemas/NullableBoolean"},
"isActive": {"$ref": "#/components/schemas/NullableBoolean"},
"isFixed": {"type": "boolean", "description": "레거시 UpdateCommunityPostFixedRequest에서 ID만 path로 이동한 필드"}
}
},
"CommunityPostCreateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["request"],
"properties": {
"audioFile": {"$ref": "#/components/schemas/BinaryFile"},
"postImage": {"$ref": "#/components/schemas/BinaryFile"},
"request": {"$ref": "#/components/schemas/CommunityPostCreateRequest"}
}
},
"CommunityPostUpdateMultipart": {
"type": "object",
"additionalProperties": false,
"required": ["request"],
"properties": {
"postImage": {"$ref": "#/components/schemas/BinaryFile"},
"request": {"$ref": "#/components/schemas/CommunityPostUpdateRequest"}
}
},
"CommunityPostListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"type": "array", "items": {"$ref": "#/components/schemas/CommunityPostListItem"}}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"FanTalkCreatorReply": {
"type": "object",
"additionalProperties": false,
"required": ["fanTalkId", "writerId", "writerNickname", "writerProfileImageUrl", "content", "createdAtUtc"],
"properties": {
"fanTalkId": {"type": "integer", "format": "int64"},
"writerId": {"type": "integer", "format": "int64"},
"writerNickname": {"type": "string"},
"writerProfileImageUrl": {"type": "string"},
"content": {"type": "string"},
"createdAtUtc": {"type": "string", "format": "date-time"}
}
},
"FanTalkListItem": {
"type": "object",
"additionalProperties": false,
"required": ["fanTalkId", "writerId", "writerNickname", "writerProfileImageUrl", "content", "createdAtUtc", "creatorReplies"],
"properties": {
"fanTalkId": {"type": "integer", "format": "int64"},
"writerId": {"type": "integer", "format": "int64"},
"writerNickname": {"type": "string"},
"writerProfileImageUrl": {"type": "string"},
"content": {"type": "string"},
"createdAtUtc": {"type": "string", "format": "date-time"},
"creatorReplies": {"type": "array", "items": {"$ref": "#/components/schemas/FanTalkCreatorReply"}}
}
},
"FanTalkListResponse": {
"type": "object",
"additionalProperties": false,
"required": ["fanTalkCount", "fanTalks", "page", "size", "hasNext"],
"properties": {
"fanTalkCount": {"type": "integer", "format": "int32"},
"fanTalks": {"type": "array", "items": {"$ref": "#/components/schemas/FanTalkListItem"}},
"page": {"type": "integer", "format": "int32"},
"size": {"type": "integer", "format": "int32"},
"hasNext": {"type": "boolean"}
}
},
"FanTalkReplyCreateRequest": {
"type": "object",
"additionalProperties": false,
"required": ["content"],
"properties": {"content": {"type": "string"}}
},
"FanTalkReplyResponse": {
"type": "object",
"additionalProperties": false,
"required": ["fanTalkId", "replyId", "creatorMemberId", "content", "createdAtUtc"],
"properties": {
"fanTalkId": {"type": "integer", "format": "int64"},
"replyId": {"type": "integer", "format": "int64"},
"creatorMemberId": {"type": "integer", "format": "int64"},
"content": {"type": "string"},
"createdAtUtc": {"type": "string", "format": "date-time"}
}
},
"FanTalkListApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/FanTalkListResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]},
"FanTalkReplyApiResponse": {"allOf": [{"$ref": "#/components/schemas/ApiSuccessBase"}, {"type": "object", "required": ["message", "data", "errorProperty"], "properties": {"message": {"type": ["string", "null"]}, "data": {"$ref": "#/components/schemas/FanTalkReplyResponse"}, "errorProperty": {"type": ["string", "null"], "const": null}}}]}
}
}
}