Tenant Switch implemented Co-authored-by: Ahmed Darrazi <ahmeddarrazi@adsmac.local> Reviewed-on: #32
35 lines
1.9 KiB
Markdown
35 lines
1.9 KiB
Markdown
# Plan: Tenant Portfolio & Context Switch (031)
|
|
|
|
**Branch**: `feat/031-tenant-portfolio-context-switch`
|
|
**Date**: 2026-01-04
|
|
**Input**: [spec.md](./spec.md)
|
|
|
|
## Approach
|
|
1. Decide on the tenant context mechanism:
|
|
- Preferred: Filament tenancy (tenant in URL) + built-in tenant switcher.
|
|
- Fallback: session-based Current Tenant + visible banner (avoid global/DB state as “source of truth”).
|
|
2. Add data model pieces:
|
|
- tenant membership/role mapping
|
|
- tenant environment attribute
|
|
- optional user preferences (favorites + last used)
|
|
3. Implement a single TenantContext resolver (HTTP + console) and central authorization gate/policy:
|
|
- deny-by-default if no access
|
|
- keep `INTUNE_TENANT_ID` as console override for automation
|
|
4. Update tenant-scoped resources/services to use TenantContext instead of `Tenant::current()` and ensure base queries are tenant-scoped.
|
|
5. Extend `TenantResource` into a portfolio view:
|
|
- access-scoped query
|
|
- environment/health columns
|
|
- “Open” action + “Sync” action
|
|
- bulk “Sync selected”
|
|
6. Add restore guardrails:
|
|
- target tenant badge/header on restore pages
|
|
- type-to-confirm includes tenant/environment (e.g. `RESTORE PROD`)
|
|
7. Add targeted Pest tests for authorization, context switching, and bulk sync.
|
|
8. Run Pint + targeted tests; document rollout/migration notes.
|
|
|
|
## Decisions / Notes
|
|
- Avoid a global `tenants.is_current` UI context (unsafe for MSP); prefer per-user context.
|
|
- Avoid storing Current Tenant in the `users` table as the source of truth (cross-tab risk); prefer route/session context, optionally persisting “last used” separately.
|
|
- Start with user-based tenant memberships; extend to organization/group principals later if needed.
|
|
- Prefer deriving portfolio stats via relationships (`withCount`, `withMax`) initially; add denormalized summary columns only if needed for performance.
|