Files
postbot/app/api/routes/templates.py

69 lines
2.1 KiB
Python

# app/api/routes/templates.py
from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import select, or_
from sqlalchemy.ext.asyncio import AsyncSession
from app.db.session import get_async_session
from app.models.templates import Template
from app.api.schemas.template import TemplateIn, TemplateOut
from app.services.templates import count_templates
router = APIRouter(prefix="/templates", tags=["templates"])
async def get_owner_id(x_user_id: int | None = None):
return x_user_id or 0
@router.post("/", response_model=TemplateOut)
async def create_tpl(
data: TemplateIn,
owner_id: int = Depends(get_owner_id),
s: AsyncSession = Depends(get_async_session),
):
tpl = Template(owner_id=owner_id, **data.model_dump())
s.add(tpl)
await s.commit()
await s.refresh(tpl)
return tpl
@router.get("/", response_model=list[TemplateOut])
async def list_tpls(
owner_id: int = Depends(get_owner_id),
limit: int = Query(20, ge=1, le=100),
offset: int = Query(0, ge=0),
q: str | None = Query(default=None),
s: AsyncSession = Depends(get_async_session),
):
stmt = select(Template).where(
Template.owner_id == owner_id,
Template.is_archived.is_(False),
)
if q:
like = f"%{q}%"
stmt = stmt.where(or_(Template.name.ilike(like), Template.title.ilike(like)))
stmt = stmt.order_by(Template.updated_at.desc()).limit(limit).offset(offset)
res = await s.execute(stmt)
return list(res.scalars())
@router.get("/count")
async def count_tpls(owner_id: int = Depends(get_owner_id), q: str | None = None):
total = await count_templates(owner_id, q)
return {"total": total}
@router.delete("/{tpl_id}")
async def delete_tpl(
tpl_id: int,
owner_id: int = Depends(get_owner_id),
s: AsyncSession = Depends(get_async_session),
):
res = await s.execute(select(Template).where(
Template.id == tpl_id,
Template.owner_id == owner_id
))
tpl = res.scalars().first()
if not tpl:
raise HTTPException(404, "not found")
await s.delete(tpl)
await s.commit()
return {"ok": True}