# models.py # All SQLAlchemy database models from extensions import db from datetime import datetime class User(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) email = db.Column(db.String(255), nullable=False, unique=True) password = db.Column(db.String(255), nullable=False) student_id = db.Column(db.String(50), nullable=False, unique=True) bio = db.Column(db.Text, default=None) department = db.Column(db.String(100), default=None) profile_image = db.Column(db.String(255), default=None) cover_image = db.Column(db.String(255), default=None) is_admin = db.Column(db.Boolean, default=False) location_city = db.Column(db.String(100), default=None) location_country = db.Column(db.String(100), default=None) location_lat = db.Column(db.Numeric(10,8), default=None) location_lng = db.Column(db.Numeric(11,8), default=None) feeling = db.Column(db.String(50), default=None) feeling_emoji = db.Column(db.String(10), default=None) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) def to_dict(self): return { "id": self.id, "name": self.name, "email": self.email, "student_id": self.student_id, "bio": self.bio, "department": self.department, "profile_image": self.profile_image, "cover_image": self.cover_image, "is_admin": self.is_admin, "feeling": self.feeling, "feeling_emoji": self.feeling_emoji, "location_city": self.location_city, "location_country": self.location_country, } class Post(db.Model): __tablename__ = "posts" id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) content = db.Column(db.Text, nullable=False) image = db.Column(db.String(255), default=None) feeling = db.Column(db.String(50), default=None) feeling_emoji = db.Column(db.String(10), default=None) location_city = db.Column(db.String(100), default=None) location_lat = db.Column(db.Numeric(10,8), default=None) location_lng = db.Column(db.Numeric(11,8), default=None) sentiment = db.Column(db.String(20), default=None) # POSITIVE | NEGATIVE | NEUTRAL sentiment_score = db.Column(db.Float, default=None) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) def to_dict(self, like_count=0, comment_count=0, user_liked=False, author=None): return { "id": self.id, "user_id": self.user_id, "author": author, "content": self.content, "image": self.image, "feeling": self.feeling, "feeling_emoji": self.feeling_emoji, "sentiment": self.sentiment, "sentiment_score": self.sentiment_score, "likes": like_count, "comments": comment_count, "user_liked": user_liked, "created_at": self.created_at.isoformat(), } class Comment(db.Model): __tablename__ = "comments" id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey("posts.id", ondelete="CASCADE"), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) parent_id = db.Column(db.Integer, db.ForeignKey("comments.id", ondelete="CASCADE"), default=None) content = db.Column(db.Text, nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class Like(db.Model): __tablename__ = "likes" id = db.Column(db.Integer, primary_key=True) post_id = db.Column(db.Integer, db.ForeignKey("posts.id", ondelete="CASCADE"), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) __table_args__ = (db.UniqueConstraint("post_id", "user_id"),) class FriendRequest(db.Model): __tablename__ = "friend_requests" id = db.Column(db.Integer, primary_key=True) sender_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) receiver_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) status = db.Column(db.String(20), default="pending") # pending | accepted | rejected created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) __table_args__ = (db.UniqueConstraint("sender_id", "receiver_id"),) class Friend(db.Model): __tablename__ = "friends" id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) friend_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) __table_args__ = (db.UniqueConstraint("user_id", "friend_id"),) class Announcement(db.Model): __tablename__ = "announcements" id = db.Column(db.Integer, primary_key=True) admin_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) title = db.Column(db.String(255), nullable=False) content = db.Column(db.Text, nullable=False) priority = db.Column(db.String(20), default="normal") # low | normal | high created_at = db.Column(db.DateTime, default=datetime.utcnow) class Message(db.Model): __tablename__ = "messages" id = db.Column(db.Integer, primary_key=True) sender_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) receiver_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE"), nullable=False) message = db.Column(db.Text, nullable=False) is_read = db.Column(db.Boolean, default=False) created_at = db.Column(db.DateTime, default=datetime.utcnow)