study-notes-api / src /db /models.py
ALI7ADEL's picture
Upload 51 files
ed147e2 verified
"""
SQLModel database models for PostgreSQL (Supabase).
Optimized for cloud deployment and mobile app integration.
"""
from datetime import datetime
from typing import Optional, List
from sqlmodel import SQLModel, Field, Relationship
class User(SQLModel, table=True):
"""
User model for authentication and note ownership.
Attributes:
id: Primary key, auto-incremented
email: Unique email address for login
username: Display name for the user
password_hash: Bcrypt hashed password
role: User role (default: "user")
created_at: Account creation timestamp
notes: Relationship to user's notes
"""
__tablename__ = "users"
id: Optional[int] = Field(default=None, primary_key=True)
email: str = Field(unique=True, index=True, max_length=255, nullable=False)
username: str = Field(max_length=100, nullable=False)
password_hash: str = Field(max_length=255, nullable=False)
role: str = Field(default="user", max_length=50, nullable=False)
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
# Relationship to notes
notes: List["Note"] = Relationship(back_populates="owner")
class Config:
"""Pydantic configuration."""
json_schema_extra = {
"example": {
"email": "student@example.com",
"username": "Student123",
"role": "user"
}
}
class Note(SQLModel, table=True):
"""
Note model for storing generated study notes.
Attributes:
id: Primary key, auto-incremented
user_id: Foreign key to the user who generated this note
video_url: YouTube video URL
video_title: Title of the processed video
summary_content: Generated study notes content (markdown)
created_at: Note generation timestamp
owner: Relationship to the user who owns this note
"""
__tablename__ = "notes"
id: Optional[int] = Field(default=None, primary_key=True)
user_id: int = Field(foreign_key="users.id", index=True, nullable=False)
video_url: str = Field(index=True, max_length=500, nullable=False)
video_title: str = Field(max_length=500, nullable=False)
summary_content: str = Field(nullable=False) # Full markdown content
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
# Relationship to user
owner: Optional[User] = Relationship(back_populates="notes")
class Config:
"""Pydantic configuration."""
json_schema_extra = {
"example": {
"user_id": 1,
"video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"video_title": "Introduction to Python Programming",
"summary_content": "# Study Notes\\n\\n## Key Concepts..."
}
}