|null} $attributes */ public function handle(array $attributes, User $actor): Project { return DB::transaction(function () use ($attributes, $actor): Project { $project = Project::query()->create(Arr::only($attributes, ['key', 'name'])); $creationMode = Arr::get($attributes, 'creation_mode', 'scratch'); $sourceTemplateId = Arr::get($attributes, 'source_template_id'); $baseTemplate = null; $sourceTemplate = null; if ($creationMode === 'template' && $sourceTemplateId !== null) { $sourceTemplate = ProjectTemplate::query() ->published() ->findOrFail((int) $sourceTemplateId); $project->forceFill([ 'project_template_id' => $sourceTemplate->id, ])->save(); } else { $baseTemplate = $this->createProjectBaseTemplate->handle($project); $project->forceFill([ 'project_template_id' => $baseTemplate->id, ])->save(); } $project = $project->fresh() ?? $project; $this->initializeProjectTicketMetadata->handle($project); $this->permissionService->grant($actor, Permission::ProjectAdmin, $project); if ($creationMode === 'duplicate' && Arr::get($attributes, 'source_project_id') !== null) { $sourceProject = Project::query()->findOrFail((int) Arr::get($attributes, 'source_project_id')); $this->duplicateProjectConfiguration->handle( $sourceProject, $project, array_values(Arr::get($attributes, 'copy_areas', [])), ); } if ($creationMode === 'template' && $sourceTemplate !== null) { $this->duplicateProjectConfiguration->apply( $project->fresh() ?? $project, $sourceTemplate->configuration_snapshot ?? [], ); } if ($baseTemplate !== null) { $baseTemplate->forceFill([ 'configuration_snapshot' => $this->duplicateProjectConfiguration->export( $project->fresh() ?? $project, DuplicateProjectConfiguration::copyableAreas(), ), ])->save(); } return $project->fresh() ?? $project; }); } }