|
2 | 2 | import uuid |
3 | 3 | from typing import Annotated |
4 | 4 |
|
5 | | -from fastapi import APIRouter, Depends, Request |
| 5 | +from fastapi import APIRouter, Depends, HTTPException, Request |
6 | 6 | from fastapi.responses import StreamingResponse |
7 | 7 | from sqlalchemy.orm import Session |
8 | 8 |
|
|
11 | 11 | from app.exceptions import MindLogError |
12 | 12 | from app.limiter import limiter |
13 | 13 | from app.schemas.session import MessageCreateRequest |
14 | | -from app.services import chat_service |
| 14 | +from app.services import chat_service, session_service |
15 | 15 | from app.utils.sse import format_sse_done, format_sse_error, stream_sse_events |
16 | 16 |
|
17 | 17 | logger = logging.getLogger(__name__) |
@@ -82,7 +82,31 @@ async def generate(): |
82 | 82 | finally: |
83 | 83 | yield format_sse_done() |
84 | 84 |
|
85 | | - return StreamingResponse(generate(), media_type="text/event-stream") |
| 85 | + return StreamingResponse( |
| 86 | + generate(), |
| 87 | + media_type="text/event-stream", |
| 88 | + headers={ |
| 89 | + "Cache-Control": "no-cache", |
| 90 | + "X-Accel-Buffering": "no", |
| 91 | + "Connection": "keep-alive", |
| 92 | + }, |
| 93 | + ) |
| 94 | + |
| 95 | + |
| 96 | +@router.delete("/{session_id}", status_code=204) |
| 97 | +async def delete_session( |
| 98 | + session_id: uuid.UUID, |
| 99 | + db: DbSession, |
| 100 | +): |
| 101 | + """ |
| 102 | + 세션 삭제 시 AI 소유 데이터 정리. |
| 103 | +
|
| 104 | + Java BE가 counseling_sessions 및 cascade 테이블 삭제 완료 후 호출한다. |
| 105 | + AI 서비스는 embeddings 테이블의 해당 session_id 레코드를 삭제한다. |
| 106 | + """ |
| 107 | + deleted = session_service.delete_session_data(session_id, db) |
| 108 | + if not deleted: |
| 109 | + raise HTTPException(status_code=404, detail="해당 세션의 AI 데이터를 찾을 수 없습니다.") |
86 | 110 |
|
87 | 111 |
|
88 | 112 | @router.post("/{session_id}/finalize") |
@@ -126,4 +150,12 @@ async def generate(): |
126 | 150 | finally: |
127 | 151 | yield format_sse_done() |
128 | 152 |
|
129 | | - return StreamingResponse(generate(), media_type="text/event-stream") |
| 153 | + return StreamingResponse( |
| 154 | + generate(), |
| 155 | + media_type="text/event-stream", |
| 156 | + headers={ |
| 157 | + "Cache-Control": "no-cache", |
| 158 | + "X-Accel-Buffering": "no", |
| 159 | + "Connection": "keep-alive", |
| 160 | + }, |
| 161 | + ) |
0 commit comments