217 lines
8.9 KiB
Python
217 lines
8.9 KiB
Python
from fastapi import FastAPI, HTTPException, APIRouter, Request, Header, Depends
|
||
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
|
||
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
|
||
|
||
|
||
|
||
|
||
@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")
|
||
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 # Обратите внимание на точку вместо квадратных скобок
|
||
|
||
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", "user_id": user_id, }
|
||
|
||
|
||
|
||
@router.post("/client_jobs/")
|
||
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")
|
||
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 модели
|
||
|
||
print(f"Полученные данные: user_id={user_id}, avtopilotss={avtopilotss}")
|
||
|
||
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")
|
||
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 модели
|
||
|
||
print(f"Полученные данные: user_id={user_id}, job_id={job_id}")
|
||
|
||
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}
|