-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Expand file tree
/
Copy pathSetWorkspace.php
More file actions
89 lines (67 loc) · 2.56 KB
/
SetWorkspace.php
File metadata and controls
89 lines (67 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use App\Models\Scopes\WorkspaceScope;
use App\Models\User;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use function is_string;
final class SetWorkspace
{
/**
* @param Closure(Request): Response $next
*/
public function handle(Request $request, Closure $next): Response
{
/** @var User $user */
$user = $request->user();
if ($request->query->has('workspace')) {
$workspaceId = $request->query->getString('workspace');
$memberId = $this->resolveMembership($user, $workspaceId);
abort_if($memberId === null, 404);
$this->persist($workspaceId, $memberId);
return $next($request);
}
return $this->resolveWorkspace($user, $request);
}
private function resolveWorkspace(User $user, Request $request): Response
{
$candidate = $request->cookie('workspace');
if (is_string($candidate) && $this->resolveMembership($user, $candidate) !== null) {
return $this->redirectWithWorkspace($request, $candidate);
}
$candidate = session('workspace');
if (is_string($candidate) && $this->resolveMembership($user, $candidate) !== null) {
return $this->redirectWithWorkspace($request, $candidate);
}
$count = $user->workspaces()->count();
if ($count === 1) {
return $this->redirectWithWorkspace($request, $user->workspaces()->sole()->id);
}
// TODO: Redirect to workspace selector.
// if ($count > 1) {
// return redirect('/');
// }
// TODO: Redirect to workspace creation.
return redirect('/');
}
private function redirectWithWorkspace(Request $request, string $workspaceId): Response
{
return redirect()->to($request->fullUrlWithQuery(['workspace' => $workspaceId]));
}
private function resolveMembership(User $user, string $workspaceId): ?string
{
$id = $user->memberships()
->withoutGlobalScope(WorkspaceScope::class)
->where('workspace_id', $workspaceId)
->value('id');
return is_string($id) ? $id : null;
}
private function persist(string $workspaceId, string $memberId): void
{
session(['workspace' => $workspaceId, 'workspace_member' => $memberId]);
context(['workspace' => $workspaceId, 'workspace_member' => $memberId]);
cookie()->queue('workspace', $workspaceId, 30 * 24 * 60);
}
}