clupilot/app/database/migrations
Boban Blaskovic 030185f02e URL-prefix workspace routing: /w/{public_id}/... persistent in path
User: 'workspace stays in URL only until tab change' + 'use random 25-char
string or UUID for workspace identifier'.

Migration:
- workspaces.public_id: varchar(25) unique nullable.
- Backfill existing rows with Str::random(25).

Workspace model:
- Auto-fill public_id on create via booted() with collision-check loop.
- Override getRouteKeyName() → 'public_id' so route-model-binding uses
  the opaque public_id everywhere (not the guessable slug).

Routes:
- Authed routes wrapped in prefix 'w/{wsId}' → URL shape
  /w/bPSyuQpMDI0bl0LBKlwVOLdsl/dashboard etc.
- Bare /dashboard /sites /servers etc. now redirect to current
  workspace's prefixed URL (covers external bookmarks / first visit).

ResolveCurrentWorkspace middleware:
- Resolution priority: route param {wsId} → ?workspace query →
  session sticky → user.current_workspace_id → first owned.
- On resolve: URL::defaults(['wsId' => public_id]) auto-injects param
  into every route() call, so all Volt wire:navigate / @route()
  helpers carry the workspace through the entire SPA session.
- forceFill + saveQuietly to avoid triggering observers on user.

Sidebar:
- Workspace-switch links now point to /w/{public_id}/dashboard (not
  the slug ?workspace=…).

TestCase:
- URL::defaults({wsId: 'test-workspace'}) so route('dashboard') etc.
  generates valid URLs in tests.
- actingAsWithWorkspace() helper for tests that need a real workspace
  bound to a logged-in user.

Browser-verified: click Sidebar → Sites navigates to
/w/bPSyuQpMDI0bl0LBKlwVOLdsl/sites, public_id sticks across every
internal navigation. 36/36 Page-Pest still green.
2026-06-01 01:34:38 +02:00
..
0001_01_01_000000_create_users_table.php Migrate all primary keys + foreign keys to UUID (HasUuids trait) 2026-06-01 00:00:44 +02:00
0001_01_01_000001_create_cache_table.php Initial CluPilot stack setup 2026-05-27 23:00:14 +02:00
0001_01_01_000002_create_jobs_table.php Migrate all primary keys + foreign keys to UUID (HasUuids trait) 2026-06-01 00:00:44 +02:00
2026_05_31_190000_create_workspaces_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_191000_add_public_id_to_workspaces.php URL-prefix workspace routing: /w/{public_id}/... persistent in path 2026-06-01 01:34:38 +02:00
2026_05_31_195000_add_current_workspace_to_users.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200000_create_clusters_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200001_create_servers_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200002_create_sites_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200003_create_backups_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200004_create_team_members_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200005_create_invitations_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200006_create_security_events_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200007_create_certificates_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200008_create_activities_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00
2026_05_31_200009_create_crons_table.php Step 1/5: Workspace multi-tenancy foundation 2026-06-01 01:12:00 +02:00