first commit

This commit is contained in:
ytc1012
2026-02-04 16:11:55 +08:00
commit 0f3ee050dc
165 changed files with 25795 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
"""聚会房间相关的ORM与Pydantic模型。"""
import uuid
from datetime import datetime
from typing import Optional, Tuple
from pydantic import BaseModel, Field
from sqlalchemy import Column, DateTime, Float, ForeignKey, String, Text, UniqueConstraint, func
from app.db.database import Base
def _generate_uuid() -> str:
return str(uuid.uuid4())
class GatheringRoom(Base):
__tablename__ = "gathering_rooms"
id = Column(String(36), primary_key=True, default=_generate_uuid)
name = Column(String(100), nullable=False)
description = Column(Text, default="")
host_user_id = Column(String(36), ForeignKey("users.id"), nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
gathering_time = Column(DateTime(timezone=True))
status = Column(String(20), default="pending")
venue_keywords = Column(String(100), default="咖啡馆")
final_venue_json = Column(Text, nullable=True)
class RoomParticipant(Base):
__tablename__ = "room_participants"
__table_args__ = (UniqueConstraint("room_id", "user_id", name="uq_room_user"),)
id = Column(String(36), primary_key=True, default=_generate_uuid)
room_id = Column(String(36), ForeignKey("gathering_rooms.id"), nullable=False)
user_id = Column(String(36), ForeignKey("users.id"), nullable=False)
location_name = Column(String(200))
location_lat = Column(Float)
location_lng = Column(Float)
joined_at = Column(DateTime(timezone=True), server_default=func.now())
role = Column(String(20), default="member")
class GatheringRoomCreate(BaseModel):
name: str = Field(..., description="聚会名称")
description: str = Field("", description="聚会描述")
gathering_time: Optional[datetime] = Field(
None, description="聚会时间ISO 字符串"
)
venue_keywords: str = Field("咖啡馆", description="场所类型关键词")
class RoomParticipantRead(BaseModel):
user_id: str
nickname: str
location_name: Optional[str] = None
location_coords: Optional[Tuple[float, float]] = None
role: str