59 lines
2.2 KiB
Python
59 lines
2.2 KiB
Python
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])
|