Add reusable project templates

This commit is contained in:
2026-09-08 10:25:52 +00:00
committed by Twyco
parent 5abfae2736
commit 40f9b473fc
24 changed files with 1154 additions and 88 deletions
+14 -2
View File
@@ -6,6 +6,7 @@ use App\Actions\Permissions\PermissionService;
use App\Actions\ProjectTicketMetadata\InitializeProjectTicketMetadata;
use App\Enums\Permission;
use App\Models\Project;
use App\Models\ProjectTemplate;
use App\Models\User;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
@@ -19,7 +20,7 @@ class CreateProject
) {}
/**
* @param array{key: string, name: string, creation_mode?: string, source_project_id?: int|string|null, copy_areas?: array<int, string>|null} $attributes
* @param array{key: string, name: string, creation_mode?: string, source_project_id?: int|string|null, source_template_id?: int|string|null, copy_areas?: array<int, string>|null} $attributes
*/
public function handle(array $attributes, User $actor): Project
{
@@ -29,7 +30,9 @@ class CreateProject
$this->initializeProjectTicketMetadata->handle($project);
$this->permissionService->grant($actor, Permission::ProjectAdmin, $project);
if (($attributes['creation_mode'] ?? 'scratch') === 'duplicate' && isset($attributes['source_project_id'])) {
$creationMode = $attributes['creation_mode'] ?? 'scratch';
if ($creationMode === 'duplicate' && isset($attributes['source_project_id'])) {
$sourceProject = Project::query()->findOrFail((int) $attributes['source_project_id']);
$this->duplicateProjectConfiguration->handle(
@@ -39,6 +42,15 @@ class CreateProject
);
}
if ($creationMode === 'template' && isset($attributes['source_template_id'])) {
$template = ProjectTemplate::query()->findOrFail((int) $attributes['source_template_id']);
$this->duplicateProjectConfiguration->apply(
$project,
$template->configuration_snapshot ?? [],
);
}
return $project->fresh() ?? $project;
});
}