"""Social media models""" from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, ForeignKey from sqlalchemy.sql import func from app.database import Base class Post(Base): """Social media post model""" __tablename__ = "posts" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) content = Column(Text, nullable=False) image_url = Column(String(500)) video_url = Column(String(500)) # Engagement metrics likes_count = Column(Integer, default=0) comments_count = Column(Integer, default=0) shares_count = Column(Integer, default=0) views_count = Column(Integer, default=0) # Visibility is_public = Column(Boolean, default=True) is_pinned = Column(Boolean, default=False) # Timestamps created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) def __repr__(self): return f"" class Comment(Base): """Comment model""" __tablename__ = "comments" id = Column(Integer, primary_key=True, index=True) post_id = Column(Integer, ForeignKey("posts.id", ondelete="CASCADE"), nullable=False) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) content = Column(Text, nullable=False) parent_id = Column(Integer, ForeignKey("comments.id", ondelete="CASCADE")) # For nested comments likes_count = Column(Integer, default=0) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) class Like(Base): """Like model""" __tablename__ = "likes" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) post_id = Column(Integer, ForeignKey("posts.id", ondelete="CASCADE")) comment_id = Column(Integer, ForeignKey("comments.id", ondelete="CASCADE")) created_at = Column(DateTime(timezone=True), server_default=func.now()) class Follow(Base): """Follow relationship model""" __tablename__ = "follows" id = Column(Integer, primary_key=True, index=True) follower_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) following_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now())