Skip to content

FEAT: AI 발신(예약 통화) — 예약 조회/수정 API + 예약 시각 자동 발신#66

Merged
oofrog merged 18 commits into
developfrom
feat/#63
Jul 26, 2026
Merged

FEAT: AI 발신(예약 통화) — 예약 조회/수정 API + 예약 시각 자동 발신#66
oofrog merged 18 commits into
developfrom
feat/#63

Conversation

@oofrog

@oofrog oofrog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • AI가 예약된 시각에 사용자에게 전화를 거는 흐름을 구현했다. (예약 → 스케줄러 발신 → 수락/거절/부재중)
  • 통화 상태에 PENDING(받았지만 연결 전)을 추가하고, 소켓 없이 방치되는 통화를 걷는 스위퍼를 붙였다.

Related Issue

Describe your code

  • 작업 내용 (What I Did)

AI 발신 흐름

  • CallReservation 엔티티 + 상태(SCHEDULED/FIRED/CANCELED)
  • 예약 시각 폴링 → 자동 발신 CallReservationWorker / CallReservationService.fire
    • 서버가 죽어 있던 동안 밀린 예약이 재기동 직후 한꺼번에 울리지 않게 grace window(5분) 적용, 지난 예약은 발신 없이 종결
  • 착신 조회 GET /calls/incoming (RINGING 최신 1건)
  • 착신 수락 PATCH /calls/{callId}/accept (wsTicket 발급, dial과 대칭) / 거절 PATCH /calls/{callId}/reject

상태 머신

  • PENDING 신설: RINGING(안 받음) → PENDING(받았지만 WS 연결 전) → IN_PROGRESS
    • 받기를 누른 사용자가 부재중으로 오판되지 않게 상태를 분리했다
  • 부재중/미접속 스위퍼 CallTimeoutWorker: RINGINGMISSED(60초) / PENDINGCANCELED(60초)
  • 통화 종료 PATCH /calls/{callId}/end (사용자가 통화 중 끊는 경로, 상태 마감 + 소켓 정리)

예약 조회/수정

  • GET /call-reservations (오늘 하루 대기 중 예약, 가까운 시각순)
  • PATCH /call-reservations/{reservationId} (예약 시각 변경)

예약 생성

  • CallReservationService.reserve(relationshipId, scheduledAt) — API 없이 서비스 메서드만
  • CallCallReservation 연결 (어느 예약이 울린 통화인지 추적)
  • 스크린샷/결과 (Optional)

  • 논의사항/질문 (To Reviewers)

reserve()는 아직 호출부가 없습니다. 예약을 만드는 코드가 아예 없어서 SQL로 넣어 테스트하던 상태라, 생성 로직만 미리 만들어 뒀습니다. 예약 생성 흐름(대화 중 약속 / AI 서버 판단 등)이 정해지면 그쪽에서 이 메서드를 호출해 주세요.

  • reserve(relationshipId, scheduledAt)reservationId 반환.
  • 관계 유효성(살아 있는 메인 캐릭터) · 지난 시각 · 중복 검증은 서버가 다 봅니다. 미리 검사할 필요 없습니다.

범위 밖

  • FCM 착신 푸시: 실제 기기 벨은 안 울리고 RINGING 통화만 생성됩니다. 수락/거절은 accept·reject API로 테스트했습니다.
  • 통화권(callTicketBalance) 차감, aiSummary·audioUrl 생성

Checklist

  • 리뷰어 등록

@oofrog oofrog self-assigned this Jul 25, 2026
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ab33958b-1b1c-4186-b18b-b394d9908f18

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#63

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

💡 Improvements

  • CallReservationService의 매직 상수 DAILY_WINDOW_END_HOUR = 5를 외부 애플리케이션 속성으로 이동합니다.
  • DRY 원칙 준수를 위해 isMain() 및 삭제되지 않은 문자 확인 로직을 Relationship 도메인 모델 내부에 직접 캡슐화합니다.
  • CallReservationWorkerCallTimeoutWorker 간에 공유되는 중복된 독립 배치 실행 및 로깅 로직을 추출합니다.

@seokMini-2 seokMini-2 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다. 리뷰 확인해주세용

@hyeonky0w0 hyeonky0w0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다! 확인 부탁드립니다.

@github-actions

Copy link
Copy Markdown

💡 개선 사항

  • CallReservationService.reserve에서 isCallable 헬퍼 메서드를 재사용하여 중복된 관계 유효성 검사 로직을 제거하세요.
  • 스케줄러 작업자의 하드코딩된 BATCH_SIZE = 50을 애플리케이션 설정 속성으로 분리하세요.
  • Call 엔티티의 상태 전환 가드 절을 통합된 private 유효성 검사 메서드로 합치세요.

@github-actions

Copy link
Copy Markdown

💡 개선 사항

  • 하드코딩된 시간 범위 상수(예: 일별 예약 종료 시간)를 application.yml 설정 속성으로 추출합니다.
  • WS 핸들러 전반에 걸쳐 문자열 리터럴 중복을 방지하기 위해 인라인 JSON 제어 메시지 문자열을 열거형 속성으로 통합합니다.
  • 백그라운드 워커 전반에 걸쳐 배치 크기 상수(BATCH_SIZE = 50)를 공유 스케줄러 구성으로 표준화합니다.

@oofrog
oofrog merged commit 44717bb into develop Jul 26, 2026
2 checks passed
@oofrog
oofrog deleted the feat/#63 branch July 26, 2026 13:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ [FEAT] AI 발신(예약 통화) — 예약 조회/수정 API + 예약 시각 자동 발신

4 participants