Add persistent multi-user sessions and Docker deployment

This commit is contained in:
burnintuna 2026-07-31 02:39:00 +09:00
parent 51a6e845d1
commit 104577c826
24 changed files with 2094 additions and 468 deletions

View file

@ -17,6 +17,27 @@ class TokenResponse(BaseModel):
class UserInfo(BaseModel):
user_id: str
is_admin: bool = False
class CreateUserRequest(BaseModel):
id: str = Field(min_length=1, max_length=50, pattern=r"^[A-Za-z0-9_.-]+$")
password: str = Field(min_length=8, max_length=200)
is_admin: bool = False
class UpdateUserRequest(BaseModel):
password: str | None = Field(default=None, min_length=8, max_length=200)
is_admin: bool | None = None
is_active: bool | None = None
class UserSummary(BaseModel):
id: str
is_admin: bool
is_active: bool
created_at: str
updated_at: str
# ── LLM Config ───────────────────────────────────────
@ -42,7 +63,7 @@ class Phase1Result(BaseModel):
proper_nouns: list[ProperNoun] # 추출된 고유명사 리스트
summary: str # 내용 요약
style: str # 문체 분석 결과
warnings: list[str] = [] # JSON 복구/폴백 등 품질 관련 알림
warnings: list[str] = Field(default_factory=list)
class TranslationChunk(BaseModel):
@ -69,11 +90,12 @@ class TranslationSession(BaseModel):
model_phase3: str = "" # Phase 3 LLM 모델 alias
model_phase4: str = "" # Phase 4 LLM 모델 alias
phase1_result: Phase1Result | None = None # 초벌 번역 결과
phase1_chunks: list[TranslationChunk] = [] # 장문 분할 시 원문/초벌 번역 쌍
phase2_proper_nouns: list[ProperNoun] = [] # Phase 2에서 최종 확정된 고유명사
phase1_chunks: list[TranslationChunk] = Field(default_factory=list)
phase2_proper_nouns: list[ProperNoun] = Field(default_factory=list)
phase2_style: str = "" # Phase 2에서 최종 확정된 문체
phase2_confirmed: bool = False
phase3_result: str = "" # 재번역 결과
phase3_chunks: list[str] = [] # 장문 분할 재번역 결과
phase3_chunks: list[str] = Field(default_factory=list)
phase4_result: str = "" # 마무리 다듬기 결과
progress: PhaseProgress | None = None # 장기 작업 진행 상태
@ -88,6 +110,7 @@ class CreateSessionRequest(BaseModel):
model_phase2: str = ""
model_phase3: str = ""
model_phase4: str = ""
title: str | None = Field(default=None, max_length=120)
class PhaseUpdateRequest(BaseModel):
@ -100,6 +123,8 @@ class PhaseUpdateRequest(BaseModel):
model_phase2: str | None = None
model_phase3: str | None = None
model_phase4: str | None = None
title: str | None = Field(default=None, max_length=120)
expected_version: int
class Phase2ConfirmRequest(BaseModel):
@ -107,6 +132,7 @@ class Phase2ConfirmRequest(BaseModel):
proper_nouns: list[ProperNoun]
style: str
expected_version: int
# ── API Responses ──────────────────────────────────────
@ -114,3 +140,29 @@ class Phase2ConfirmRequest(BaseModel):
class SessionResponse(BaseModel):
session_id: str
data: TranslationSession
title: str = ""
status: str = "draft"
current_phase: int = 0
version: int = 0
created_at: str = ""
updated_at: str = ""
archived_at: str | None = None
class SessionSummary(BaseModel):
session_id: str
title: str
source_preview: str
target_language: str
status: str
current_phase: int
version: int
created_at: str
updated_at: str
archived_at: str | None = None
class RevisionResponse(BaseModel):
data: TranslationSession
reason: str
created_at: str