user(); $projectQuery = Project::query() ->orderByDesc('id'); if (! $user->is_admin) { $viewableProjectIds = $this->projectPermissionService->viewableProjectIds($user); if ($viewableProjectIds === []) { return Inertia::render('projects/Index', [ 'projects' => [], ]); } $projectQuery->whereIn('id', $viewableProjectIds); } return Inertia::render('projects/Index', [ 'projects' => $projectQuery ->get(), ]); } public function create(): Response { return Inertia::render('projects/Create'); } public function store(StoreProjectRequest $request): RedirectResponse { $project = Project::query()->create($request->validated()); $this->initializeProjectTicketMetadata->handle($project); $this->projectPermissionService->grantAllProjectPermissions($project, $request->user()); return to_route('projects.show', $project); } public function show(Request $request, Project $project): Response { $user = $request->user(); abort_unless( $this->projectPermissionService->userCanViewProject($user, $project), 403, ); return Inertia::render('projects/Show', [ 'canManageAccess' => $this->projectPermissionService->userCanManageProjectAccess($user, $project), 'project' => $project, ]); } public function access(Request $request, Project $project): Response { $user = $request->user(); abort_unless( $this->projectPermissionService->userCanManageProjectAccess($user, $project), 403, ); return Inertia::render('projects/Access', [ 'directPermissions' => $this->projectPermissionService->userPermissionMap($project), 'permissionOptions' => $this->projectPermissionService->permissionOptions(), 'project' => $project, 'status' => session('status'), 'teamPermissions' => $this->projectPermissionService->teamPermissionMap($project), 'teams' => Team::query() ->with('users') ->orderBy('name') ->get() ->map(fn (Team $team): array => [ 'id' => $team->id, 'name' => $team->name, 'created_at' => $team->created_at?->toISOString(), 'updated_at' => $team->updated_at?->toISOString(), 'user_ids' => $team->users->modelKeys(), 'users' => $team->users->values(), ]), 'users' => User::query() ->orderBy('name') ->get(), ]); } public function updateUserPermissions( SyncProjectPermissionsRequest $request, Project $project, User $user, ): RedirectResponse { $user = $request->user(); abort_unless( $this->projectPermissionService->userCanManageProjectAccess($user, $project), 403, ); $validated = $request->validated(); $permissions = collect(Arr::get($validated, 'permissions')) ->map(fn (mixed $permission): string => (string) $permission) ->unique() ->values() ->all(); $this->projectPermissionService->syncUserPermissions($project, $user, $permissions); return to_route('projects.access', $project) ->with('status', "Regular User permissions were updated."); } public function updateTeamPermissions( SyncProjectPermissionsRequest $request, Project $project, Team $team, ): RedirectResponse { abort_unless( $this->projectPermissionService->userCanManageProjectAccess($request->user(), $project), 403, ); $validated = $request->validated(); $permissions = collect(Arr::get($validated, 'permissions')) ->map(fn (mixed $permission): string => (string) $permission) ->unique() ->values() ->all(); $this->projectPermissionService->syncTeamPermissions($project, $team, $permissions); return to_route('projects.access', $project) ->with('status', "{$team->name} permissions were updated."); } }