Commit Graph
100 Commits
Author SHA1 Message Date
klaus a538bb766d feat(home): 홈 추천 콘텐츠 조회 및 전용 엔드포인트 추가
- HomeService: getRecommendContentList 추가 및 fetchData에 recommendContentList 주입
- HomeController: GET /api/home/recommend-contents 엔드포인트 추가
- 추천 로직은 랜덤 20개, 성인/타입/차단 필터 반영
2025-11-11 14:21:37 +09:00
klaus 26c09de7c9 feat(admin-can): 관리자 캔 충전 API를 다중 회원 일괄 충전으로 확장
- AdminCanChargeRequest: memberId → memberIds(List<Long>)로 변경
- AdminCanService.charge: memberIds 선조회 후 다건 충전 로직 추가
- 잘못된/비어있는 회원번호 검증 및 트랜잭션 롤백으로 정합성 보장

배경: 관리자 일괄 충전 요구사항 반영으로 여러 회원에게 동일 수량의 캔을 한 번에 충전할 수 있도록 개선. 중복 ID는 제거하여 중복 충전을 방지하고, 하나라도 유효하지 않으면 전체 롤백되도록 처리하여 데이터 정합성 확보.
2025-11-10 15:15:10 +09:00
klaus 82bd93c1ae feat(admin-member): 닉네임 검색으로 회원 id, nickname 반환 API 추가 2025-11-10 14:39:44 +09:00
klaus e24e8372a8 feat(home): 포인트 사용 가능 콘텐츠 리스트 추가 2025-11-10 13:58:17 +09:00
klaus eab7dc4521 feat(home-free-content): 최신 콘텐츠 조회 함수 getLatestContentByTheme에 orderbyRandom flag를 추가하여 랜덤으로 정렬한 후 데이터를 가져올 수 있도록 수정 2025-11-10 12:14:24 +09:00
klaus 5ca666c7fa feat(home-latest-content): 최신 콘텐츠 조회시 정렬 조건 변경
- 기존: id 내림차순
- 변경: 오픈일 내림차순
2025-11-07 20:48:08 +09:00
klaus 8fb3bd578f feat(live-room-heart): like-heart API의 request에 heartCount를 추가하여 왕하트(100개)를 쓸 수 있도록 수정 2025-11-03 11:30:42 +09:00
klaus 01fad8d93c feat(change message): 비비드 넥스트 -> 주식회사 소다라이브 2025-11-03 11:24:48 +09:00
klaus a05ada5df0 feat(can-use-status): PAYVERSE로 충전한 캔을 사용한 내역도 포함되도록 수정 2025-10-22 23:13:24 +09:00
klaus 34480385d3 UseCalculate에 PAYVERSE로 충전한 캔 로그 데이터를 쌓도록 수정 2025-10-22 22:22:03 +09:00
klaus fd68ed87a3 fix(can-use): PAYVERSE로 충전한 캔이 사용되지 않는 버그 수정 2025-10-22 21:34:39 +09:00
klaus 779fc5c5a5 feat(chat): 채팅권 구매 가격과 채팅횟수 변경
- 기존: 30캔, 채팅 40개
- 변경: 10캔, 채팅 12개
2025-10-22 16:40:54 +09:00
klaus 08ebb311fb feat(home): 인기 캐릭터 추가 2025-10-20 14:47:13 +09:00
klaus 12cdd25be7 feat(creator-profile-live): LiveRoomResponse에 utc 기반의 라이브 시작 시간 추가 2025-10-16 15:05:23 +09:00
klaus 59700493eb feat(explorer): 크리에이터 프로필에 최신/총/소장 콘텐츠 정보 추가
- ExplorerService.getCreatorProfile에서 다음 정보 계산/반환
  - 최신 오디오 콘텐츠 1개(`latestContent`)
  - 전체 콘텐츠 수(`totalContentCount`)
  - 조회 유저의 소장 콘텐츠 수(`ownedContentCount`)
- ExplorerQueryRepository.getOwnedContentCount 추가
  - 활성 KEEP 또는 유효한 RENTAL 주문 기준으로 distinct 카운트
- GetCreatorProfileResponse 스키마 확장
  - `latestContent`, `totalContentCount`, `ownedContentCount` 필드 추가
