fix: workspace membership + middleware owner fallback
- DemoDataSeeder now creates workspace_members record for owner + sets default_workspace_id - ResolveWorkspace middleware accepts workspace owners even without explicit member record - Applied membership fix for nexxo@nimuli.com via PHP (existing installs) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>main
parent
52d52824bc
commit
ef0105098b
|
|
@ -20,7 +20,9 @@ class ResolveWorkspace
|
||||||
|
|
||||||
// 404 instead of 403 — don't leak existence across workspace boundaries
|
// 404 instead of 403 — don't leak existence across workspace boundaries
|
||||||
$user = $request->user();
|
$user = $request->user();
|
||||||
if (! $user || ! $user->workspaceMemberships()->where('workspace_id', $workspace->id)->exists()) {
|
$isMember = $user && $user->workspaceMemberships()->where('workspace_id', $workspace->id)->exists();
|
||||||
|
$isOwner = $user && $workspace->owner_id === $user->id;
|
||||||
|
if (! $isMember && ! $isOwner) {
|
||||||
abort(404);
|
abort(404);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ namespace Database\Seeders;
|
||||||
use App\Domains\Analytics\Models\Click;
|
use App\Domains\Analytics\Models\Click;
|
||||||
use App\Domains\Link\Models\Link;
|
use App\Domains\Link\Models\Link;
|
||||||
use App\Domains\Workspace\Models\Workspace;
|
use App\Domains\Workspace\Models\Workspace;
|
||||||
|
use App\Domains\Workspace\Models\WorkspaceMember;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
|
|
@ -24,6 +25,13 @@ class DemoDataSeeder extends Seeder
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Ensure owner has a membership record and default workspace set
|
||||||
|
WorkspaceMember::firstOrCreate(
|
||||||
|
['workspace_id' => $workspace->id, 'user_id' => $user->id],
|
||||||
|
['role' => 'owner', 'joined_at' => now()]
|
||||||
|
);
|
||||||
|
$user->updateQuietly(['default_workspace_id' => $workspace->id]);
|
||||||
|
|
||||||
$this->command->info("Workspace: {$workspace->name} ({$workspace->ulid})");
|
$this->command->info("Workspace: {$workspace->name} ({$workspace->ulid})");
|
||||||
|
|
||||||
$slugs = ['nimuli', 'get-started', 'pricing', 'blog', 'docs', 'github', 'twitter', 'linkedin', 'youtube', 'discord', 'product', 'api', 'signup', 'login-link', 'partner', 'careers', 'press', 'legal', 'status', 'support'];
|
$slugs = ['nimuli', 'get-started', 'pricing', 'blog', 'docs', 'github', 'twitter', 'linkedin', 'youtube', 'discord', 'product', 'api', 'signup', 'login-link', 'partner', 'careers', 'press', 'legal', 'status', 'support'];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue