Files
WoMenQuNaJu/MeetSpot/app/models/room.py
2026-02-04 16:11:55 +08:00

61 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""聚会房间相关的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