from sqlalchemy import Column, Integer, String, Text, DateTime, JSON, ForeignKey, Enum as SAEnum, UniqueConstraint from sqlalchemy.orm import relationship from sqlalchemy.sql import func from database import Base class Resource(Base): __tablename__ = "resources" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) resource_type = Column( SAEnum("courseware", "animation", "exercise", "lesson_plan", "exam", "other", name="res_type"), default="other", ) title = Column(String(200), nullable=False) description = Column(Text, default="") content_ref = Column(String(500), default="") file_url = Column(String(500), default="") cover_image = Column(String(500), default="") tags = Column(JSON, default=list) subject = Column(String(50), default="") grade = Column(String(50), default="") downloads = Column(Integer, default=0) likes = Column(Integer, default=0) views = Column(Integer, default=0) is_public = Column(Integer, default=1) status = Column(SAEnum("active", "archived", name="res_status"), default="active") created_at = Column(DateTime, server_default=func.now()) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now()) author = relationship("User", back_populates="resources") favorites = relationship("ResourceFavorite", back_populates="resource", cascade="all, delete-orphan") class ResourceFavorite(Base): __tablename__ = "resource_favorites" __table_args__ = (UniqueConstraint("user_id", "resource_id", name="uq_resource_favorite_user_resource"),) id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True) resource_id = Column(Integer, ForeignKey("resources.id"), nullable=False, index=True) created_at = Column(DateTime, server_default=func.now()) user = relationship("User", back_populates="resource_favorites") resource = relationship("Resource", back_populates="favorites")