pahvalentines/backend/app/models.py
michael 9d53adaaf3 Add backend API, video generator, and frontend updates
- Add Python/FastAPI backend with Celery workers
- Add video generation with FFmpeg (spinning record animation)
- Add API endpoints: submissions, status polling, webhook, results
- Add database schema and Alembic migrations
- Update frontend pages with API integration
- Add project documentation and spec

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 10:31:58 -06:00

56 lines
1.7 KiB
Python

"""SQLAlchemy database models."""
from datetime import datetime
from sqlalchemy import Column, DateTime, Index, Integer, String, Text
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class Submission(Base):
"""Submission model representing a user's pet song generation request."""
__tablename__ = "submissions"
# Primary key
session_id = Column(String(255), primary_key=True)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
# User identification (for rate limiting)
cookie_id = Column(String(255), index=True)
# Form data
owner_name = Column(String(100), nullable=False)
pet_name = Column(String(100), nullable=False)
pet_type = Column(String(50), nullable=False)
music_vibe = Column(String(50), nullable=False)
photo_path = Column(String(500), nullable=False)
# Processing state
retry_count = Column(Integer, default=0)
entry_status = Column(String(50), default="pending")
# Sonauto API interaction
sent_to_LLM = Column(DateTime)
LLM_task_id = Column(String(255))
received_from_LLM = Column(DateTime)
LLM_response = Column(Text)
LLM_full_response = Column(Text)
LLM_status = Column(String(50))
# Generated content
lyrics = Column(Text)
generated_song_path = Column(Text)
generated_video_path = Column(String(500))
# Video generation timestamps
video_creation_start = Column(DateTime)
video_creation_end = Column(DateTime)
__table_args__ = (Index("ix_submissions_llm_task_id", "LLM_task_id"),)
def __repr__(self) -> str:
return f"<Submission(session_id={self.session_id}, status={self.entry_status})>"