- AudioContentService.getLatestCreatorAudioContent 사용해 최신 콘텐츠 조회 로직 보강
  - 성인 콘텐츠 노출 여부 및 구매/대여 상태 반영
- OrderRepository의 주문 타입 조회 로직을 활용해 보유/대여 상태 표시

API 응답 필드가 추가되어 프로필 화면 구성 정보를 보강합니다. (호환성 유지)
2025-10-14 15:35:15 +09:00
klaus 88c3a84972 perf(admin-charge): 통화별 합계를 DB 그룹 집계로 이관하여 전송량/CPU 감소 2025-10-11 05:41:14 +09:00
klaus db0d3a6ef3 refactor(admin-charge): QGetChargeStatusQueryDto의 currency가 null이면 KRW로 설정되도록 coalesce("KRW") 적용 2025-10-11 05:07:21 +09:00
klaus 3d29d27441 refactor(admin-charge): QGetChargeStatusQueryDto의 currency가 null이 되지 않도록 coalesce("") 사용 2025-10-11 04:52:58 +09:00
klaus b5f66603bd refactor(admin-charge): QGetChargeStatusQueryDto의 currency가 null이 되지 않도록 coalesce("") 사용 2025-10-11 04:39:15 +09:00
klaus 976eeaa443 refactor(admin-charge): GetChargeStatusDetailResponse의 amount 타입을 Int에서 BigDecimal로 변경
- 충전 금액 계산을 좀 더 명확하게 하기 위해서 변경
2025-10-11 03:54:47 +09:00
klaus 25d1d813f1 refactor(admin-charge): HQL 파싱 에러 해결 위해 RIGHT → substring/length 치환 2025-10-11 03:37:46 +09:00
klaus 778f0c3ba2 fix(admin/charge): 통화별 리스트와 합계 행 추가 및 전체 합계 로직 수정
- 기존 로직은 통화 구분 없이 전체 합계를 계산·표시하여 통화가 혼재된 데이터에서 오해의 소지가 있었음.
- 관리 화면 요구사항: 통화(currency)별 합계를 명확히 제공.
2025-10-11 03:12:10 +09:00
klaus 38c50a4f8a fix(admin/charge): 통화별 리스트와 합계 행 추가 및 전체 합계 로직 수정
- 기존 로직은 통화 구분 없이 전체 합계를 계산·표시하여 통화가 혼재된 데이터에서 오해의 소지가 있었음.
- 관리 화면 요구사항: 통화(currency)별 합계를 명확히 제공.
2025-10-11 02:31:15 +09:00
klaus c497f321bb fix(admin-charge-status-detail): pgChargeAmount와 can의 가격을 가져와서 사용하는 로직을 제거하고 payment에 기록된 가격으로 계산하도록 수정 2025-10-10 23:32:36 +09:00
klaus 84c0768c8b fix(admin-charge-status): pgChargeAmount와 can의 가격을 가져와서 사용하는 로직을 제거하고 payment에 기록된 가격으로 계산하도록 수정 2025-10-10 22:31:36 +09:00
klaus efb8d8115f fix(verify-hecto): 데이터 검증시 가격비교 제거 2025-10-10 18:49:54 +09:00
klaus 41183b4648 fix(can-list): 국가별로 통화가 표시되도록 수정 2025-10-10 14:32:12 +09:00
klaus 36e20bf0d1 fix(payverse-webhook): orderId 비교 추가
- orderId와 chargeId 비교 로직 추가
2025-10-03 02:17:48 +09:00
klaus 0308e9ad83 fix(payverse): productName 비교 로직 제거
- productName에 +가 있는 경우 저장된 데이터와 검증을 위한 데이터가 다르게 나오기 때문에 비교 불가능
2025-10-03 02:10:30 +09:00
klaus 06c0374f16 사용하지 않는 print 제거 2025-10-03 01:56:55 +09:00
klaus c5bc610e2f webhook 호출 IP 확인을 위해 print 추가 2025-10-03 01:48:19 +09:00
klaus a86a24ca34 사용하지 않는 print 제거 2025-10-03 01:46:52 +09:00
klaus cb2e3ea581 fix(payverse-wehook): 한국 원화일 때와 USD일 때 mid 값이 달라야 하는데 성공 여부 비교시 원화 mid로 고정하여 비교하던 로직 수정 2025-10-03 01:29:59 +09:00
klaus 42eaf1d5e3 fix(payverse-verify): 결제 성공 여부 판단 로직 수정
- processingAmount 대신 requestAmount와 can 가격 비교
- productName, customerId 비교 추가
2025-10-03 01:25:27 +09:00
klaus 02ef706fc2 temp: 디버깅을 위해 print 추가 2025-10-03 00:57:50 +09:00
klaus 085b217abb fix(can): 이전 버전의 호환성을 위해 기존의 int price를 유지하도록 수정 2025-10-03 00:02:47 +09:00
klaus 0866e0972a 값 확인을 위해 추가했던 println 제거 2025-10-02 22:31:23 +09:00
klaus 4b13265737 fix(charge): payverseVerify 결제금액 비교로직 수정
- BigDecimal끼리 비교하는데 casting 로직이 추가되어 문제가 생기던 버그 수정
2025-10-02 22:23:06 +09:00
klaus 79cd2b8123 debug(charge): 해외결제 DEBUG를 위해 print 임시 추가 2025-10-02 20:40:34 +09:00
klaus 8cc9641bbf feat(charge): payloadJson의 amount
- 소수점 아래 불필요한 0을 제거
2025-10-02 20:29:49 +09:00
klaus 32935aed88 feat(charge): payloadJson의 amount
- 소수점 아래 불필요한 0을 제거
2025-10-02 19:59:04 +09:00
klaus c72adbfc4b temp(charge): 캔 리스트
- 해외 충전 테스트를 위해 전체 캔 리스트 표시
2025-10-02 19:56:23 +09:00
klaus bc378cc619 temp(charge): 캔 리스트
- 해외 충전 테스트를 위해 전체 캔 리스트 표시
2025-10-02 19:03:42 +09:00
klaus 6327a5d2bf feat(charge): 캔 충전시 통화(KRW, USD)별로 분기 처리 2025-10-02 18:59:52 +09:00
klaus 2ab2a04748 feat(can): 캔 응답 - String 형태 가격 필드 추가 2025-10-02 15:07:57 +09:00
klaus fb0a9e98a1 사용하지 않는 print 제거 2025-10-02 12:20:25 +09:00
klaus e45fe1bf10 feat: 일반 유저용 캔 리스트 조회 API 추가, GeoCountryFilter(GeoCountry.OTHER, GeoCountry.KR 구분용) 추가 2025-10-01 22:29:39 +09:00
klaus 3d852a8356 feat: 관리자용 캔 리스트 조회 API 추가 2025-10-01 22:16:44 +09:00
klaus b244944f41 feat: 캔 엔티티 currency - length 3으로 고정하여 CHAR(3)에 대응되도록 수정 2025-10-01 21:21:57 +09:00
klaus 3c7ba669e2 feat: Payment, AdTrackingHistory 엔티티 price - Decimal(10, 4)에 대응되도록 Column 추가 2025-10-01 21:08:35 +09:00
klaus 81e7e7129c feat: 캔 엔티티 currency - length 3으로 고정하여 CHAR(3)에 대응되도록 수정 2025-10-01 21:05:51 +09:00
klaus d7ad110b9e feat: 캔 등록/조회 - currency 추가 2025-10-01 20:55:52 +09:00
klaus 0c17ea2dcd fix: 캔 가격, Payment의 price 타입 Int, Double -> BigDecimal로 변경 2025-10-01 20:37:53 +09:00
klaus 78ff13a654 temp: 캔 가격 타입 Int -> Double로 변경 2025-10-01 16:07:34 +09:00
klaus 863c285049 fix: 불필요한 print 제거 2025-09-30 18:32:12 +09:00
klaus a3d74c0b57 fix: Payverse Webhook 엔드포인트에서 실제 클라이언트 IP를 가져올 수 있도록 수정 2025-09-30 18:22:46 +09:00
klaus 9016a72046 fix: ResponseStatusException이 ApiResponse로 래핑되지 않도록 수정
- 기본 에러 JSON 반환 유지
2025-09-30 18:16:13 +09:00
klaus 3c32614d1c temp(Exception): ResponseStatusException은 ApiResponse로 래핑하지 않고 그대로 전달 2025-09-30 17:59:55 +09:00
klaus 51988471cf temp(payverse): 호출되는 INBOUND_IP 확인하기 위해 출력 2025-09-30 17:55:31 +09:00
klaus 8990bd0722 fix(payverse): webhook 엔드포인트는 로그인 하지 않더라도 실행되도록 수정 2025-09-30 17:37:15 +09:00
klaus aab2417976 fix(payverse): print 제거 2025-09-30 17:22:39 +09:00
klaus 1bd6f8da4e fix(payverse): PVKR 카드 코드면 method를 "카드"로 저장 2025-09-30 17:02:02 +09:00
klaus 22bd1bf042 fix(payverse): 결제 payload에 customerId 길이 30자로 제한
- customerId를 sha1 기반 30자 이내로 생성하도록 변경하여 스펙 준수
- 불필요한 billkeyReq 제거
2025-09-26 16:51:54 +09:00
klaus d536a65fb4 fix(charge): payverse pg payload
- requestAmount의 값을 BigDecimal로 처리
2025-09-26 16:23:11 +09:00
klaus 03149a637d feat(charge): payverse pg - webhook API 추가 2025-09-25 21:18:45 +09:00
klaus bc6c05b3ea feat(charge): payverse pg - 충전/검증 API 추가 2025-09-25 20:37:39 +09:00
klaus 59ca353b25 feat(calculate-ratio): 정산 비율 삭제 URL 수정 2025-09-22 14:17:18 +09:00
klaus 6bc65ec412 feat(calculate-ratio): 정산 비율 조회 - 결과에 memberId 추가 2025-09-22 14:01:28 +09:00
klaus 97e95b51ab feat(calculate-ratio): 정산 비율 수정/삭제(소프트 삭제)와 업서트, 쿼리 보강
- deletedAt 기반 소프트 삭제 도입 및 restore/updateValues 추가
- 생성 시 기존(삭제 포함) 레코드 복구 후 값 갱신(업서트)
- /admin/calculate/ratio/update, /delete 엔드포인트 추가
- 정산 쿼리 조인에 deletedAt.isNull 적용하여 삭제 데이터 배제
- 목록/카운트 조회에서도 삭제 데이터 제외
2025-09-22 13:36:36 +09:00
klaus a6dfa81ba6 사용하지 않는 '지정 원작에 속한 활성 캐릭터 목록 조회 API' 제거 2025-09-18 22:49:35 +09:00
klaus dad517a953 feat(admin-character-list): 캐릭터 검색결과
- 캐릭터 목록과 동일한 내용으로 변경
2025-09-18 19:58:12 +09:00
klaus eb2d093b02 feat(admin-character-list): 캐릭터 검색에 페이징 추가 2025-09-18 19:29:34 +09:00
klaus 67186bba55 feat(original): 원작
- 원천 원작, 원천 원작 링크, 글/그림 작가, 제작사, 태그 추가
2025-09-18 18:04:59 +09:00
klaus edeecad2ce feat(original-app): 원작 리스트
- 페이징 추가
2025-09-15 16:00:09 +09:00
klaus 387f5388d9 feat(original-app): 원작 상세, 캐릭터 리스트
- 원작 상세에 캐릭터 20개 조회
- 지정 원작에 속한 활성 캐릭터 목록 조회 API 추가
2025-09-15 15:32:20 +09:00
klaus adcaa0a5fd fix(original): 캐릭터 수정
- 원작 ID가 0이 들어오면 캐릭터의 원작을 null로 처리한다.
2025-09-15 06:43:40 +09:00
klaus 47b2c1cb93 fix(original): 캐릭터 수정
- 원작 ID가 0이 들어오면 캐릭터의 원작을 null로 처리한다.
2025-09-15 06:17:55 +09:00
klaus 7f3589dcfb fix(original): 인기 캐릭터 조회
- 캐시 키 변경
2025-09-15 05:20:46 +09:00
klaus b134c28c10 feat(original): 관리자 캐릭터 상세 조회
- 원작 데이터 추가
2025-09-15 05:18:01 +09:00
klaus 41c8d0367d feat(original): 원작별 캐릭터 조회 API 추가 2025-09-15 00:31:14 +09:00
klaus 3b148d549e feat(original-app): 앱용 원작 목록/상세 API 및 조회 로직 추가
- 공개 목록 API: 미인증 사용자는 19금 비노출, 활성 캐릭터가 1개 이상 연결된 원작만 반환, 총개수+리스트 제공
- 상세 API: 로그인/본인인증 필수, 원작 상세+소속 활성 캐릭터 리스트 반환
2025-09-14 23:27:58 +09:00
klaus b6c96af8a2 feat(original): 원작 도메인과 캐릭터를 연결하기 위해 각각 검색 API 추가 2025-09-14 23:00:33 +09:00
klaus 4904625488 feat(original): 원작 도메인 추가, 관리자 CRUD/연결 API, 소프트 삭제, 서비스 계층 정비
- 원작 엔티티/레포지토리/관리자 API 구축(이미지 S3 업로드 포함)
- 캐릭터-원작 연관관계 및 관리자에서 배정/해제 API 제공
- 소프트 삭제(`isDeleted`) 도입 및 조회/수정/배정 로직에서 삭제 항목 필터링
- 컨트롤러-레포지토리 직접 접근 제거, `AdminOriginalWorkService`로 DB 접근 캡슐화
- 캐릭터 등록/수정에서 `originalWorkId` 지원 및 외부 API 업데이트 조건 분리
2025-09-14 22:33:30 +09:00
klaus 0574f4f629 feat(cache): 인기 캐릭터 조회에 윈도우 기반 동적 캐시 키 적용
- ChatCharacterService.getPopularCharacters()에 @Cacheable 추가
- 키: popular-chat-character:<windowStartEpoch>:<limit>
- 윈도우(매일 20:00 UTC) 전환 시 자동으로 신규 키 사용 → 전일 순위 캐시와 분리 보장

