generated from ttipo/project-base
feat(backend): AI 코스 생성 API 골격과 생성 기록 테이블 추가 #13
Reference in New Issue
Block a user
Delete Branch "feat/course-generation-api"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
무엇을 · 왜
AI 코스 생성의 API·생성 기록 테이블·에러 코드를 세운다. 구현 순서의 4단계(설계 §14)다.
AI 자리는 가짜 클라이언트로 채웠다. 키 없이도 접수부터 결과까지 생성 흐름을 끝까지 돌려 볼 수 있다. 앞 단계에서 만든 순수 로직(2b 시간표·검증·고치기)과 날씨·공휴일(3단계)을 실제 DB 후보에 연결한다. 실제 모델 호출과 프롬프트는 5단계에서 이 자리를 바꾼다.
API —
backend/src/modules/course-generation/모든 요청에
X-Device-Id(UUID) 헤더가 필요하다. 서버는 SHA-256 으로 바꿔서만 저장한다.GET /course-generations/quotaPOST /course-conditionsPOST /course-generationsGET /course-generations/:idPOST /course-generations/:id/cancellationPUT /course-generations/:id/rating다른 기기의 생성은 없는 것처럼
RES_001로 답한다.생성 흐름
stage)searchingfilteringAI_003으로 끝낸다planningfinishing결과의 시각은 ISO UTC 다(API 규약). 장소마다
facts.hoursOnDate(그날 영업시간)를 채운다. 코드가 남긴 알림은planNotices에 담는다.횟수·비용 보호
counted)cost_usd합이 상한을 넘으면AI_002로 막고 error 로그를 남긴다AI_004. 같은 기기의 동시 요청은 advisory lock 으로 하나씩 검사한다AI_DAILY_LIMIT_GUEST·AI_DAILY_LIMIT_MEMBER·AI_DAILY_BUDGET_USD·AI_TIMEOUT_MS. 없으면 기본값(2·5·3달러·30초)을 쓰고, 숫자가 아니면 기동하지 않는다실행기(프로세스 안)
queued로 기다린다AI_002로 실패하고, 취소하면 AbortController 로 AI 호출을 끊는다queued·running은 모두 실패로 바꾼다(서버가 한 대라 모두 지난 프로세스의 것이다)running인 작업을 정리한다서버를 늘리면 Redis 큐(BullMQ)로 옮긴다(설계 §3.1).
첫 CI 에서 고친 것 (
7ed3411)빈 DB 로 도는 CI 에서 e2e 가 멈췄다.
app.init()을 마이그레이션보다 먼저 불렀다. 그래서 실행기의 기동 정리가 아직 없는ai_course_generation테이블을 읽다 실패했다.afterAll에서app.close()까지 가지 못했다. 1분마다 도는 정리 작업이 남아 Jest 가 끝나지 않았다.고친 것:
SYS_001로그만 남긴다.app.init()전에 돌린다.afterAll은 정리가 실패해도app.close()를 부른다.저장하는 것
ai_course_generation테이블: 설계 §6.1 열에failure_notices·started_at·repairs를 더했다shared/utils/mask-contact.ts)함께 바꾼 것
shared/utils/opening-hours.ts:hoursOn(parsed, date)를 더했다. 결과의hoursOnDate에 쓴다place.sql.ts: 행사 최대 기간 조건을sqlEventWithinMaxSpan()으로 뺐다. 축제 목록과 코스 후보가 같은 조건을 쓴다docs/design/ai-course.md)에 구현하며 정한 것을 적었다: §3.1 실행기, §3.7 결과 형식, §4, §6.1, §11, §14확인 방법
AI_004)와 취소AI_001), 후보 없음(AI_003), AI 장애(AI_002), 잘못된 조건(VAL_001)e2e-cg-시험 장소를 만들고 끝나면 지운다. 날씨는 막아 두어 키를 쓰지 않는다영향 범위
체크리스트
course-generation.constants.ts에 모았다AI_001~AI_004·VAL_001·RES_001npm run sync:error-codes실행 후 생성 파일까지 커밋🤖 Generated with Claude Code