69 lines
2.1 KiB
Python
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}
|