112 lines
4.0 KiB
PHP
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(),
|
|
];
|
|
}
|
|
}
|