45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
"""Models for Favorites system with SQLModel support"""
|
|
import uuid
|
|
import json
|
|
from typing import Optional, Dict, List
|
|
from datetime import datetime
|
|
from sqlmodel import SQLModel, Field, Column, String
|
|
|
|
class FavoriteBase(SQLModel):
|
|
"""Base schema for favorite anime"""
|
|
anime_id: str = Field(index=True)
|
|
title: str = Field(index=True)
|
|
url: str
|
|
provider: str
|
|
poster_url: Optional[str] = None
|
|
|
|
# Timestamps
|
|
created_at: datetime = Field(default_factory=datetime.now)
|
|
updated_at: datetime = Field(default_factory=datetime.now)
|
|
|
|
class FavoriteTable(FavoriteBase, table=True):
|
|
"""Database table for favorites"""
|
|
__tablename__ = "favorites"
|
|
|
|
id: str = Field(
|
|
default_factory=lambda: str(uuid.uuid4()),
|
|
primary_key=True,
|
|
index=True,
|
|
nullable=False
|
|
)
|
|
user_id: str = Field(foreign_key="users.id", index=True, default="default")
|
|
|
|
# Store metadata dictionary as JSON string in SQLite
|
|
metadata_json: Optional[str] = Field(default="{}", sa_column=Column(String))
|
|
|
|
@property
|
|
def anime_metadata(self) -> Dict:
|
|
try:
|
|
return json.loads(self.metadata_json or "{}")
|
|
except json.JSONDecodeError:
|
|
return {}
|
|
|
|
@anime_metadata.setter
|
|
def anime_metadata(self, value: Dict):
|
|
self.metadata_json = json.dumps(value or {})
|