Обновить routers/client.py
This commit is contained in:
		
							parent
							
								
									32d070d8ce
								
							
						
					
					
						commit
						675eca167b
					
				| 
						 | 
				
			
			@ -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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue