docs(creator): 채널 홈 Phase 3 기록을 갱신한다
This commit is contained in:
@@ -80,6 +80,7 @@
|
||||
#### Requirements
|
||||
- 크리에이터 기본 정보에는 다음 값을 포함한다.
|
||||
- `creatorId`
|
||||
- `characterId`
|
||||
- `nickname`
|
||||
- `profileImageUrl`
|
||||
- `followerCount`
|
||||
@@ -88,6 +89,7 @@
|
||||
- `isFollow`
|
||||
- `isNotify`
|
||||
- `followerCount`는 활성 팔로우 수 기준으로 계산한다.
|
||||
- `characterId`는 해당 `Member`와 연결된 활성 `ChatCharacter` ID를 내려주고, 활성 캐릭터가 없으면 `null`로 내려준다.
|
||||
- `isAiChatAvailable`은 해당 `Member`와 연결된 활성 `ChatCharacter`가 있는지로 판단한다. 구현 후보는 `ChatCharacterRepository.existsByCreatorMemberId(creatorId)`를 기준으로 한다.
|
||||
- `isDmAvailable`은 `member.memberKind != MemberKind.AI_CHARACTER`이면 `true`, `AI_CHARACTER`이면 `false`로 판단한다.
|
||||
- `isFollow`, `isNotify`는 인증 회원의 기존 `CreatorFollowing` 상태를 기준으로 내려준다.
|
||||
@@ -103,6 +105,9 @@
|
||||
- 현재 진행 중인 라이브는 기존 라이브 도메인의 `LiveRoomStatus.NOW` 의미와 동일하게 판단한다.
|
||||
- 응답에는 라이브 ID, 제목, 커버 이미지, 시작 시각 UTC, 유료 여부 또는 가격, 성인 여부, 예약 여부가 아닌 현재 라이브 여부를 포함한다.
|
||||
- 조회자의 성인 콘텐츠 노출 정책과 차단 정책을 반영한다.
|
||||
- 현재 라이브 노출은 기존 라이브 목록 정책과 동일하게 성별 제한(`LiveRoom.genderRestriction`)과 크리에이터 입장 제한(`LiveRoom.isAvailableJoinCreator`)을 반영한다.
|
||||
- 성별 제한 판단에 사용하는 조회자 성별은 기존 라이브 목록과 동일하게 `Auth.gender`가 있으면 이를 우선하고, 없으면 `Member.gender`를 사용하는 effective gender다.
|
||||
- `LiveRoomStatus`는 라이브가 현재 진행 중인지/예약인지 구분하는 기준일 뿐, 라이브 노출 정책 자체로 사용하지 않는다.
|
||||
|
||||
#### Edge Cases
|
||||
- 현재 진행 중인 라이브가 없으면 `currentLive`는 `null`로 내려준다.
|
||||
@@ -112,6 +117,7 @@
|
||||
#### Requirements
|
||||
- Figma 홈 상단에 노출되는 신규 오디오 콘텐츠 영역에 사용할 최신 공개 오디오 콘텐츠를 내려준다.
|
||||
- 예약 공개 전 콘텐츠는 신규 오디오 콘텐츠로 노출하지 않는다.
|
||||
- 공개 또는 예약 공개 오디오 콘텐츠는 항상 `releaseDate != null`인 데이터로 본다. `releaseDate == null`인 오디오 콘텐츠는 삭제/미공개 데이터로 보고 홈 오디오 조회에서 제외한다.
|
||||
- 응답 필드는 홈 오디오 콘텐츠 카드와 동일하게 콘텐츠 ID, 제목, duration, 커버 이미지, 가격, 포인트 사용 가능 여부, 성인 여부를 포함한다.
|
||||
- 정렬은 공개 시각 최신순이다.
|
||||
|
||||
@@ -122,13 +128,14 @@
|
||||
|
||||
#### Requirements
|
||||
- 채널 후원은 최신순 최대 8개를 내려준다.
|
||||
- 기존 `ChannelDonationService.getChannelDonationList` 응답 필드 의미를 유지한다.
|
||||
- 조회 범위는 기존 채널 후원 목록과 동일하게 이번 달 기준으로 한다.
|
||||
- 응답에는 후원 ID, 회원 ID, 닉네임, 프로필 이미지, 후원 can, 비밀 후원 여부, 메시지, 생성 시각 UTC를 포함한다.
|
||||
- 비밀 후원 표시 정책은 기존 채널 후원 목록 정책을 따른다.
|
||||
- 응답에는 후원자 닉네임, 후원자 프로필 이미지, 후원한 can 수, 후원 시 추가한 메시지, 생성 시각 UTC를 포함한다.
|
||||
- `message`는 기본 문구(`"%s캔을 비밀후원하셨습니다."`, `"%s캔을 후원하셨습니다."`)를 조합하지 않고, 후원자가 입력한 추가 메시지(`ChannelDonationMessage.additionalMessage`)만 내려준다.
|
||||
- 비밀 후원 노출/숨김 정책은 기존 채널 후원 목록 정책을 따른다.
|
||||
|
||||
#### Edge Cases
|
||||
- 후원이 없으면 빈 배열을 내려준다.
|
||||
- 후원자가 추가 메시지를 입력하지 않았으면 `message`는 빈 문자열로 내려준다.
|
||||
|
||||
### Feature F. 공지
|
||||
|
||||
@@ -136,12 +143,14 @@
|
||||
- 커뮤니티 게시글 중 `isFixed == true`인 글을 홈의 공지 섹션으로 처리한다.
|
||||
- 응답에는 게시글 ID, 크리에이터 ID, 크리에이터 닉네임, 크리에이터 프로필 이미지, 이미지 URL, 오디오 URL, 본문, 가격, 작성 시각 UTC, 구매 여부, 좋아요 수, 댓글 수를 포함한다.
|
||||
- 홈 응답에 포함하는 게시글 요약 필드는 기존 크리에이터 커뮤니티 전체보기 게시글 리스트와 같은 의미를 유지한다.
|
||||
- 정렬은 고정 시각 최신순을 우선하고, 고정 시각이 없으면 작성 시각 최신순으로 한다.
|
||||
- 유료 공지는 조회자가 이미 구매했다면 크리에이터가 이후 삭제해 `isActive == false`가 되어도 기존 커뮤니티 전체보기 의미와 동일하게 구매자에게 조회된다.
|
||||
- `isFixed == true`인 게시글은 항상 `fixedAt != null`인 데이터로 본다.
|
||||
- 정렬은 고정 시각 최신순으로 한다.
|
||||
- 공지 최대 노출 개수는 기존 고정 글 제한 정책에 맞춰 최대 3개로 한다.
|
||||
|
||||
#### Edge Cases
|
||||
- 고정 게시글이 없으면 빈 배열을 내려준다.
|
||||
- 성인 커뮤니티 글은 조회자의 성인 콘텐츠 노출 정책을 따른다.
|
||||
- 성인 커뮤니티 글은 조회자의 성인 콘텐츠 노출 정책을 따른다. 조회자가 해당 글을 구매했더라도 성인 콘텐츠 노출 정책이 false이면 노출하지 않는다.
|
||||
|
||||
### Feature G. 스케줄
|
||||
|
||||
@@ -149,7 +158,7 @@
|
||||
- 예약 라이브와 예약 업로드 오디오 콘텐츠를 하나의 스케줄 배열로 내려준다.
|
||||
- 스케줄은 오늘 날짜와 가장 근접한 예약 항목 최대 3개를 내려준다.
|
||||
- 예약 라이브는 `LiveRoomStatus.RESERVATION` 의미와 동일하게, `LiveRoom.beginDateTime > now`이고 활성 상태인 라이브를 대상으로 한다.
|
||||
- 예약 업로드 오디오 콘텐츠는 `AudioContent.releaseDate > now`인 활성 또는 예약 상태 콘텐츠를 대상으로 한다.
|
||||
- 예약 업로드 오디오 콘텐츠는 `AudioContent.duration != null`, `AudioContent.releaseDate != null`, `AudioContent.releaseDate > now`인 콘텐츠를 대상으로 한다. `AudioContent.isActive` 값은 예약 스케줄 후보 판정에 사용하지 않는다.
|
||||
- 응답에는 예약 날짜/시간 UTC, 제목, 타입, 대상 ID를 포함한다.
|
||||
- 타입 값은 기존 추천 페이지의 `RecommendedActivityType` 코드 체계를 사용한다.
|
||||
- 구현 시 `RecommendedActivityType`은 `CreatorActivityType`으로 이름을 변경하고 공용 패키지로 이동한다.
|
||||
@@ -160,6 +169,8 @@
|
||||
- 정렬은 예약 날짜/시간 오름차순이다. 같은 예약 시간이면 라이브를 오디오보다 먼저 표시한다.
|
||||
- 성인 예약 라이브/오디오는 조회자의 성인 노출 정책이 false이면 노출하지 않는다.
|
||||
- 성인 노출 정책은 DB 조회 조건에 먼저 반영하고, 라이브/오디오 스케줄 후보를 service에서 합친 뒤에도 최종 응답 전 한 번 더 보정한다.
|
||||
- 예약 라이브 스케줄은 기존 예약 라이브 목록 정책과 동일하게 성별 제한(`LiveRoom.genderRestriction`)과 크리에이터 입장 제한(`LiveRoom.isAvailableJoinCreator`)을 반영한다.
|
||||
- 예약 라이브 성별 제한 판단에 사용하는 조회자 성별은 기존 라이브 목록과 동일하게 `Auth.gender`가 있으면 이를 우선하고, 없으면 `Member.gender`를 사용하는 effective gender다.
|
||||
- service 최종 보정에 필요한 성인 여부는 내부 스케줄 후보 record/domain model에만 포함하고, 공개 스케줄 응답 필드에는 포함하지 않는다.
|
||||
|
||||
#### Edge Cases
|
||||
@@ -171,6 +182,7 @@
|
||||
- 최근 업로드된 오디오 콘텐츠를 최대 9개 내려준다.
|
||||
- 신규 오디오 콘텐츠 영역과 오디오 목록 영역의 첫 번째 항목이 겹치지 않도록, 오디오 목록에서는 Feature D의 `latestAudioContent`로 내려간 가장 최신 콘텐츠를 제외한다.
|
||||
- 예약 업로드 전 콘텐츠는 포함하지 않는다.
|
||||
- `releaseDate == null`인 오디오 콘텐츠는 목록, 최신 콘텐츠, 첫 콘텐츠 판정에서 제외한다.
|
||||
- 응답에는 다음 값을 포함한다.
|
||||
- 오디오 콘텐츠 ID
|
||||
- 제목
|
||||
@@ -195,7 +207,9 @@
|
||||
#### Requirements
|
||||
- 시리즈는 최대 8개를 내려준다.
|
||||
- 정렬은 각 시리즈에 속한 공개 콘텐츠의 최신 공개 시각 내림차순이다.
|
||||
- 응답에는 기존 시리즈 카드 구성에 필요한 시리즈 ID, 제목, 커버 이미지, 연재 요일, 완결 여부, 콘텐츠 개수, 신규/인기 표시 정보를 포함한다.
|
||||
- 응답에는 기존 시리즈 카드 구성에 필요한 시리즈 ID, 제목, 커버 이미지, 콘텐츠 개수, 신규 표시, 오리지널 시리즈 여부를 포함한다.
|
||||
- 시리즈 응답에는 `publishedDaysOfWeek`, `isComplete`, `isPopular`를 포함하지 않는다.
|
||||
- 시리즈의 공개 콘텐츠 집계와 정렬에서도 `releaseDate == null`인 오디오 콘텐츠는 제외한다.
|
||||
- 성인 콘텐츠 노출 정책과 조회자 콘텐츠 타입 선호 정책은 기존 `ContentSeriesService.getSeriesList` 정책을 따른다.
|
||||
|
||||
#### Edge Cases
|
||||
@@ -209,9 +223,11 @@
|
||||
- 최대 3개를 최신순으로 내려준다.
|
||||
- 응답에는 게시글 ID, 크리에이터 ID, 크리에이터 닉네임, 크리에이터 프로필 이미지, 이미지 URL, 오디오 URL, 본문, 가격, 작성 시각 UTC, 구매 여부, 좋아요 수, 댓글 수를 포함한다.
|
||||
- 홈 응답에 포함하는 게시글 요약 필드는 기존 크리에이터 커뮤니티 전체보기 게시글 리스트와 같은 의미를 유지한다.
|
||||
- 유료 커뮤니티 게시글은 조회자가 이미 구매했다면 크리에이터가 이후 삭제해 `isActive == false`가 되어도 기존 커뮤니티 전체보기 의미와 동일하게 구매자에게 조회된다.
|
||||
|
||||
#### Edge Cases
|
||||
- 고정 공지는 커뮤니티 섹션에 중복 노출하지 않는다.
|
||||
- 성인 커뮤니티 글은 조회자의 성인 콘텐츠 노출 정책을 따른다. 조회자가 해당 글을 구매했더라도 성인 콘텐츠 노출 정책이 false이면 노출하지 않는다.
|
||||
- 커뮤니티 게시글이 없으면 빈 배열을 내려준다.
|
||||
|
||||
### Feature K. 팬 Talk
|
||||
@@ -245,7 +261,11 @@
|
||||
- 라이브 누적 참여자
|
||||
- 업로드한 오디오 콘텐츠 개수
|
||||
- 시리즈 개수
|
||||
- 데뷔일은 첫 라이브 시작 시각과 첫 공개 오디오 콘텐츠 공개 시각 중 빠른 값으로 계산한다.
|
||||
- 데뷔일은 첫 라이브 시작 시각과 첫 오디오 데뷔 후보 시각 중 빠른 값으로 계산한다.
|
||||
- 오디오 데뷔 후보는 오디오 업로드 순서(`createdAt`, 동일 시각이면 `id`) 기준 첫 3개만 본다.
|
||||
- 첫 번째 또는 두 번째 오디오가 삭제되어 `releaseDate == null`이면 다음 업로드 오디오의 공개 시각을 후보로 본다.
|
||||
- 세 번째 오디오가 삭제되어 `releaseDate == null`이면 네 번째 오디오로 넘어가지 않고 세 번째 오디오의 `createdAt`을 후보로 본다.
|
||||
- 세 번째 오디오까지 공개 후보가 없고 세 번째 삭제 오디오도 없으면 오디오 데뷔 후보는 없다.
|
||||
- 라이브 진행 횟수, 라이브 누적 진행 시간, 라이브 누적 참여자는 기존 `ExplorerQueryRepository.getLiveCount`, `getLiveTime`, `getLiveContributorCount`의 의미를 기준으로 한다.
|
||||
- 업로드한 오디오 콘텐츠 개수는 공개된 오디오 콘텐츠만 포함하고 예약 업로드는 반영하지 않는다.
|
||||
- 시리즈 개수는 크리에이터의 활성 시리즈 개수를 기준으로 한다.
|
||||
|
||||
Reference in New Issue
Block a user