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
69 lines
2.1 KiB
YAML
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)
|