feat: initial commit

This commit is contained in:
2026-03-05 22:12:38 +01:00
commit bce762a783
380 changed files with 51955 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
import uuid
from typing import Any
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from pydantic import BaseModel
from app.database import get_db
from app.models.template import Template
from app.utils.auth import get_current_user, require_admin
from app.models.user import User
router = APIRouter(prefix="/templates", tags=["templates"])
class TemplateOut(BaseModel):
id: uuid.UUID
name: str
category_key: str
standard_fields: Any
component_schema: Any
description: str | None
is_active: bool
model_config = {"from_attributes": True}
class TemplateUpdate(BaseModel):
name: str | None = None
description: str | None = None
is_active: bool | None = None
standard_fields: Any = None
component_schema: Any = None
@router.get("", response_model=list[TemplateOut])
async def list_templates(
include_inactive: bool = False,
user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
q = select(Template)
# Non-admins always see only active templates
if not include_inactive or user.role.value != "admin":
q = q.where(Template.is_active == True)
result = await db.execute(q)
return result.scalars().all()
@router.get("/{template_id}", response_model=TemplateOut)
async def get_template(
template_id: uuid.UUID,
user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(select(Template).where(Template.id == template_id))
t = result.scalar_one_or_none()
if not t:
raise HTTPException(404, detail="Template not found")
return t
@router.patch("/{template_id}", response_model=TemplateOut)
async def update_template(
template_id: uuid.UUID,
body: TemplateUpdate,
user: User = Depends(require_admin),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(select(Template).where(Template.id == template_id))
t = result.scalar_one_or_none()
if not t:
raise HTTPException(404, detail="Template not found")
for field, val in body.model_dump(exclude_unset=True).items():
setattr(t, field, val)
await db.commit()
await db.refresh(t)
return t