feat: phase 3 - field-level permissions with plugin field definitions, service-layer filtering, 20 core field definitions

This commit is contained in:
Agent Zero
2026-07-15 23:02:30 +02:00
parent 08fd3ab72c
commit beaca24480
9 changed files with 106 additions and 4 deletions
+15 -1
View File
@@ -35,6 +35,12 @@ def _company_to_dict(c: Company, include_contacts: bool = False) -> dict[str, An
return data
def _filter_company_fields(data: dict, resolved_perms: dict) -> dict:
"""Filter company fields based on field-level permissions."""
from app.core.permissions import filter_fields_by_permission
return filter_fields_by_permission(data, resolved_perms, "companies")
async def list_companies(
db: AsyncSession,
tenant_id: uuid.UUID,
@@ -44,6 +50,7 @@ async def list_companies(
industry: str | None = None,
sort_by: str = "name",
sort_order: str = "asc",
resolved_perms: dict | None = None,
) -> dict[str, Any]:
"""List companies with pagination, FTS search, industry filter, and sorting."""
page = max(1, page)
@@ -83,8 +90,12 @@ async def list_companies(
result = await db.execute(paginated)
companies = result.scalars().all()
items = [_company_to_dict(c) for c in companies]
if resolved_perms is not None:
items = [_filter_company_fields(item, resolved_perms) for item in items]
return {
"items": [_company_to_dict(c) for c in companies],
"items": items,
"total": total,
"page": page,
"page_size": page_size,
@@ -95,6 +106,7 @@ async def get_company_detail(
db: AsyncSession,
tenant_id: uuid.UUID,
company_id: uuid.UUID,
resolved_perms: dict | None = None,
) -> dict[str, Any] | None:
"""Get a single company with its contacts array."""
q = select(Company).where(
@@ -133,6 +145,8 @@ async def get_company_detail(
}
)
data["contacts"] = contacts_list
if resolved_perms is not None:
data = _filter_company_fields(data, resolved_perms)
return data