Why: 동일 윈도우 내 반복 요청의 DB 부하를 줄이고, 경계 전환 시 자연스러운 캐시 갱신을 보장.
2025-09-14 17:43:53 +09:00
klaus 4adc3e127c fix(popular): 일일 인기 캐릭터 집계 윈도우를 전날 완료 구간으로 고정
- UTC 20:00 경계 직후에도 [전날 20:00, 당일 20:00) 범위 사용으로 일일 순위 정확화
- RankingWindowCalculator.now(): lastBoundary 기반 [start, endExclusive) 계산
2025-09-14 17:28:33 +09:00
klaus dd0a1c2293 fix(chat-character): 인기 캐릭터
- 캐시 제거
2025-09-14 16:46:56 +09:00
klaus a07407417c fix(admin-chat-calculate): 캐릭터 정산 API
- ONLY_FULL_GROUP_BY 대응
- c2.image_path 집계식 적용
2025-09-13 05:01:52 +09:00
klaus e33e3b43b7 fix(admin-chat-calculate): 캐릭터 정산 API
- ONLY_FULL_GROUP_BY 대응
2025-09-13 04:33:01 +09:00
klaus 634bf759ca feat(admin-chat-calculate): 캐릭터 정산 API에 채팅 횟수 구매(CHAT_QUOTA_PURCHASE) 추가 2025-09-13 03:54:24 +09:00
klaus 0ed29c6097 feat(admin-chat-calculate): 캐릭터 정산 API에 imagePath를 imageHost를 포함한 url로 변경 추가 2025-09-13 03:20:26 +09:00
klaus b752434fbb feat(admin-chat-calculate): 캐릭터 정산 API에 totalCount 추가 2025-09-13 03:06:55 +09:00
klaus eec63cc7b2 feat(admin-chat-calculate): 캐릭터별 정산 조회 API 추가 2025-09-13 02:00:30 +09:00
klaus 3dc9dd1f35 feat(character): 최근 등록된 캐릭터 전체보기 API
- 반환 값에 전체 개수 추가
2025-09-12 19:00:45 +09:00
klaus 88e287067b feat(character): 최근 등록된 캐릭터 전체보기 API 추가 2025-09-12 18:37:25 +09:00
klaus 27a3f450ef fix(character): 인기 캐릭터 응답을 DTO로 변경하여 jackson 직렬화 오류 해결
- ChatCharacterService.getPopularCharacters 반환을 List<ChatCharacter> → List<Character> DTO로 변경
- 캐시 대상도 DTO로 전환(@Cacheable 유지, 동적 키/고정 TTL 그대로 사용)
- 컨트롤러에서 불필요한 매핑 제거(서비스가 DTO로 반환)
- Character DTO 직렬화 안정성 확보(@JsonProperty 추가)
- 이미지 URL 생성 로직을 서비스로 이동하고 imageHost(@Value) 주입해 구성
2025-09-11 18:53:27 +09:00
klaus 58a46a09c3 fix(character): SpEL 정적 호출 오류로 @JvmStatic 추가 2025-09-11 18:21:13 +09:00
klaus 83a1316a64 feat(character): UTC 20시 경계 기반 인기 캐릭터 집계 구현 및 캐시 적용
- 집계 기준을 "채팅방 전체 메시지 수"로 변경하여 캐릭터별 인기 순위 산정
- Querydsl `PopularCharacterQuery` 추가: chat_message → chat_participant(CHARACTER) → chat_character 조인
- 시간 경계: UTC 20:00 기준 [windowStart, nextBoundary) 구간 사용(배타적 종료 `<`)
- `ChatCharacterService.getPopularCharacters`에 @Cacheable 적용
  - cacheNames: `popularCharacters_24h`
  - key: `RankingWindowCalculator.now('popular-chat-character').cacheKey`
  - 상위 20개 기본, `loadCharactersInOrder`로 랭킹 순서 보존
