3c7ba669e2
feat: Payment, AdTrackingHistory 엔티티 price - Decimal(10, 4)에 대응되도록 Column 추가
2025-10-01 21:08:35 +09:00
81e7e7129c
feat: 캔 엔티티 currency - length 3으로 고정하여 CHAR(3)에 대응되도록 수정
2025-10-01 21:05:51 +09:00
d7ad110b9e
feat: 캔 등록/조회 - currency 추가
2025-10-01 20:55:52 +09:00
0c17ea2dcd
fix: 캔 가격, Payment의 price 타입 Int, Double -> BigDecimal로 변경
2025-10-01 20:37:53 +09:00
78ff13a654
temp: 캔 가격 타입 Int -> Double로 변경
2025-10-01 16:07:34 +09:00
863c285049
fix: 불필요한 print 제거
2025-09-30 18:32:12 +09:00
a3d74c0b57
fix: Payverse Webhook 엔드포인트에서 실제 클라이언트 IP를 가져올 수 있도록 수정
2025-09-30 18:22:46 +09:00
9016a72046
fix: ResponseStatusException이 ApiResponse로 래핑되지 않도록 수정
...
- 기본 에러 JSON 반환 유지
2025-09-30 18:16:13 +09:00
3c32614d1c
temp(Exception): ResponseStatusException은 ApiResponse로 래핑하지 않고 그대로 전달
2025-09-30 17:59:55 +09:00
51988471cf
temp(payverse): 호출되는 INBOUND_IP 확인하기 위해 출력
2025-09-30 17:55:31 +09:00
8990bd0722
fix(payverse): webhook 엔드포인트는 로그인 하지 않더라도 실행되도록 수정
2025-09-30 17:37:15 +09:00
aab2417976
fix(payverse): print 제거
2025-09-30 17:22:39 +09:00
1bd6f8da4e
fix(payverse): PVKR 카드 코드면 method를 "카드"로 저장
2025-09-30 17:02:02 +09:00
22bd1bf042
fix(payverse): 결제 payload에 customerId 길이 30자로 제한
...
- customerId를 sha1 기반 30자 이내로 생성하도록 변경하여 스펙 준수
- 불필요한 billkeyReq 제거
2025-09-26 16:51:54 +09:00
d536a65fb4
fix(charge): payverse pg payload
...
- requestAmount의 값을 BigDecimal로 처리
2025-09-26 16:23:11 +09:00
03149a637d
feat(charge): payverse pg - webhook API 추가
2025-09-25 21:18:45 +09:00
bc6c05b3ea
feat(charge): payverse pg - 충전/검증 API 추가
2025-09-25 20:37:39 +09:00
59ca353b25
feat(calculate-ratio): 정산 비율 삭제 URL 수정
2025-09-22 14:17:18 +09:00
6bc65ec412
feat(calculate-ratio): 정산 비율 조회 - 결과에 memberId 추가
2025-09-22 14:01:28 +09:00
97e95b51ab
feat(calculate-ratio): 정산 비율 수정/삭제(소프트 삭제)와 업서트, 쿼리 보강
...
- deletedAt 기반 소프트 삭제 도입 및 restore/updateValues 추가
- 생성 시 기존(삭제 포함) 레코드 복구 후 값 갱신(업서트)
- /admin/calculate/ratio/update, /delete 엔드포인트 추가
- 정산 쿼리 조인에 deletedAt.isNull 적용하여 삭제 데이터 배제
- 목록/카운트 조회에서도 삭제 데이터 제외
2025-09-22 13:36:36 +09:00
a6dfa81ba6
사용하지 않는 '지정 원작에 속한 활성 캐릭터 목록 조회 API' 제거
2025-09-18 22:49:35 +09:00
dad517a953
feat(admin-character-list): 캐릭터 검색결과
...
- 캐릭터 목록과 동일한 내용으로 변경
2025-09-18 19:58:12 +09:00
eb2d093b02
feat(admin-character-list): 캐릭터 검색에 페이징 추가
2025-09-18 19:29:34 +09:00
67186bba55
feat(original): 원작
...
- 원천 원작, 원천 원작 링크, 글/그림 작가, 제작사, 태그 추가
2025-09-18 18:04:59 +09:00
edeecad2ce
feat(original-app): 원작 리스트
...
- 페이징 추가
2025-09-15 16:00:09 +09:00
387f5388d9
feat(original-app): 원작 상세, 캐릭터 리스트
...
- 원작 상세에 캐릭터 20개 조회
- 지정 원작에 속한 활성 캐릭터 목록 조회 API 추가
2025-09-15 15:32:20 +09:00
adcaa0a5fd
fix(original): 캐릭터 수정
...
- 원작 ID가 0이 들어오면 캐릭터의 원작을 null로 처리한다.
2025-09-15 06:43:40 +09:00
47b2c1cb93
fix(original): 캐릭터 수정
...
- 원작 ID가 0이 들어오면 캐릭터의 원작을 null로 처리한다.
2025-09-15 06:17:55 +09:00
7f3589dcfb
fix(original): 인기 캐릭터 조회
...
- 캐시 키 변경
2025-09-15 05:20:46 +09:00
b134c28c10
feat(original): 관리자 캐릭터 상세 조회
...
- 원작 데이터 추가
2025-09-15 05:18:01 +09:00
41c8d0367d
feat(original): 원작별 캐릭터 조회 API 추가
2025-09-15 00:31:14 +09:00
3b148d549e
feat(original-app): 앱용 원작 목록/상세 API 및 조회 로직 추가
...
- 공개 목록 API: 미인증 사용자는 19금 비노출, 활성 캐릭터가 1개 이상 연결된 원작만 반환, 총개수+리스트 제공
- 상세 API: 로그인/본인인증 필수, 원작 상세+소속 활성 캐릭터 리스트 반환
2025-09-14 23:27:58 +09:00
b6c96af8a2
feat(original): 원작 도메인과 캐릭터를 연결하기 위해 각각 검색 API 추가
2025-09-14 23:00:33 +09:00
4904625488
feat(original): 원작 도메인 추가, 관리자 CRUD/연결 API, 소프트 삭제, 서비스 계층 정비
...
- 원작 엔티티/레포지토리/관리자 API 구축(이미지 S3 업로드 포함)
- 캐릭터-원작 연관관계 및 관리자에서 배정/해제 API 제공
- 소프트 삭제(`isDeleted`) 도입 및 조회/수정/배정 로직에서 삭제 항목 필터링
- 컨트롤러-레포지토리 직접 접근 제거, `AdminOriginalWorkService`로 DB 접근 캡슐화
- 캐릭터 등록/수정에서 `originalWorkId` 지원 및 외부 API 업데이트 조건 분리
2025-09-14 22:33:30 +09:00
0574f4f629
feat(cache): 인기 캐릭터 조회에 윈도우 기반 동적 캐시 키 적용
...
- ChatCharacterService.getPopularCharacters()에 @Cacheable 추가
- 키: popular-chat-character:<windowStartEpoch>:<limit>
- 윈도우(매일 20:00 UTC) 전환 시 자동으로 신규 키 사용 → 전일 순위 캐시와 분리 보장
Why: 동일 윈도우 내 반복 요청의 DB 부하를 줄이고, 경계 전환 시 자연스러운 캐시 갱신을 보장.
2025-09-14 17:43:53 +09:00
4adc3e127c
fix(popular): 일일 인기 캐릭터 집계 윈도우를 전날 완료 구간으로 고정
...
- UTC 20:00 경계 직후에도 [전날 20:00, 당일 20:00) 범위 사용으로 일일 순위 정확화
- RankingWindowCalculator.now(): lastBoundary 기반 [start, endExclusive) 계산
2025-09-14 17:28:33 +09:00
dd0a1c2293
fix(chat-character): 인기 캐릭터
...
- 캐시 제거
2025-09-14 16:46:56 +09:00
a07407417c
fix(admin-chat-calculate): 캐릭터 정산 API
...
- ONLY_FULL_GROUP_BY 대응
- c2.image_path 집계식 적용
2025-09-13 05:01:52 +09:00
e33e3b43b7
fix(admin-chat-calculate): 캐릭터 정산 API
...
- ONLY_FULL_GROUP_BY 대응
2025-09-13 04:33:01 +09:00
634bf759ca
feat(admin-chat-calculate): 캐릭터 정산 API에 채팅 횟수 구매(CHAT_QUOTA_PURCHASE) 추가
2025-09-13 03:54:24 +09:00
0ed29c6097
feat(admin-chat-calculate): 캐릭터 정산 API에 imagePath를 imageHost를 포함한 url로 변경 추가
2025-09-13 03:20:26 +09:00
b752434fbb
feat(admin-chat-calculate): 캐릭터 정산 API에 totalCount 추가
2025-09-13 03:06:55 +09:00
eec63cc7b2
feat(admin-chat-calculate): 캐릭터별 정산 조회 API 추가
2025-09-13 02:00:30 +09:00
3dc9dd1f35
feat(character): 최근 등록된 캐릭터 전체보기 API
...
- 반환 값에 전체 개수 추가
2025-09-12 19:00:45 +09:00
88e287067b
feat(character): 최근 등록된 캐릭터 전체보기 API 추가
2025-09-12 18:37:25 +09:00
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
58a46a09c3
fix(character): SpEL 정적 호출 오류로 @JvmStatic 추가
2025-09-11 18:21:13 +09:00
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
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
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