File size: 4,872 Bytes
0326035
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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}>"