- `RankingWindowCalculator`: 경계별 동적 키 생성(`popular-chat-character:{windowStartEpoch}`) 및 윈도우 계산
- `RedisConfig`: 24시간 TTL 캐시 `popularCharacters_24h` 추가(문자열/JSON 직렬화 지정)
- `ChatCharacterController`: 메인 API에 인기 캐릭터 섹션 연동

WHY
- 20시(UTC) 경계 변경 시 키가 달라져 첫 조회에서 자동 재집계/재캐싱
- 방 전체 참여도를 반영해 보다 직관적인 인기 지표 제공
- 캐시(24h TTL)로 DB 부하 최소화, 경계 전환 후 자연 무효화
2025-09-11 18:06:40 +09:00
klaus f05f146c89 fix(chat-quota): 유료 차감 후 무료·유료 동시 0일 때 next_recharge_at 설정 누락 수정
- 문제: 유료 잔여가 있을 때 유료 우선 차감 경로에서 `next_recharge_at` 설정 분기가 없어,
  무료/유료가 동시에 0이 되는 경우 다음 무료 충전 시점이 노출되지 않음
- 수정: `ChatRoomQuotaService.consumeOneForSend`의 유료 차감 분기에
  `remainingPaid==0 && remainingFree==0 && nextRechargeAt==null` 조건에서
  `now + 6h`로 `next_recharge_at`을 설정하도록 로직 추가
