sujoy0011's picture
Upload 143 files
0326035 verified
from sqlalchemy import Column, String, Integer, Boolean, DateTime, Text, ForeignKey
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import uuid
from app.database import Base
class User(Base):
__tablename__ = "users"
# Primary Key
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
# Authentication
email = Column(String(255), unique=True, nullable=False, index=True)
hashed_password = Column(String(255), nullable=False)
# Profile Information
full_name = Column(String(255), nullable=False)
college = Column(String(255))
branch = Column(String(100))
graduation_year = Column(Integer)
target_role = Column(String(100))
profile_picture_url = Column(Text)
bio = Column(Text)
# Contact Information
phone = Column(String(20))
linkedin_url = Column(String(255))
github_url = Column(String(255))
portfolio_url = Column(String(255))
# Platform Integrations
leetcode_username = Column(String(100))
github_username = Column(String(100))
hackerrank_username = Column(String(100))
codechef_username = Column(String(100))
gfg_username = Column(String(100))
# Account Status
email_verified = Column(Boolean, default=False)
is_active = Column(Boolean, default=True)
is_premium = Column(Boolean, default=False)
subscription_expires_at = Column(DateTime, nullable=True)
# Timestamps
created_at = Column(DateTime, server_default=func.now(), nullable=False)
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False)
last_login_at = Column(DateTime, nullable=True)
# Relationships
preferences = relationship("UserPreference", back_populates="user", uselist=False, cascade="all, delete-orphan")
resumes = relationship("Resume", back_populates="user", cascade="all, delete-orphan")
interviews = relationship("Interview", back_populates="user", cascade="all, delete-orphan")
interview_results = relationship("InterviewResult", back_populates="user", cascade="all, delete-orphan")
notifications = relationship("Notification", back_populates="user", cascade="all, delete-orphan")
refresh_tokens = relationship("RefreshToken", back_populates="user", cascade="all, delete-orphan")
# These will be added later when we create those models
# roadmaps = relationship("CareerRoadmap", back_populates="user", cascade="all, delete-orphan")
# skill_progress = relationship("SkillProgress", back_populates="user", cascade="all, delete-orphan")
# projects = relationship("Project", back_populates="user", cascade="all, delete-orphan")
# cover_letters = relationship("CoverLetter", back_populates="user", cascade="all, delete-orphan")
# job_bookmarks = relationship("JobBookmark", back_populates="user", cascade="all, delete-orphan")
# job_applications = relationship("JobApplication", back_populates="user", cascade="all, delete-orphan")
# job_alerts = relationship("JobAlert", back_populates="user", cascade="all, delete-orphan")
# analytics = relationship("UserAnalytics", back_populates="user", uselist=False, cascade="all, delete-orphan")
# feedback = relationship("Feedback", back_populates="user", cascade="all, delete-orphan")
def __repr__(self):
return f"<User {self.email}>"
class UserPreference(Base):
__tablename__ = "user_preferences"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = Column(
UUID(as_uuid=True),
ForeignKey("users.id", ondelete="CASCADE"), # ← THIS WAS MISSING
nullable=False,
unique=True,
index=True
)
# Notification Preferences
email_notifications = Column(Boolean, default=True)
push_notifications = Column(Boolean, default=True)
job_alerts = Column(Boolean, default=True)
roadmap_reminders = Column(Boolean, default=True)
interview_reminders = Column(Boolean, default=True)
# UI Preferences
theme = Column(String(20), default="light") # light, dark, auto
language = Column(String(10), default="en")
# Privacy Settings
profile_visibility = Column(String(20), default="private") # private, public
show_progress_publicly = Column(Boolean, default=False)
# Timestamps
created_at = Column(DateTime, server_default=func.now())
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
# Relationship
user = relationship("User", back_populates="preferences")
def __repr__(self):
return f"<UserPreference for user_id={self.user_id}>"