Files
api-copp/route/groups_crud.py
jze9 94e78a9e77 fix: единый singleton engine в bd, убраны 17 локальных make_engine()
- bd/__init__.py: добавлены get_engine() и get_session() — один SQLAlchemy engine на весь процесс
- make_engine(): pool_size=5, max_overflow=5, pool_timeout=30, pool_recycle=1800
- Все 17 route-файлов: убраны локальные get_session()/make_engine(), импорт из bd
- transfer_crud.py: _get_session() → get_session() из bd
- init_data_base.py: get_engine() вместо make_engine()
- Результат: 78 idle соединений → 1
2026-05-18 11:13:28 +00:00

97 lines
2.8 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from typing import Optional
import uuid
from bd import get_session
from bd.tables.group import Group
from route.auth_utils import require_admin_key
router = APIRouter(tags=["groups"], prefix="/groups")
class GroupCreate(BaseModel):
name_group: str
class GroupUpdate(BaseModel):
name_group: Optional[str] = None
def _group_dict(grp: Group) -> dict:
return {"id": str(grp.id), "name_group": grp.name_group}
@router.post("/", status_code=201, dependencies=[Depends(require_admin_key)])
def create_group(payload: GroupCreate):
Session = get_session()
with Session() as session:
existing = session.query(Group).filter(Group.name_group == payload.name_group).first()
if existing:
raise HTTPException(status_code=400, detail="Group name already exists")
grp = Group(name_group=payload.name_group)
session.add(grp)
session.commit()
session.refresh(grp)
return _group_dict(grp)
@router.get("/")
def list_groups():
Session = get_session()
with Session() as session:
rows = session.query(Group).all()
return [_group_dict(g) for g in rows]
@router.get("/{group_id}")
def get_group(group_id: str):
Session = get_session()
try:
gid = uuid.UUID(group_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid UUID")
with Session() as session:
grp = session.get(Group, gid)
if not grp:
raise HTTPException(status_code=404, detail="Group not found")
return _group_dict(grp)
@router.put("/{group_id}", dependencies=[Depends(require_admin_key)])
def update_group(group_id: str, payload: GroupUpdate):
Session = get_session()
try:
gid = uuid.UUID(group_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid UUID")
with Session() as session:
grp = session.get(Group, gid)
if not grp:
raise HTTPException(status_code=404, detail="Group not found")
if payload.name_group is not None:
grp.name_group = payload.name_group
session.add(grp)
session.commit()
session.refresh(grp)
return _group_dict(grp)
@router.delete("/{group_id}", status_code=204, dependencies=[Depends(require_admin_key)])
def delete_group(group_id: str):
Session = get_session()
try:
gid = uuid.UUID(group_id)
except Exception:
raise HTTPException(status_code=400, detail="Invalid UUID")
with Session() as session:
grp = session.get(Group, gid)
if not grp:
raise HTTPException(status_code=404, detail="Group not found")
session.delete(grp)
session.commit()
return {}