Restore AI workflow design nodes
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
"""
|
||||
Lightweight form metadata API for AI workflow panels.
|
||||
"""
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlalchemy import and_, func, or_, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.base_schema import PaginatedResponse
|
||||
from app.database import get_db
|
||||
from core.application.model import Application
|
||||
from online_dev.form_manager.model import FormMeta
|
||||
|
||||
router = APIRouter(prefix="/forms", tags=["AI-Forms"])
|
||||
|
||||
|
||||
def _build_form_list_out(form, application_name: str = "", application_code: str = "") -> dict:
|
||||
return {
|
||||
"id": str(form.id),
|
||||
"application_id": form.application_id,
|
||||
"application_name": application_name or "Main App",
|
||||
"application_code": application_code or "",
|
||||
"name": form.name,
|
||||
"code": form.code,
|
||||
"status": form.status,
|
||||
}
|
||||
|
||||
|
||||
@router.get("/list", summary="List form metadata for AI workflow form-data nodes")
|
||||
async def list_forms(
|
||||
application_id: Optional[str] = Query(None, alias="applicationId"),
|
||||
name: Optional[str] = Query(None),
|
||||
code: Optional[str] = Query(None),
|
||||
status: Optional[str] = Query(None),
|
||||
include_globally_visible: bool = Query(False, alias="includeGloballyVisible"),
|
||||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(20, ge=1, le=100, alias="pageSize"),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
conditions = [FormMeta.is_deleted.is_(False)]
|
||||
|
||||
if application_id:
|
||||
app_condition = FormMeta.application_id == application_id
|
||||
if include_globally_visible:
|
||||
app_condition = or_(
|
||||
app_condition,
|
||||
and_(
|
||||
FormMeta.globally_visible.is_(True),
|
||||
FormMeta.status == "published",
|
||||
),
|
||||
)
|
||||
conditions.append(app_condition)
|
||||
elif not include_globally_visible:
|
||||
conditions.append(FormMeta.application_id.is_(None))
|
||||
else:
|
||||
conditions.append(
|
||||
or_(
|
||||
FormMeta.application_id.is_(None),
|
||||
and_(
|
||||
FormMeta.globally_visible.is_(True),
|
||||
FormMeta.status == "published",
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
if name:
|
||||
conditions.append(FormMeta.name.ilike(f"%{name}%"))
|
||||
if code:
|
||||
conditions.append(FormMeta.code.ilike(f"%{code}%"))
|
||||
if status:
|
||||
conditions.append(FormMeta.status == status)
|
||||
|
||||
count_stmt = select(func.count(FormMeta.id)).where(and_(*conditions))
|
||||
total = (await db.execute(count_stmt)).scalar() or 0
|
||||
|
||||
offset = (page - 1) * page_size
|
||||
stmt = (
|
||||
select(
|
||||
FormMeta,
|
||||
Application.name.label("application_name"),
|
||||
Application.code.label("application_code"),
|
||||
)
|
||||
.outerjoin(Application, FormMeta.application_id == Application.id)
|
||||
.where(and_(*conditions))
|
||||
.order_by(FormMeta.sort, FormMeta.sys_create_datetime.desc())
|
||||
.offset(offset)
|
||||
.limit(page_size)
|
||||
)
|
||||
result = await db.execute(stmt)
|
||||
|
||||
items = [
|
||||
_build_form_list_out(form, application_name, application_code)
|
||||
for form, application_name, application_code in result
|
||||
]
|
||||
return PaginatedResponse(items=items, total=total)
|
||||
Reference in New Issue
Block a user