From 3d770ba0f5038121a8396d7a0770f7978280912a Mon Sep 17 00:00:00 2001 From: host Date: Sun, 9 Aug 2026 14:31:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B7=D0=B0=D1=89=D0=B8=D1=89=D1=91=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20CRUD=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/routers/templates.py | 58 ++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 backend/app/routers/templates.py diff --git a/backend/app/routers/templates.py b/backend/app/routers/templates.py new file mode 100644 index 0000000..adca069 --- /dev/null +++ b/backend/app/routers/templates.py @@ -0,0 +1,58 @@ +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy import select +from sqlalchemy.exc import IntegrityError +from sqlalchemy.orm import Session + +from .. import models, schemas +from ..database import get_db +from ..deps import get_current_user, require_admin + +router = APIRouter(prefix="/templates", tags=["templates"]) + + +@router.get("", response_model=list[schemas.TemplateOut]) +def list_templates( + db: Session = Depends(get_db), + _: models.User = Depends(get_current_user), +): + """Возвращает только активные шаблоны.""" + return list( + db.scalars( + select(models.Template) + .where(models.Template.is_active.is_(True)) + .order_by(models.Template.created_at.desc()) + ) + ) + + +@router.post("", response_model=schemas.TemplateOut, status_code=status.HTTP_201_CREATED) +def create_template( + payload: schemas.TemplateCreate, + db: Session = Depends(get_db), + _: models.User = Depends(require_admin), +): + """Создаёт шаблон только от имени администратора.""" + template = models.Template(**payload.model_dump()) + db.add(template) + try: + db.commit() + except IntegrityError: + db.rollback() + raise HTTPException(status_code=409, detail="Шаблон с таким именем уже существует") + db.refresh(template) + return template + + +@router.delete("/{template_id}") +def deactivate_template( + template_id: int, + db: Session = Depends(get_db), + _: models.User = Depends(require_admin), +): + """Деактивирует шаблон без удаления связанных инстансов.""" + template = db.get(models.Template, template_id) + if template is None: + raise HTTPException(status_code=404, detail="Шаблон не найден") + template.is_active = False + db.commit() + return {"ok": True}