Files

341 lines
12 KiB
JSON
Raw Permalink Normal View History

{
"doc": "02-extension-points",
"agent": "2/20",
"generated_for": "admin-roles-support",
"desired": {
"legacy_limited_nav": [
"dashboard.overview",
"catalog.products",
"feeds.list",
"feeds.export_feeds",
"catalog.categories",
"catalog.attributes",
"catalog.standard_fields",
"billing.overview",
"settings.profile"
],
"legacy_explicitly_off_examples": [
"processing.monitor",
"stores.hub",
"marketing.campaigns",
"marketing.brand_kit",
"marketing.seo",
"marketing.content_calendar",
"marketing.reviews"
],
"staff_roles": ["admin", "developer", "support_staff"],
"staff_access": {
"admin": "full /admin and /api/admin",
"developer": "full /admin and /api/admin (align with admin; keep prod-blocked dev-password/impersonate as env gate)",
"support_staff": "support ticket queue/reply/assign only; no billing/plan/settings mutation"
}
},
"current_role_model": {
"platform": {
"mechanism": "boolean users.is_platform_admin",
"symbols": [
{
"name": "IsPlatformAdmin",
"kind": "method",
"path": "apps/api/internal/auth/invites.go",
"line": 209,
"sym": "sym:descrybe-v2:apps/api/internal/auth/invites.go:209:IsPlatformAdmin"
},
{
"name": "RequirePlatformAdmin",
"kind": "method",
"path": "apps/api/internal/httpapi/middleware.go",
"line": 245,
"sym": "sym:descrybe-v2:apps/api/internal/httpapi/middleware.go:245:RequirePlatformAdmin"
},
{
"name": "checkPlatformAdmin",
"kind": "method",
"path": "apps/api/internal/httpapi/middleware.go",
"line": 262,
"sym": "sym:descrybe-v2:apps/api/internal/httpapi/middleware.go:262:checkPlatformAdmin"
},
{
"name": "requirePlatformAdmin",
"kind": "function",
"path": "apps/web/src/lib/admin-gate.ts",
"line": 8,
"sym": "sym:descrybe-v2:apps/web/src/lib/admin-gate.ts:8:requirePlatformAdmin"
},
{
"name": "applyPlatformAdmins",
"kind": "function",
"path": "apps/api/cmd/migrator/admins.go",
"line": 13,
"sym": "sym:descrybe-v2:apps/api/cmd/migrator/admins.go:13:applyPlatformAdmins"
}
],
"missing": ["staff_role enum", "support_staff", "developer role", "assign-staff APIs"]
},
"company_membership": {
"roles": ["admin", "member"],
"api_key_role": "api",
"symbols": [
{
"name": "CompanyAdminAllowed",
"path": "apps/api/internal/httpapi/middleware.go",
"line": 43
},
{
"name": "allowCompanyAdminOrPlatform",
"path": "apps/api/internal/httpapi/middleware.go",
"line": 58
}
]
},
"support_message_author_roles": ["user", "agent", "system"],
"note": "author_role=agent is message authorship, not users.staff_role"
},
"admin_web_routes": {
"nav_component": {
"name": "AdminNav",
"path": "apps/web/src/lib/components/AdminNav.svelte",
"line": 30,
"menu_items": [
"/admin",
"/admin/users",
"/admin/analytics",
"/admin/billing",
"/admin/support",
"/admin/stuck-products",
"/admin/settings"
]
},
"layout_gate": {
"path": "apps/web/src/routes/+layout.svelte",
"showAdminNav": "me.user.is_platform_admin"
},
"pages": [
{ "href": "/admin", "file": "apps/web/src/routes/admin/+page.svelte", "in_nav": true },
{ "href": "/admin/users", "file": "apps/web/src/routes/admin/users/+page.svelte", "in_nav": true },
{ "href": "/admin/analytics", "file": "apps/web/src/routes/admin/analytics/+page.svelte", "in_nav": true },
{ "href": "/admin/billing", "file": "apps/web/src/routes/admin/billing/+page.svelte", "in_nav": true, "hosts": "PlanPermissionsPanel" },
{ "href": "/admin/support", "file": "apps/web/src/routes/admin/support/+page.svelte", "in_nav": true },
{ "href": "/admin/support/[id]", "file": "apps/web/src/routes/admin/support/[id]/+page.svelte", "in_nav": false },
{ "href": "/admin/stuck-products", "file": "apps/web/src/routes/admin/stuck-products/+page.svelte", "in_nav": true },
{ "href": "/admin/settings", "file": "apps/web/src/routes/admin/settings/+page.svelte", "in_nav": true },
{ "href": "/admin/tasks-cleanup", "file": "apps/web/src/routes/admin/tasks-cleanup/+page.svelte", "in_nav": false },
{ "href": "/admin/logs", "file": "apps/web/src/routes/admin/logs/+page.svelte", "in_nav": false },
{ "href": "/admin/bootstrap", "file": "apps/web/src/routes/admin/bootstrap/+page.svelte", "in_nav": false },
{ "href": "/admin/migrate-organizations", "file": "apps/web/src/routes/admin/migrate-organizations/+page.svelte", "in_nav": false }
]
},
"admin_api": {
"mount": {
"path": "apps/api/internal/httpapi/server.go",
"line": 294,
"middleware": ["RequireSession", "RequirePlatformAdmin"],
"prefix": "/api/admin"
},
"routes": [
"GET /users",
"POST /users/{id}/dev-password",
"POST /users/{id}/impersonate",
"GET /companies",
"GET /readiness",
"GET /analytics",
"GET /jobs",
"POST /jobs/stuck-cleanup",
"GET|PUT /settings",
"POST /settings/mail/test",
"GET|POST /plans",
"GET|PUT /plans/{planID}/features",
"POST /plans/{planID}/features/enable-all",
"POST /plans/{planID}/features/disable-all",
"GET|PUT /feature-gates",
"PUT /feature-gates/sections/{section}",
"POST /plans/assign",
"POST /credits",
"POST /billing/run-cycles",
"POST /emails/set-password",
"GET /support/tickets",
"GET /support/tickets/{id}",
"POST /support/tickets/{id}/messages",
"PATCH /support/tickets/{id}"
],
"dev_handlers": {
"path": "apps/api/internal/httpapi/admin_dev_handlers.go",
"production": "404 / blocked"
}
},
"plan_permissions_panel": {
"component": {
"name": "PlanPermissionsPanel",
"path": "apps/web/src/lib/components/admin/PlanPermissionsPanel.svelte",
"line": 84
},
"client": {
"path": "apps/web/src/lib/admin-plan-permissions.ts",
"symbols": [
"isPlanPermissionsApiUnavailable",
"listAdminPlansWithFeatures",
"loadFeatureGates",
"saveFeatureGates",
"enableAllPlanFeatures",
"disableAllPlanFeatures"
]
},
"catalog": "apps/web/src/lib/plan-feature-catalog.ts",
"host": "apps/web/src/routes/admin/billing/+page.svelte",
"prior_doc": "docs/plan-permissions/08-admin-ui.md"
},
"plans_is_custom_legacy_a1": {
"symbols": [
{
"name": "IsPublicProductPlan",
"path": "apps/api/internal/billing/service.go",
"line": 485,
"public_names": ["Free", "Starter", "Growth", "Business", "Enterprise"]
},
{
"name": "IsCustomPackage",
"path": "apps/api/internal/billing/custom_package_features.go",
"line": 19,
"rule": "isCustom || !IsPublicProductPlan(name)",
"sym": "sym:descrybe-v2:apps/api/internal/billing/custom_package_features.go:19:IsCustomPackage"
},
{
"name": "DefaultPlanFeatures",
"path": "apps/api/internal/billing/plan_features.go",
"line": 71,
"custom_default": "all FeatureCatalogKeys true"
},
{
"name": "prepareCustomPackageCreateFeatures",
"path": "apps/api/internal/billing/custom_package_features.go",
"line": 49
}
],
"a1_as_test_fixture": {
"tests": "apps/api/internal/billing/custom_package_features_test.go",
"behavior": "plan name A1 ⇒ IsCustomPackage true ⇒ all features ON"
},
"company_a1": {
"legacy_mysql_name": "A1 Slovenija",
"legacy_company_id": "97e1a309-3d23-4aa2-b518-8e8d7afdfec7",
"postgres_company_id": "ee246275-dec0-4446-9e83-58d0c16c258a",
"display_name_after_seed": "Local Demo Co",
"seed_plan": "Enterprise",
"seed_is_custom": true,
"docs": ["docs/demo-user.md", "docs/migrate-from-descrybe-new.md"]
},
"is_legacy_flag": false,
"legacy_feature_profile": false
},
"support": {
"tenant": {
"ui": [
"apps/web/src/routes/support/+page.svelte",
"apps/web/src/routes/support/new/+page.svelte",
"apps/web/src/routes/support/[ticketId]/+page.svelte"
],
"api_prefix": "/api/support",
"handlers_file": "apps/api/internal/httpapi/support_handlers.go",
"auth": "RequireSession + RequireCompany"
},
"admin": {
"ui": [
"apps/web/src/routes/admin/support/+page.svelte",
"apps/web/src/routes/admin/support/[id]/+page.svelte"
],
"client": "apps/web/src/lib/support/admin-api.ts",
"api_prefix": "/api/admin/support",
"auth": "RequirePlatformAdmin only",
"service_symbols": [
{
"name": "ListAdmin",
"path": "apps/api/internal/support/tickets.go",
"line": 80
},
{
"name": "GetAdmin",
"path": "apps/api/internal/support/tickets.go",
"line": 158
},
{
"name": "ReplyAsAgent",
"path": "apps/api/internal/support/tickets.go",
"line": 325
},
{
"name": "UpdateAdmin",
"path": "apps/api/internal/support/tickets.go",
"line": 428,
"supports": ["status", "priority", "assignee_admin_user_id", "clear_assignee"]
}
],
"schema": "apps/api/sql/schema/025_support_center.sql"
},
"csat_rating": false,
"staff_inbox_filter": false
},
"tenant_nav_gating": {
"component": "apps/web/src/lib/components/Nav.svelte",
"mechanism": "planCapabilities.can(featureKey); adminOnly uses showAdmin",
"processing_item": {
"href": "/processing",
"feature": "processing.monitor",
"desired_for_legacy": "off"
}
},
"extension_points": [
{
"id": "staff-rbac",
"prefer": "extend RequirePlatformAdmin / checkPlatformAdmin",
"add": "users.staff_role (admin|developer|support_staff) additive migration",
"apis": "list/assign staff roles (admin-only)",
"web": "filter AdminNav + requirePlatformAdmin → requireStaffCapability"
},
{
"id": "legacy-feature-profile",
"prefer": "extend DefaultPlanFeatures + seed/ApplyDefaultMatrix",
"detect": ["plan name patterns (A1, …)", "optional plans.is_legacy", "company flag if needed"],
"do_not_conflate": "is_custom / IsCustomPackage enable-all packaging",
"ui": "PlanPermissionsPanel legacy badge + apply profile"
},
{
"id": "support-staff-least-privilege",
"prefer": "same /api/admin/support/* handlers with role-aware middleware",
"optional": "ListAdmin filter by assignee; claim/unassign UX",
"block_for_support_staff": ["/api/admin/plans*", "/api/admin/credits", "/api/admin/settings", "/api/admin/billing/*"]
},
{
"id": "support-csat",
"status": "absent",
"hook": "after ticket resolved/closed — new columns + tenant UI"
}
],
"gaps": [
{
"desired": "legacy limited nav",
"current": "A1/custom/Enterprise resolve to all features ON",
"severity": "high"
},
{
"desired": "admin/developer full admin",
"current": "single is_platform_admin boolean; no developer role",
"severity": "high"
},
{
"desired": "support_staff ticket access only",
"current": "support admin requires full platform admin (same as billing)",
"severity": "high"
},
{
"desired": "staff assign from orgs UI",
"current": "users list badge only; bootstrap cannot create admins",
"severity": "medium"
},
{
"desired": "CSAT / ratings",
"current": "not in support package",
"severity": "medium"
}
]
}