ai-hackaton-backend/app/repositories/interview_reports_repository.py
2025-09-09 20:26:14 +05:00

92 lines
3.4 KiB
Python

from datetime import datetime
from typing import Annotated
from fastapi import Depends
from sqlalchemy import select, update
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import get_session
from app.models.interview import InterviewSession
from app.models.interview_report import InterviewReport
from app.models.resume import Resume
from app.models.vacancy import Vacancy
from app.repositories.base_repository import BaseRepository
class InterviewReportRepository(BaseRepository[InterviewReport]):
def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]):
super().__init__(InterviewReport, session)
async def get_by_session_id(self, session_id: int) -> InterviewReport | None:
"""Получить отчёт по ID сессии интервью"""
statement = select(InterviewReport).where(
InterviewReport.interview_session_id == session_id
)
result = await self._session.execute(statement)
return result.scalar_one_or_none()
async def update_scores(
self,
report_id: int,
scores: dict,
) -> bool:
"""Обновить оценки в отчёте"""
try:
await self._session.execute(
update(InterviewReport)
.where(InterviewReport.id == report_id)
.values(
**scores,
updated_at=datetime.utcnow(),
)
)
await self._session.commit()
return True
except Exception:
await self._session.rollback()
return False
async def update_pdf_url(self, report_id: int, pdf_url: str) -> bool:
"""Обновить ссылку на PDF отчёта"""
try:
await self._session.execute(
update(InterviewReport)
.where(InterviewReport.id == report_id)
.values(pdf_report_url=pdf_url, updated_at=datetime.utcnow())
)
await self._session.commit()
return True
except Exception:
await self._session.rollback()
return False
async def get_by_vacancy_id(self, vacancy_id: int) -> list[InterviewReport]:
"""Получить все отчёты по вакансии"""
statement = (
select(InterviewReport)
.join(
InterviewSession,
InterviewSession.id == InterviewReport.interview_session_id,
)
.join(Resume, Resume.id == InterviewSession.resume_id)
.join(Vacancy, Vacancy.id == Resume.vacancy_id)
.where(Vacancy.id == vacancy_id)
.order_by(InterviewReport.overall_score.desc())
)
result = await self._session.execute(statement)
return result.scalars().all()
async def update_notes(self, report_id: int, notes: str) -> bool:
"""Обновить заметки интервьюера"""
try:
await self._session.execute(
update(InterviewReport)
.where(InterviewReport.id == report_id)
.values(interviewer_notes=notes, updated_at=datetime.utcnow())
)
await self._session.commit()
return True
except Exception:
await self._session.rollback()
return False