from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Float, Text, LargeBinary, DateTime, JSON from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.sql import func Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True) password = Column(String) name = Column(String) created_at = Column(DateTime, server_default=func.now()) job_descriptions = relationship("JobDescription", back_populates="user") resumes = relationship("Resume", back_populates="user") memories = relationship("ApplicationMemory", back_populates="user") class JobDescription(Base): __tablename__ = "job_descriptions" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) title = Column(String) description = Column(Text) embedding_data = Column(JSON) sections = Column(JSON) created_at = Column(DateTime, server_default=func.now()) user = relationship("User", back_populates="job_descriptions") matches = relationship("Match", back_populates="job_description") class Resume(Base): __tablename__ = "resumes" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) filename = Column(String) candidate_name = Column(String, nullable=True) file_content = Column(LargeBinary) parsed_data = Column(JSON) embedding_data = Column(JSON) summary = Column(Text) created_at = Column(DateTime, server_default=func.now()) user = relationship("User", back_populates="resumes") matches = relationship("Match", back_populates="resume") class Match(Base): __tablename__ = "matches" id = Column(Integer, primary_key=True, index=True) job_description_id = Column(Integer, ForeignKey("job_descriptions.id")) resume_id = Column(Integer, ForeignKey("resumes.id")) score = Column(Float) is_match = Column(Boolean) reasoning = Column(JSON) created_at = Column(DateTime, server_default=func.now()) job_description = relationship("JobDescription", back_populates="matches") resume = relationship("Resume", back_populates="matches") interviews = relationship("Interview", back_populates="match") class Interview(Base): __tablename__ = "interviews" id = Column(Integer, primary_key=True, index=True) match_id = Column(Integer, ForeignKey("matches.id")) scheduled_time = Column(DateTime) email_sent = Column(Boolean, default=False) status = Column(String, default="scheduled") # scheduled, completed, cancelled notes = Column(Text, nullable=True) created_at = Column(DateTime, server_default=func.now()) match = relationship("Match", back_populates="interviews") class ApplicationMemory(Base): """Long-term memory storage for the application""" __tablename__ = "application_memories" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) type = Column(String, index=True) # job_description, resume, match, interview, etc. reference_id = Column(Integer) # ID of the referenced entity data = Column(JSON) # Main data to store metadata = Column(JSON, nullable=True) # Additional metadata created_at = Column(DateTime, server_default=func.now()) user = relationship("User", back_populates="memories")