OnyxlMunkey's picture
c618549
"""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,
)