- 참고: 무료 차감 경로의 `next_recharge_at` 설정 및 입장 시 lazy refill 동작은 기존과 동일
2025-09-11 12:35:16 +09:00
klaus 3782062f4a fix(chat-room): 입장/전송 next 계산 보완 및 채팅 가능 시 next=null 처리
enter:
roomPaid==0 && roomFree>0 && global<=0 → 글로벌 next
roomPaid==0 && roomFree==0 → (global<=0) ? max(roomNext, globalNext) : roomNext
채팅 가능(totalRemaining>0)인 경우 next=null 반환(유료>0 포함)
send:
totalRemaining==0 && global<=0 → max(roomNext, globalNext)
채팅 가능(totalRemaining>0)인 경우 next=null 반환
2025-09-10 13:31:27 +09:00
klaus fd83abb46c feat(chat): 글로벌/방 쿼터 정책 개편, 결제/조회/차단/이관 로직 반영
글로벌: 무료 40, UTC 20:00 lazy refill(유료 제거)
방: 무료 10, 무료 0 순간 now+6h, 경과 시 lazy refill(무료=10, next=null)
전송: 유료 우선, 무료 사용 시 글로벌/룸 동시 차감, 조건 불충족 예외
API: 방 쿼터 조회/구매 추가(구매 시 30캔, UseCan에 roomId:characterId 기록)
next 계산: enter/send에서 경계 케이스 처리(max(room, global))
대화 초기화: 유료 쿼터 새 방으로 이관
2025-09-09 22:42:14 +09:00