TenantAtlas/specs/067-rbac-troubleshooting/contracts/tenant-diagnostics.openapi.yaml
ahmido 3490fb9e2c feat: RBAC troubleshooting & tenant UI bugfix pack (spec 067) (#84)
Summary
Implements Spec 067 “RBAC Troubleshooting & Tenant UI Bugfix Pack v1” for the tenant admin plane (/admin) with strict RBAC UX semantics:

Non-member tenant scope ⇒ 404 (deny-as-not-found)
Member lacking capability ⇒ 403 server-side, while the UI stays visible-but-disabled with standardized tooltips
What changed
Tenant view header actions now use centralized UI enforcement (no “normal click → error page” for readonly members).
Archived tenants remain resolvable in tenant-scoped routes for entitled members; an “Archived” banner is shown.
Adds tenant-scoped diagnostics page (/admin/t/{tenant}/diagnostics) with safe repair actions (confirmation + authorization + audit log).
Adds/updates targeted Pest tests to lock the 404 vs 403 semantics and action UX.
Implementation notes
Livewire v4.0+ compliance: Uses Filament v5 + Livewire v4 conventions; widget Blade views render a single root element.
Provider registration: Laravel 11+ providers stay in providers.php (no changes required).
Global search: No global search behavior/resources changed in this PR.
Destructive actions:
Tenant archive/restore/force delete and diagnostics repairs execute via ->action(...) and include ->requiresConfirmation().
Server-side authorization is enforced (non-members 404, insufficient capability 403).
Assets: No new assets. No change to php artisan filament:assets expectations.
Tests
Ran:

vendor/bin/sail bin pint --dirty
vendor/bin/sail artisan test --compact (focused files for Spec 067)

Co-authored-by: Ahmed Darrazi <ahmeddarrazi@MacBookPro.fritz.box>
Reviewed-on: #84
2026-01-31 20:09:25 +00:00

69 lines
2.1 KiB
YAML

openapi: 3.0.3
info:
title: TenantPilot Admin — Tenant Diagnostics (Conceptual)
version: 0.1.0
description: |
Conceptual HTTP contract for tenant-scoped diagnostics and repairs.
NOTE: These routes are implemented as Filament (Livewire) pages/actions.
The exact Livewire request payload is not part of this contract; this captures
the user-visible HTTP surfaces and the logical operations.
servers:
- url: /admin
paths:
/t/{tenant}/diagnostics:
get:
summary: View tenant diagnostics page
description: |
Tenant-scoped diagnostics view. Must be tenant-member-safe:
- Non-member: 404
- Member: 200 (even if tenant is archived)
parameters:
- name: tenant
in: path
required: true
schema:
type: string
description: Filament tenancy slug (Tenant.external_id)
responses:
'200':
description: Diagnostics page rendered
content:
text/html:
schema:
type: string
'404':
description: Not found (deny-as-not-found for non-members)
'403':
description: Forbidden (member without capability attempting an action)
/t/{tenant}/diagnostics/repairs/bootstrap-owner:
post:
summary: Repair missing owner by promoting a member
description: |
Promotes the selected tenant member to owner.
Must require confirmation in the UI and enforce authorization server-side.
parameters:
- name: tenant
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [user_id]
properties:
user_id:
type: integer
description: Internal users.id
responses:
'204':
description: Repair succeeded
'403':
description: Forbidden (member lacks capability)
'404':
description: Not found (non-member)