Обновить routers/client.py

This commit is contained in:
Alex55 2025-04-23 13:59:49 +03:00
parent 32d070d8ce
commit 675eca167b
1 changed files with 322 additions and 317 deletions

View File

@ -1,317 +1,322 @@
from fastapi import FastAPI, HTTPException, APIRouter, Request, Header, Depends
from fastapi import BackgroundTasks
from fastapi.responses import JSONResponse
import json
from fastapi.templating import Jinja2Templates
from sqlalchemy.ext.asyncio import async_sessionmaker
from typing import Dict
from pydantic import BaseModel
from sqlalchemy.orm import Session
import json
from model.database import get_async_session, Client
from utils.clients import upsert_client, del_jobs, add_jobs, get_applied_jobs, get_filtered_jobs, client_list, get_avtopilot, get_delite, get_update
from typing import Union
import asyncio
router = APIRouter()
templates = Jinja2Templates(directory="templates")
API_KEY = "4545454"
def get_filtered_values(category, data):
values = data.get(category, {})
if isinstance(values, dict):
# Фильтруем словарь, оставляем только значения, отличные от None
return [key for key, value in values.items() if value is not None]
elif isinstance(values, str) and values:
# Если это строка, добавляем её как есть (если она не пустая)
return [values]
return []
# Пример данных
clients = {
1: {"username": "John Doe", "email": "john@example.com", "phone": "+123456781"},
44: {"username": "Jane Smith", "email": "jane@example.com", "phone": "+987654321"}
}
@router.get("/get_client/{client_id}", include_in_schema=False)
async def get_client_modal(client_id: int, db: Session = Depends(get_async_session)):
# client = clients.get(client_id) # Используй clients вместо clients_db
# print(f"==============================={type(client)}")
client = await client_list(client_id, db)
if not client:
raise HTTPException(status_code=404, detail="Client not found")
return JSONResponse(content=client)
class JsonData(BaseModel):
json_data: Union[dict, str]
class jobs_delete(BaseModel):
user_id: int
job_id:int
class avtopilots(BaseModel):
user_id: int
avtopilot:bool
class update(BaseModel):
user_id: int
async def process_client_data(
db: Session,
data: JsonData,
user_id: str,
first_name: str,
last_name: str,
email_addr: str,
phone_num: str
):
"""Функция для обработки данных в фоне"""
print(f"Получены данные для {first_name} {last_name} с email {email_addr}")
async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False)
async with async_session_maker() as db1, async_session_maker() as db2:
print("Запускаем задачи для обновления и удаления")
client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data))
del_task = del_jobs(db2, user_id)
client, _ = await asyncio.gather(client_task, del_task)
job_level_values = get_filtered_values('job_level', data.json_data)
job_type_values = get_filtered_values('job_type', data.json_data)
location_type_values = get_filtered_values('location_type', data.json_data)
print("Job Level:", ", ".join(job_level_values))
print("Job Type:", ", ".join(job_type_values))
print("Location Type:", ", ".join(location_type_values))
jobs = await get_filtered_jobs(
db,
user_job_titles=["Electronics Engineer", "Hardware Engineer"],
minimum_annual_salary=None,
salary_currency=None,
user_location_type=None,
user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
user_levels=["Mid", "Senior", "Manager"],
user_job_types=["Full-time", "Permanent"]
)
for job in jobs:
print(job.job_title, job.location, job.job_level, job.job_type)
ads = await add_jobs(db, user_id)
get_jobs = await get_applied_jobs(db, user_id)
# [ ]: NOTE Рабоиа в фоне BackgroundTasks process_client_data()
@router.post("/client/", summary="Обновления json_data и переобновление вакансий",
description="Этот эндпоинт обновляет json_data, удаляет все вакансии со статусом Scheduled и создаёт по полученным данным новые вакансии")
async def client(
data: JsonData,
x_api_key: str = Header(...),
db: Session = Depends(get_async_session),
background_tasks: BackgroundTasks = BackgroundTasks()
):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
# Если json_data строка, декодируем её в словарь
if isinstance(data.json_data, str):
try:
data.json_data = json.loads(data.json_data)
except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON format")
# Проверяем что данные в нужном формате
if not isinstance(data.json_data, dict):
raise HTTPException(status_code=400, detail="Invalid data format")
try:
# Извлекаем основные данные
first_name = data.json_data['first_name']
last_name = data.json_data['last_name']
email_addr = data.json_data['email_addr']
user_id = data.json_data['user_id']
phone_num = data.json_data['phone_num']
# Добавляем фоновые задачи
background_tasks.add_task(
process_client_data,
db=db,
data=data,
user_id=user_id,
first_name=first_name,
last_name=last_name,
email_addr=email_addr,
phone_num=phone_num
)
except KeyError as e:
raise HTTPException(status_code=400, detail=f"Missing required field: {e}")
return {"status": "ok", "message": "Request received and is being processed"}
# @router.post("/client/")
# async def client(data: JsonData, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
# if x_api_key != "4545454":
# raise HTTPException(status_code=403, detail="Invalid API Key")
# # Если json_data строка, декодируем её в словарь
# if isinstance(data.json_data, str):
# try:
# data.json_data = json.loads(data.json_data) # Декодируем строку в словарь
# except json.JSONDecodeError:
# raise HTTPException(status_code=400, detail="Invalid JSON format")
# # Если json_data строка — декодируем
# # Теперь data.json_data гарантированно является словарем
# if isinstance(data.json_data, dict):
# try:
# first_name = data.json_data['first_name']
# last_name = data.json_data['last_name']
# email_addr = data.json_data['email_addr']
# user_id = data.json_data['user_id']
# phone_num = data.json_data['phone_num']
# print(f"Получены данные для {first_name} {last_name} с email {email_addr}")
# async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False)
# async with async_session_maker() as db1, async_session_maker() as db2:
# print("Запускаем задачи для обновления и удаления")
# client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data))
# del_task = del_jobs(db2, user_id)
# client, _ = await asyncio.gather(client_task, del_task)
# job_level_values = get_filtered_values('job_level', data.json_data)
# job_type_values = get_filtered_values('job_type', data.json_data)
# location_type_values = get_filtered_values('location_type', data.json_data)
# #Результат
# print("Job Level:", ", ".join(job_level_values))
# print("Job Type:", ", ".join(job_type_values))
# print("Location Type:", ", ".join(location_type_values))
# # Пример использования функции
# jobs = await get_filtered_jobs(
# db,
# user_job_titles=["Electronics Engineer", "Hardware Engineer"],
# minimum_annual_salary=None,
# salary_currency=None,
# user_location_type=None,
# user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
# user_levels=["Mid", "Senior", "Manager"],
# user_job_types=["Full-time", "Permanent"]
# )
# # Выводим вакансии
# for job in jobs:
# print(job.job_title, job.location, job.job_level, job.job_type)
# ads = await add_jobs(db, user_id)
# get_jobs = await get_applied_jobs(db, user_id)
# # print(f"Полученные заявки: {get_jobs}")
# except KeyError as e:
# print(f"Ошибка при извлечении данных: {e}")
# raise HTTPException(status_code=400, detail="Missing required field in json_data")
# else:
# # print(f"Неверный формат данных: {type(data.json_data)}")
# raise HTTPException(status_code=400, detail="Invalid data format")
# return {"status": "ok", "message": "JSON получен"}
@router.post("/client_update", summary="Обновления клиента",
description="Этот эндпоинт получает ID пользователя, переходит по ссылки что бы получить json_data")
async def client_update(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
await get_update(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, }
@router.post("/client_jobs/", summary="Получить список работ по клиенту",
description="Этот эндпоинт получает ID пользователя, в ответ отдаёт список вакансий")
async def client_jobs(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
get_jobs = await get_applied_jobs(db, user_id)
print(f"Полученные данные: user_id={user_id}")
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "get_jobs": get_jobs}
# return {"message": "JSON получен", "data": get_jobs}
@router.post("/avtopilot", summary="Автопилот вкл, выкл",
description="Этот эндпоинт получает ID пользователя, включает или отключает автопилот. При false все вакансии со статусом Scheduled становятся Paused при true наоборот!")
async def avtopilot(data: avtopilots, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели
await get_avtopilot(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, "avtopilotss": avtopilotss}
@router.post("/jobs_delete", summary="Удаление вакансии",
description="Этот эндпоинт получает ID пользователя и ID вакансии, Удаляет у пользователя вакансию")
async def jobs_delete(data: jobs_delete, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
job_id = data.job_id # Так как data - это объект Pydantic модели
await get_delite(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, "job_id": job_id}
from fastapi import FastAPI, HTTPException, APIRouter, Request, Header, Depends
from fastapi import BackgroundTasks
from fastapi.responses import JSONResponse
import json
from fastapi.templating import Jinja2Templates
from sqlalchemy.ext.asyncio import async_sessionmaker
from typing import Dict
from pydantic import BaseModel
from sqlalchemy.orm import Session
import json
from model.database import get_async_session, Client
from utils.clients import upsert_client, del_jobs, add_jobs, get_applied_jobs, get_filtered_jobs, client_list, get_avtopilot, get_delite, get_update
from typing import Union
import asyncio
from types import SimpleNamespace
router = APIRouter()
templates = Jinja2Templates(directory="templates")
API_KEY = "4545454"
def get_filtered_values(category, data):
values = data.get(category, {})
if isinstance(values, dict):
# Фильтруем словарь, оставляем только значения, отличные от None
return [key for key, value in values.items() if value is not None]
elif isinstance(values, str) and values:
# Если это строка, добавляем её как есть (если она не пустая)
return [values]
return []
# Пример данных
@router.get("/get_client/{client_id}", include_in_schema=False)
async def get_client_modal(client_id: int, db: Session = Depends(get_async_session)):
data = SimpleNamespace(user_id=client_id)
print(data)
await get_update(db, data)
client = await client_list(client_id, db)
# print(client)
if not client:
raise HTTPException(status_code=404, detail="Client not found")
return JSONResponse(content=client)
class JsonData(BaseModel):
json_data: Union[dict, str]
class jobs_delete(BaseModel):
user_id: int
job_id:int
class avtopilots(BaseModel):
user_id: int
avtopilot:bool
class update(BaseModel):
user_id: int
async def process_client_data(
db: Session,
data: JsonData,
user_id: str,
first_name: str,
last_name: str,
email_addr: str,
phone_num: str
):
"""Функция для обработки данных в фоне"""
print(f"Получены данные для {first_name} {last_name} с email {email_addr}")
async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False)
async with async_session_maker() as db1, async_session_maker() as db2:
print("Запускаем задачи для обновления и удаления")
client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data))
del_task = del_jobs(db2, user_id)
client, _ = await asyncio.gather(client_task, del_task)
job_level_values = get_filtered_values('job_level', data.json_data)
job_type_values = get_filtered_values('job_type', data.json_data)
location_type_values = get_filtered_values('location_type', data.json_data)
print("Job Level:", ", ".join(job_level_values))
print("Job Type:", ", ".join(job_type_values))
print("Location Type:", ", ".join(location_type_values))
jobs = await get_filtered_jobs(
db,
user_job_titles=["3D Modeler,3D Printing Technician,3D Visualizer"],
minimum_annual_salary=None,
salary_currency=None,
user_location_type=None,
user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
user_levels=["Mid", "Senior", "Manager"],
user_job_types=["Part-Time", "Permanent"]
)
for job in jobs:
print(job.job_title, job.location, job.job_level, job.job_type)
ads = await add_jobs(db, user_id)
get_jobs = await get_applied_jobs(db, user_id)
# [ ]: NOTE Рабоиа в фоне BackgroundTasks process_client_data()
@router.post("/client/", summary="Обновления json_data и переобновление вакансий",
description="Этот эндпоинт обновляет json_data, удаляет все вакансии со статусом Scheduled и создаёт по полученным данным новые вакансии")
async def client(
data: JsonData,
x_api_key: str = Header(...),
db: Session = Depends(get_async_session),
background_tasks: BackgroundTasks = BackgroundTasks()
):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
# Если json_data строка, декодируем её в словарь
if isinstance(data.json_data, str):
try:
data.json_data = json.loads(data.json_data)
except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON format")
# Проверяем что данные в нужном формате
if not isinstance(data.json_data, dict):
raise HTTPException(status_code=400, detail="Invalid data format")
try:
# Извлекаем основные данные
first_name = data.json_data['first_name']
last_name = data.json_data['last_name']
email_addr = data.json_data['email_addr']
user_id = data.json_data['user_id']
phone_num = data.json_data['phone_num']
# Добавляем фоновые задачи
# background_tasks.add_task(
# process_client_data,
# db=db,
# data=data,
# user_id=user_id,
# first_name=first_name,
# last_name=last_name,
# email_addr=email_addr,
# phone_num=phone_num
# )
except KeyError as e:
raise HTTPException(status_code=400, detail=f"Missing required field: {e}")
return {"status": "ok", "message": "Request received and is being processed"}
# @router.post("/client/")
# async def client(data: JsonData, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
# if x_api_key != "4545454":
# raise HTTPException(status_code=403, detail="Invalid API Key")
# # Если json_data строка, декодируем её в словарь
# if isinstance(data.json_data, str):
# try:
# data.json_data = json.loads(data.json_data) # Декодируем строку в словарь
# except json.JSONDecodeError:
# raise HTTPException(status_code=400, detail="Invalid JSON format")
# # Если json_data строка — декодируем
# # Теперь data.json_data гарантированно является словарем
# if isinstance(data.json_data, dict):
# try:
# first_name = data.json_data['first_name']
# last_name = data.json_data['last_name']
# email_addr = data.json_data['email_addr']
# user_id = data.json_data['user_id']
# phone_num = data.json_data['phone_num']
# print(f"Получены данные для {first_name} {last_name} с email {email_addr}")
# async_session_maker = async_sessionmaker(bind=db.bind, expire_on_commit=False)
# async with async_session_maker() as db1, async_session_maker() as db2:
# print("Запускаем задачи для обновления и удаления")
# client_task = upsert_client(db1, user_id, first_name, last_name, email_addr, phone_num, str(data.json_data))
# del_task = del_jobs(db2, user_id)
# client, _ = await asyncio.gather(client_task, del_task)
# job_level_values = get_filtered_values('job_level', data.json_data)
# job_type_values = get_filtered_values('job_type', data.json_data)
# location_type_values = get_filtered_values('location_type', data.json_data)
# #Результат
# print("Job Level:", ", ".join(job_level_values))
# print("Job Type:", ", ".join(job_type_values))
# print("Location Type:", ", ".join(location_type_values))
# # Пример использования функции
# jobs = await get_filtered_jobs(
# db,
# user_job_titles=["Electronics Engineer", "Hardware Engineer"],
# minimum_annual_salary=None,
# salary_currency=None,
# user_location_type=None,
# user_locations=["Burnaby, Canada", "Vancouver, Canada", "Toronto, Canada"],
# user_levels=["Mid", "Senior", "Manager"],
# user_job_types=["Full-time", "Permanent"]
# )
# # Выводим вакансии
# for job in jobs:
# print(job.job_title, job.location, job.job_level, job.job_type)
# ads = await add_jobs(db, user_id)
# get_jobs = await get_applied_jobs(db, user_id)
# # print(f"Полученные заявки: {get_jobs}")
# except KeyError as e:
# print(f"Ошибка при извлечении данных: {e}")
# raise HTTPException(status_code=400, detail="Missing required field in json_data")
# else:
# # print(f"Неверный формат данных: {type(data.json_data)}")
# raise HTTPException(status_code=400, detail="Invalid data format")
# return {"status": "ok", "message": "JSON получен"}
@router.post("/client_update", summary="Обновления клиента",
description="Этот эндпоинт получает ID пользователя, переходит по ссылки что бы получить json_data")
async def client_update(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
await get_update(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, }
@router.post("/client_jobs/", summary="Получить список работ по клиенту",
description="Этот эндпоинт получает ID пользователя, в ответ отдаёт список вакансий")
async def client_jobs(data: update, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
get_jobs = await get_applied_jobs(db, user_id)
print(f"Полученные данные: user_id={user_id}")
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "get_jobs": get_jobs}
# return {"message": "JSON получен", "data": get_jobs}
@router.post("/avtopilot", summary="Автопилот вкл, выкл",
description="Этот эндпоинт получает ID пользователя, включает или отключает автопилот. При false все вакансии со статусом Scheduled становятся Paused при true наоборот!")
async def avtopilot(data: avtopilots, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
avtopilotss = data.avtopilot # Так как data - это объект Pydantic модели
await get_avtopilot(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, "avtopilotss": avtopilotss}
@router.post("/jobs_delete", summary="Удаление вакансии",
description="Этот эндпоинт получает ID пользователя и ID вакансии, Удаляет у пользователя вакансию")
async def jobs_delete(data: jobs_delete, x_api_key: str = Header(...), db: Session = Depends(get_async_session)):
if x_api_key != "4545454":
raise HTTPException(status_code=403, detail="Invalid API Key")
try:
user_id = data.user_id # Обратите внимание на точку вместо квадратных скобок
job_id = data.job_id # Так как data - это объект Pydantic модели
await get_delite(db, data)
except Exception as e:
print(f"Ошибка при обработке данных: {e}")
raise HTTPException(status_code=400, detail="Error processing data")
return {"status": "ok", "message": "Data received", "user_id": user_id, "job_id": job_id}