/
sergek12
/
Selectel_Python_developer
Обзор
Документация
Войти
/
sergek12
/
Selectel_Python_developer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
app/api/v1/vacancies.py
84 строки
3 KB
AmbrellaNotEvil
Add files via upload
15 мар 2026, 22:56
Не верифицирован
15 мар 2026, 22:56
442fbbd
Код
Авторство
О чём код?
from typing import List, Optional from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.crud.vacancy import ( create_vacancy, delete_vacancy, get_vacancy, get_vacancy_by_external_id, list_vacancies, update_vacancy, ) from app.db.session import async_session_maker from app.schemas.vacancy import VacancyCreate, VacancyRead, VacancyUpdate router = APIRouter(prefix="/vacancies", tags=["vacancies"]) async def get_session() -> AsyncSession: async with async_session_maker() as session: yield session @router.get("/", response_model=List[VacancyRead]) async def list_vacancies_endpoint( timetable_mode_name: Optional[str] = None, city: Optional[str] = None, session: AsyncSession = Depends(get_session), ) -> List[VacancyRead]: return await list_vacancies(session, timetable_mode_name, city) @router.get("/{vacancy_id}", response_model=VacancyRead) async def get_vacancy_endpoint( vacancy_id: int, session: AsyncSession = Depends(get_session) ) -> VacancyRead: vacancy = await get_vacancy(session, vacancy_id) if not vacancy: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not found") return vacancy @router.post("/", response_model=VacancyRead, status_code=status.HTTP_201_CREATED) async def create_vacancy_endpoint( payload: VacancyCreate, session: AsyncSession = Depends(get_session) ) -> VacancyRead: if payload.external_id is not None: existing = await get_vacancy_by_external_id(session, payload.external_id) if existing: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Vacancy with external_id already exists", ) return await create_vacancy(session, payload) @router.put("/{vacancy_id}", response_model=VacancyRead) async def update_vacancy_endpoint( vacancy_id: int, payload: VacancyUpdate, session: AsyncSession = Depends(get_session), ) -> VacancyRead: vacancy = await get_vacancy(session, vacancy_id) if not vacancy: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not found") if payload.external_id is not None: existing = await get_vacancy_by_external_id(session, payload.external_id) if existing and existing.id != vacancy_id: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Vacancy with external_id already exists", ) return await update_vacancy(session, vacancy, payload) @router.delete("/{vacancy_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_vacancy_endpoint( vacancy_id: int, session: AsyncSession = Depends(get_session) ) -> None: vacancy = await get_vacancy(session, vacancy_id) if not vacancy: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Not found") await delete_vacancy(session, vacancy)