"""ORM models: upload sessions, room images, and generation records.""" from __future__ import annotations import datetime as dt import uuid from sqlalchemy import DateTime, ForeignKey, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from .db import Base def _uuid() -> str: return uuid.uuid4().hex class UploadSession(Base): """One upload action containing a gallery of room photos.""" __tablename__ = "upload_sessions" id: Mapped[str] = mapped_column(String(32), primary_key=True, default=_uuid) created_at: Mapped[dt.datetime] = mapped_column(DateTime, default=dt.datetime.utcnow) images: Mapped[list["RoomImage"]] = relationship( back_populates="session", cascade="all, delete-orphan" ) class RoomImage(Base): """A single normalized room photo belonging to an upload session.""" __tablename__ = "room_images" id: Mapped[str] = mapped_column(String(32), primary_key=True, default=_uuid) session_id: Mapped[str] = mapped_column(ForeignKey("upload_sessions.id")) filename: Mapped[str] = mapped_column(String(255)) path: Mapped[str] = mapped_column(String(512)) # absolute disk path rel_path: Mapped[str] = mapped_column(String(512)) # path relative to /static width: Mapped[int] = mapped_column(Integer) height: Mapped[int] = mapped_column(Integer) created_at: Mapped[dt.datetime] = mapped_column(DateTime, default=dt.datetime.utcnow) session: Mapped[UploadSession] = relationship(back_populates="images") class Generation(Base): """A generated (redesigned) room image and its inputs.""" __tablename__ = "generations" id: Mapped[str] = mapped_column(String(32), primary_key=True, default=_uuid) session_id: Mapped[str] = mapped_column(String(32)) image_id: Mapped[str] = mapped_column(String(32)) item_ids: Mapped[str] = mapped_column(Text) # comma-separated catalog ids provider: Mapped[str] = mapped_column(String(32)) output_path: Mapped[str] = mapped_column(String(512)) output_rel_path: Mapped[str] = mapped_column(String(512)) created_at: Mapped[dt.datetime] = mapped_column(DateTime, default=dt.datetime.utcnow)