from __future__ import annotations from sqlalchemy import select from sqlalchemy.orm import Session, selectinload from app.domain.models import Job, JobSkill from app.domain.schemas import JobCard class JobRepository: def __init__(self, db: Session): self.db = db def upsert(self, job_card: JobCard) -> Job: instance = self.db.get(Job, job_card.job_id) if instance is None: instance = Job(id=job_card.job_id) self.db.add(instance) instance.title = job_card.title instance.category = job_card.category instance.description = job_card.description instance.city = job_card.city instance.region = job_card.region instance.location_detail = job_card.location_detail instance.start_time = job_card.start_time instance.duration_hours = job_card.duration_hours instance.headcount = job_card.headcount instance.salary_type = job_card.salary.type.value instance.salary_amount = job_card.salary.amount instance.salary_currency = job_card.salary.currency instance.work_mode = job_card.work_mode instance.tags_json = job_card.tags instance.confidence = job_card.confidence instance.skills.clear() instance.skills.extend( [ JobSkill(skill_name=skill_name, weight=1.0, is_required=index < 2) for index, skill_name in enumerate(job_card.skills) ] ) self.db.commit() self.db.refresh(instance) return instance def list(self, limit: int = 100) -> list[Job]: stmt = select(Job).options(selectinload(Job.skills)).order_by(Job.created_at.desc()).limit(limit) return list(self.db.scalars(stmt)) def get(self, job_id: str) -> Job | None: stmt = select(Job).options(selectinload(Job.skills)).where(Job.id == job_id) return self.db.scalar(stmt) def get_many(self, ids: list[str]) -> list[Job]: if not ids: return [] stmt = select(Job).options(selectinload(Job.skills)).where(Job.id.in_(ids)) result = list(self.db.scalars(stmt)) order = {item_id: index for index, item_id in enumerate(ids)} return sorted(result, key=lambda item: order[item.id])