$currentTeam->id, ]; } /** * @param array}> $projects * @return array{0: array{uuid: string, name: string, environments: array}|null, 1: array{uuid: string, name: string}|null} */ protected function selectedProjectAndEnvironment(Request $request, array $projects): array { $selectedProjectUuid = $request->query('project', $request->session()->get(self::SELECTED_PROJECT_SESSION_KEY)); $selectedEnvironmentUuid = $request->query('environment', $request->session()->get(self::SELECTED_ENVIRONMENT_SESSION_KEY)); $selectedProject = null; foreach ($projects as $project) { if ($project['uuid'] === $selectedProjectUuid) { $selectedProject = $project; break; } } $selectedProject ??= $projects[0] ?? null; $selectedEnvironment = null; foreach ($selectedProject['environments'] ?? [] as $environment) { if ($environment['uuid'] === $selectedEnvironmentUuid) { $selectedEnvironment = $environment; break; } } $selectedEnvironment ??= $selectedProject['environments'][0] ?? null; if ($request->query->has('project') || $request->query->has('environment')) { $request->session()->put([ self::SELECTED_PROJECT_SESSION_KEY => $selectedProject['uuid'] ?? null, self::SELECTED_ENVIRONMENT_SESSION_KEY => $selectedEnvironment['uuid'] ?? null, ]); } return [$selectedProject, $selectedEnvironment]; } protected function selectedEnvironment(Project $project, ?string $environmentUuid): ?Environment { if ($environmentUuid === null) { return $project->environments->first(); } $environment = $project->environments->firstWhere('uuid', $environmentUuid); if (! $environment instanceof Environment) { abort(422, 'The selected environment is not available for the selected project.'); } return $environment; } /** * @return array}> */ protected function projects(mixed $currentTeam): array { if (! $currentTeam instanceof Team) { return []; } return $this->projectQuery($currentTeam) ->get() ->map(fn (Project $project) => [ 'uuid' => $project->uuid, 'name' => $project->name, 'environments' => $project->environments ->map(fn ($environment) => [ 'uuid' => $environment->uuid, 'name' => $environment->name, ]) ->all(), ]) ->all(); } protected function projectQuery(Team $currentTeam): Builder { return Project::query() ->select(['id', 'uuid', 'name', 'team_id']) ->where('team_id', $currentTeam->id) ->with(['environments' => fn ($query) => $query ->select(['id', 'uuid', 'name', 'project_id']) ->orderByRaw("CASE WHEN LOWER(name) = 'production' THEN 0 ELSE 1 END") ->orderByRaw('LOWER(name)')]) ->orderByRaw('LOWER(name)'); } }