"""Database models.""" from datetime import datetime, timezone from typing import Optional from uuid import UUID, uuid4 from sqlalchemy import JSON, Text, Integer, Float, String, DateTime, Boolean from sqlalchemy.dialects.postgresql import UUID as PGUUID from sqlalchemy.orm import Mapped, mapped_column from app.db.database import Base def utcnow() -> datetime: """Get current UTC datetime.""" return datetime.now(timezone.utc) class Generation(Base): """Music generation record.""" __tablename__ = "generations" id: Mapped[UUID] = mapped_column( PGUUID(as_uuid=True), primary_key=True, default=uuid4, ) prompt: Mapped[str] = mapped_column(Text, nullable=False) lyrics: Mapped[Optional[str]] = mapped_column(Text, nullable=True) style: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) duration: Mapped[int] = mapped_column(Integer, default=30) # Generation status status: Mapped[str] = mapped_column( String(20), default="pending", nullable=False, ) # pending, processing, completed, failed # File paths audio_path: Mapped[Optional[str]] = mapped_column(String(500), nullable=True) instrumental_path: Mapped[Optional[str]] = mapped_column( String(500), nullable=True ) vocal_path: Mapped[Optional[str]] = mapped_column(String(500), nullable=True) # Metadata generation_metadata: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True) # Timestamps created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utcnow, nullable=False, ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utcnow, onupdate=utcnow, nullable=False, ) completed_at: Mapped[Optional[datetime]] = mapped_column( DateTime(timezone=True), nullable=True, ) # Error handling error_message: Mapped[Optional[str]] = mapped_column(Text, nullable=True) # Processing metrics processing_time_seconds: Mapped[Optional[float]] = mapped_column( Float, nullable=True ) class User(Base): """User model (for future authentication).""" __tablename__ = "users" id: Mapped[UUID] = mapped_column( PGUUID(as_uuid=True), primary_key=True, default=uuid4, ) email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False) username: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) hashed_password: Mapped[str] = mapped_column(String(255), nullable=False) is_active: Mapped[bool] = mapped_column(Boolean, default=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=utcnow, )