linkedin2/routers/client.py

157 lines
6.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import FastAPI, HTTPException, APIRouter, Request, Header, Depends
from fastapi.responses import JSONResponse
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
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):
client = clients.get(client_id) # Используй clients вместо clients_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]
@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 {"message": "JSON получен", "data": jobs }
@router.post("/client_jobs/")
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:
user_id = data.json_data['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 {"message": "JSON получен", "data": get_jobs}