File size: 3,261 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
from sqlalchemy import Column, String, Integer, DateTime, Text, ForeignKey, ARRAY
from sqlalchemy.dialects.postgresql import UUID, JSONB
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
import uuid

from app.database import Base


class Interview(Base):
    __tablename__ = "interviews"
    
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    user_id = Column(
        UUID(as_uuid=True), 
        ForeignKey("users.id", ondelete="CASCADE"),
        nullable=False, 
        index=True
    )
    
    # Interview Configuration
    interview_type = Column(String(20), nullable=False)  # technical, hr, behavioral, mixed
    target_role = Column(String(100), nullable=False)
    technologies = Column(ARRAY(Text))
    difficulty = Column(String(20))  # easy, medium, hard
    num_questions = Column(Integer, nullable=False)
    
    # Pre-generated Questions
    questions = Column(JSONB)  # [{id, text, category, expected_answer}]
    
    # Status
    status = Column(String(20), default="draft", index=True)  # draft, in_progress, completed, abandoned
    
    # Session Metadata
    started_at = Column(DateTime)
    completed_at = Column(DateTime)
    duration_seconds = Column(Integer)
    
    # Timestamps
    created_at = Column(DateTime, server_default=func.now(), index=True)
    updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
    
    # Relationships
    user = relationship("User", back_populates="interviews")
    result = relationship("InterviewResult", back_populates="interview", uselist=False, cascade="all, delete-orphan")
    
    def __repr__(self):
        return f"<Interview {self.interview_type} - {self.status}>"


class InterviewResult(Base):
    __tablename__ = "interview_results"
    
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    interview_id = Column(
        UUID(as_uuid=True), 
        ForeignKey("interviews.id", ondelete="CASCADE"),
        nullable=False, 
        index=True
    )
    user_id = Column(
        UUID(as_uuid=True), 
        ForeignKey("users.id", ondelete="CASCADE"),
        nullable=False, 
        index=True
    )
    
    # Overall Scoring
    overall_score = Column(Integer)
    question_scores = Column(ARRAY(Integer))
    
    # Detailed Feedback
    summary = Column(Text)
    detailed_feedback = Column(JSONB)  # {technical_depth, communication, problem_solving, confidence}
    improvement_areas = Column(ARRAY(Text))
    strengths = Column(ARRAY(Text))
    
    # Transcript
    transcript = Column(JSONB)  # [{question_number, question_text, answer_text, score, feedback}]
    
    # Voice Analysis
    voice_analysis = Column(JSONB)  # {pace_wpm, filler_words, confidence_score, clarity}
    
    # AI Remarks
    ai_remarks = Column(Text)
    
    # Timestamp
    created_at = Column(DateTime, server_default=func.now(), index=True)
    
    # Relationships
    interview = relationship("Interview", back_populates="result")
    user = relationship("User", back_populates="interview_results")
    
    def __repr__(self):
        return f"<InterviewResult score={self.overall_score}>"