Files
Anime-Tracker-API/models.py

43 lines
1.7 KiB
Python

"""
Modèles de base de données
"""
from sqlalchemy import Column, Integer, String, DateTime, Text, Float, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
username = Column(String(50), unique=True, index=True, nullable=False)
email = Column(String(100), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
animes = relationship("Anime", back_populates="user", cascade="all, delete-orphan")
class Anime(Base):
__tablename__ = "animes"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
anime_id = Column(String(100), nullable=False, index=True) # ID unique de l'animé (généré par l'extension)
title = Column(String(255), nullable=False)
current_episode = Column(Integer, default=1)
total_episodes = Column(Integer, nullable=True)
last_url = Column(Text, nullable=True)
source = Column(String(50), nullable=True) # 'crunchyroll' ou 'voiranime'
status = Column(String(20), default='en_cours') # 'en_cours' ou 'termine'
comment = Column(Text, nullable=True)
rating = Column(Float, default=0.0)
anilist_id = Column(Integer, nullable=True)
cover_image = Column(Text, nullable=True)
description = Column(Text, nullable=True)
last_updated = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
user = relationship("User", back_populates="animes")