/
tsps
/
core
Обзор
Документация
Войти
/
tsps
/
core
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/api/admin/case_entities.py
122 строки
4 KB
Василий Петров
Разделение ролей - защита delete
24 мар 2026, 17:43
24 мар 2026, 17:43
8523537
Код
Авторство
О чём код?
from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session from typing import Optional from app.database import get_db from app.models.case_entity import CaseEntity from app.schemas.case_entity import CaseEntityCreate, CaseEntityRead, CaseEntityUpdate from app.schemas.common import PaginationOut from app.core.security import get_current_admin_id, require_superadmin import logging logger = logging.getLogger(__name__) router = APIRouter( prefix="/case-entities", tags=["admin", "case_entities"], dependencies=[Depends(get_current_admin_id)] # защищаем все методы роутера ) @router.post("", response_model=CaseEntityRead, status_code=status.HTTP_201_CREATED) def create_case_entity( case_entity_in: CaseEntityCreate, admin_id: int = Depends(get_current_admin_id), db: Session = Depends(get_db) ): case_entity = CaseEntity(number=case_entity_in.number) db.add(case_entity) try: db.commit() db.refresh(case_entity) logger.info(f"Админ {admin_id} создал дело: {case_entity.number} (ID={case_entity.id})") except IntegrityError: db.rollback() raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Дело с таким номером уже существует" ) return case_entity @router.get("", response_model=PaginationOut[CaseEntityRead]) def read_case_entities( skip: int = 0, limit: int = 100, number: Optional[str] = None, db: Session = Depends(get_db) ): query = db.query(CaseEntity) if number: query = query.filter(CaseEntity.number.ilike(f"%{number}%")) total = query.count() case_entities = query.order_by(CaseEntity.id).offset(skip).limit(limit).all() return { "items": case_entities, "total": total, "skip": skip, "limit": limit } @router.get("/{case_entity_id}", response_model=CaseEntityRead) def read_case_entity(case_entity_id: int, db: Session = Depends(get_db)): case_entity = db.get(CaseEntity, case_entity_id) if not case_entity: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Дело не найдено" ) return case_entity @router.patch("/{case_entity_id}", response_model=CaseEntityRead) def update_case_entity( case_entity_id: int, case_entity_update: CaseEntityUpdate, admin_id: int = Depends(get_current_admin_id), db: Session = Depends(get_db) ): case_entity = db.get(CaseEntity, case_entity_id) if not case_entity: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Дело не найдено" ) update_data = case_entity_update.model_dump(exclude_unset=True) if not update_data: return case_entity try: for field, value in update_data.items(): setattr(case_entity, field, value) db.commit() db.refresh(case_entity) logger.info(f"Админ {admin_id} обновил дело: {case_entity.number} (ID={case_entity.id})") except IntegrityError: db.rollback() raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Дело с таким номером уже существует" ) return case_entity @router.delete("/{case_entity_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_case_entity( case_entity_id: int, admin_id: int = Depends(require_superadmin), db: Session = Depends(get_db) ): case_entity = db.get(CaseEntity, case_entity_id) if not case_entity: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Дело не найдено" ) try: db.delete(case_entity) db.commit() logger.info(f"Админ {admin_id} удалил дело: {case_entity.number} (ID={case_entity.id})") except IntegrityError: db.rollback() raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Невозможно удалить дело: существуют связанные записи" ) return