Files
KanbanGit/app/Actions/Projects/BuildProjectSettingsPayload.php
T
Twyco ff796aa10a
linter / quality (pull_request) Successful in 1m28s
tests / ci (8.4) (pull_request) Successful in 1m47s
feat: overhaul project workspace navigation
2026-07-18 17:52:25 +02:00

112 lines
4.0 KiB
PHP

<?php
namespace App\Actions\Projects;
use App\Actions\Notifications\BuildProjectNotificationSettingsPayload;
use App\Actions\Permissions\PermissionService;
use App\Actions\Repositories\BuildProjectRepositorySettingsPayload;
use App\Enums\ProjectSettingsSection;
use App\Http\Resources\PermissionOptionResource;
use App\Http\Resources\ProjectResource;
use App\Http\Resources\ProjectTemplateResource;
use App\Http\Resources\TeamResource;
use App\Http\Resources\UserResource;
use App\Models\Project;
use App\Models\ProjectTemplate;
use App\Models\Team;
use App\Models\User;
use Illuminate\Support\Arr;
class BuildProjectSettingsPayload
{
public function __construct(
private readonly BuildProjectBoardSettingsPayload $buildProjectBoardSettingsPayload,
private readonly BuildProjectNotificationSettingsPayload $buildProjectNotificationSettingsPayload,
private readonly BuildProjectRepositorySettingsPayload $buildProjectRepositorySettingsPayload,
private readonly BuildProjectTicketMetadataSettingsPayload $buildProjectTicketMetadataSettingsPayload,
private readonly PermissionService $permissionService,
private readonly ResolveProjectTemplateState $resolveProjectTemplateState,
) {}
/**
* @return array<string, mixed>
*/
public function handle(
Project $project,
User $user,
ProjectSettingsSection $section,
mixed $status = null,
mixed $error = null,
): array {
return [
'activeSection' => $section->value,
'error' => $error,
'project' => ProjectResource::make($project)->resolve(),
'sectionData' => $this->sectionData($project, $user, $section),
'status' => $status,
];
}
/**
* @return array<string, mixed>
*/
private function sectionData(
Project $project,
User $user,
ProjectSettingsSection $section,
): array {
$payload = match ($section) {
ProjectSettingsSection::General => $this->generalData($project),
ProjectSettingsSection::Board => $this->buildProjectBoardSettingsPayload->handle($project),
ProjectSettingsSection::Metadata => $this->buildProjectTicketMetadataSettingsPayload->handle($project),
ProjectSettingsSection::Repositories => $this->buildProjectRepositorySettingsPayload->handle($project, $user),
ProjectSettingsSection::Notifications => $this->buildProjectNotificationSettingsPayload->handle($project),
ProjectSettingsSection::Access => $this->accessData($project),
};
return Arr::except($payload, ['error', 'project', 'status']);
}
/**
* @return array<string, mixed>
*/
private function generalData(Project $project): array
{
return [
'sourceTemplates' => ProjectTemplateResource::collection(
ProjectTemplate::query()
->published()
->with('sourceProject')
->orderBy('name')
->get(),
)->resolve(),
'templateState' => $this->resolveProjectTemplateState->handle($project),
];
}
/**
* @return array<string, mixed>
*/
private function accessData(Project $project): array
{
return [
'directPermissions' => $this->permissionService->assignmentMap(User::class, $project),
'permissionOptions' => PermissionOptionResource::collection(
$this->permissionService->permissionOptions(User::class, Project::class),
)->resolve(),
'teamPermissions' => $this->permissionService->assignmentMap(Team::class, $project),
'teams' => TeamResource::collection(
Team::query()
->with('users')
->orderBy('name')
->get(),
)->resolve(),
'users' => UserResource::collection(
User::query()
->orderBy('name')
->get(),
)->resolve(),
];
}
}