123 lines
4.5 KiB
Python
123 lines
4.5 KiB
Python
from sqlalchemy.ext.asyncio import AsyncSession
|
||
from sqlalchemy.future import select
|
||
from sqlalchemy.orm import joinedload
|
||
from sqlalchemy import or_
|
||
from sqlalchemy.exc import IntegrityError
|
||
from model.database import Client, AppliedJob, Job
|
||
|
||
async def upsert_client(db: AsyncSession, user_id: str, user_login: str, user_nicename: str, user_email: str, phone: str, json_data: str):
|
||
# Проверяем, существует ли клиент с таким логином или email
|
||
async with db.begin():
|
||
result = await db.execute(
|
||
select(Client).filter((Client.id == user_id))# | (Client.user_email == user_email))
|
||
)
|
||
client = result.scalars().first() # Получаем первый результат или None
|
||
|
||
if client:
|
||
# Если клиент существует, обновляем его данные
|
||
client.user_nicename = user_nicename
|
||
client.phone = phone
|
||
client.json_data = json_data
|
||
# Можно добавить другие поля для обновления
|
||
|
||
try:
|
||
await db.commit() # Применяем изменения в базе данных
|
||
await db.refresh(client) # Обновляем объект в Python
|
||
return client
|
||
except IntegrityError:
|
||
await db.rollback() # В случае ошибки откатываем изменения
|
||
raise
|
||
else:
|
||
# Если клиента нет, создаем нового
|
||
new_client = Client(
|
||
user_login=user_login,
|
||
user_nicename=user_nicename,
|
||
user_email=user_email,
|
||
json_data=json_data,
|
||
)
|
||
db.add(new_client)
|
||
try:
|
||
await db.commit() # Сохраняем нового клиента в базе данных
|
||
await db.refresh(new_client) # Обновляем объект в Python
|
||
return new_client
|
||
except IntegrityError:
|
||
await db.rollback() # В случае ошибки откатываем изменения
|
||
raise
|
||
|
||
|
||
|
||
|
||
async def del_jobs(db: AsyncSession, user_id: str):
|
||
jobs = await db.execute(
|
||
select(AppliedJob).where(
|
||
AppliedJob.client_id == user_id,
|
||
or_(AppliedJob.status == "Scheduled", AppliedJob.status.is_(None))
|
||
)
|
||
)
|
||
jobs = jobs.scalars().all()
|
||
|
||
for job in jobs:
|
||
await db.delete(job)
|
||
|
||
await db.commit()
|
||
|
||
|
||
async def add_jobs(db: AsyncSession, user_id: str):
|
||
# Фильтруем вакансии по переданным параметрам
|
||
query = select(Job).filter(Job.active == 3)
|
||
result = await db.execute(query)
|
||
jobs = result.scalars().all() # Получаем список вакансий
|
||
|
||
if not jobs:
|
||
return {"message": "Нет вакансий по данному фильтру"}
|
||
|
||
# Создаём записи в AppliedJob
|
||
applied_jobs = [
|
||
AppliedJob(client_id=user_id, job_id=job.job_id)
|
||
for job in jobs
|
||
]
|
||
|
||
db.add_all(applied_jobs) # Добавляем в сессию
|
||
await db.commit() # Фиксируем изменения
|
||
|
||
|
||
|
||
return {"message": f"{len(applied_jobs)} вакансий добавлено в AppliedJob"}
|
||
|
||
|
||
|
||
|
||
async def get_applied_jobs(db, client_id: int):
|
||
query = (
|
||
select(AppliedJob)
|
||
.options(joinedload(AppliedJob.job)) # Подгружаем данные о вакансии
|
||
.where(AppliedJob.client_id == client_id)
|
||
)
|
||
|
||
result = await db.execute(query)
|
||
applied_jobs = result.scalars().all()
|
||
|
||
if not applied_jobs:
|
||
return {"message": "Нет откликов на вакансии"}
|
||
|
||
jobs_list = []
|
||
|
||
for applied in applied_jobs:
|
||
job = applied.job # Получаем объект Job из отношения AppliedJob.job
|
||
|
||
jobs_list.append({
|
||
"id": job.job_id,
|
||
"title": job.job_title,
|
||
"company": job.job_company,
|
||
"postedDate": job.date_posted,
|
||
"location": job.location,
|
||
"jobType": job.job_type,
|
||
"salary": f"${job.minimum_annual_salary}K" if job.minimum_annual_salary else "Not specified",
|
||
"level": job.job_level,
|
||
"status": applied.status if applied.status else "Scheduled",
|
||
"requiredSkills": "",
|
||
"aboutJob": job.about,
|
||
"jobLink": job.link
|
||
})
|
||
print(jobs_list)
|
||
return jobs_list |