- Add meeting_number field (M-YYYYMMDD-XX format) with auto-generation - Refactor Excel export to use cell coordinates instead of placeholders - Export files saved to backend/record/ directory with meeting number filename - Add database migration for meeting_number column - Add start.sh script for managing frontend/backend/sidecar services - Update OpenSpec documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
130 lines
2.9 KiB
Python
130 lines
2.9 KiB
Python
from pydantic import BaseModel
|
|
from typing import Optional, List
|
|
from datetime import datetime, date
|
|
from enum import Enum
|
|
|
|
|
|
class ActionItemStatus(str, Enum):
|
|
OPEN = "Open"
|
|
IN_PROGRESS = "In Progress"
|
|
DONE = "Done"
|
|
DELAYED = "Delayed"
|
|
|
|
|
|
class UserRole(str, Enum):
|
|
ADMIN = "admin"
|
|
USER = "user"
|
|
|
|
|
|
# Auth schemas
|
|
class LoginRequest(BaseModel):
|
|
email: str
|
|
password: str
|
|
|
|
|
|
class LoginResponse(BaseModel):
|
|
token: str
|
|
email: str
|
|
role: str
|
|
|
|
|
|
class TokenPayload(BaseModel):
|
|
email: str
|
|
role: str
|
|
exp: Optional[int] = None
|
|
|
|
|
|
# Meeting schemas
|
|
class ConclusionCreate(BaseModel):
|
|
content: str
|
|
|
|
|
|
class ConclusionResponse(BaseModel):
|
|
conclusion_id: int
|
|
meeting_id: int
|
|
content: str
|
|
system_code: Optional[str] = None
|
|
|
|
|
|
class ActionItemCreate(BaseModel):
|
|
content: str
|
|
owner: Optional[str] = ""
|
|
due_date: Optional[date] = None
|
|
|
|
|
|
class ActionItemUpdate(BaseModel):
|
|
content: Optional[str] = None
|
|
owner: Optional[str] = None
|
|
due_date: Optional[date] = None
|
|
status: Optional[ActionItemStatus] = None
|
|
|
|
|
|
class ActionItemResponse(BaseModel):
|
|
action_id: int
|
|
meeting_id: int
|
|
content: str
|
|
owner: Optional[str] = None
|
|
due_date: Optional[date] = None
|
|
status: ActionItemStatus
|
|
system_code: Optional[str] = None
|
|
|
|
|
|
class MeetingCreate(BaseModel):
|
|
subject: str
|
|
meeting_time: datetime
|
|
location: Optional[str] = ""
|
|
chairperson: Optional[str] = ""
|
|
recorder: Optional[str] = ""
|
|
attendees: Optional[str] = ""
|
|
transcript_blob: Optional[str] = ""
|
|
conclusions: Optional[List[ConclusionCreate]] = []
|
|
actions: Optional[List[ActionItemCreate]] = []
|
|
|
|
|
|
class MeetingUpdate(BaseModel):
|
|
subject: Optional[str] = None
|
|
meeting_time: Optional[datetime] = None
|
|
location: Optional[str] = None
|
|
chairperson: Optional[str] = None
|
|
recorder: Optional[str] = None
|
|
attendees: Optional[str] = None
|
|
transcript_blob: Optional[str] = None
|
|
conclusions: Optional[List[ConclusionCreate]] = None
|
|
actions: Optional[List[ActionItemCreate]] = None
|
|
|
|
|
|
class MeetingResponse(BaseModel):
|
|
meeting_id: int
|
|
uuid: str
|
|
meeting_number: Optional[str] = None
|
|
subject: str
|
|
meeting_time: datetime
|
|
location: Optional[str] = None
|
|
chairperson: Optional[str] = None
|
|
recorder: Optional[str] = None
|
|
attendees: Optional[str] = None
|
|
transcript_blob: Optional[str] = None
|
|
created_by: Optional[str] = None
|
|
created_at: datetime
|
|
conclusions: List[ConclusionResponse] = []
|
|
actions: List[ActionItemResponse] = []
|
|
|
|
|
|
class MeetingListResponse(BaseModel):
|
|
meeting_id: int
|
|
uuid: str
|
|
subject: str
|
|
meeting_time: datetime
|
|
chairperson: Optional[str] = None
|
|
created_at: datetime
|
|
|
|
|
|
# AI schemas
|
|
class SummarizeRequest(BaseModel):
|
|
transcript: str
|
|
|
|
|
|
class SummarizeResponse(BaseModel):
|
|
conclusions: List[str]
|
|
action_items: List[ActionItemCreate]
|