56 lines
1.3 KiB
PHP
56 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\Projects;
|
|
|
|
use App\Models\Project;
|
|
|
|
class ProjectTemplateOverrideManager
|
|
{
|
|
private static int $suppressionDepth = 0;
|
|
|
|
public function mark(Project $project, string $area): void
|
|
{
|
|
if (self::$suppressionDepth > 0) {
|
|
return;
|
|
}
|
|
|
|
$project->loadMissing('projectTemplate');
|
|
|
|
if ($project->projectTemplate === null || ! $project->projectTemplate->is_published) {
|
|
return;
|
|
}
|
|
|
|
$overrides = array_values(array_unique([
|
|
...($project->template_overrides ?? []),
|
|
$area,
|
|
]));
|
|
|
|
$project->forceFill(['template_overrides' => $overrides])->saveQuietly();
|
|
}
|
|
|
|
/**
|
|
* @param list<string> $areas
|
|
*/
|
|
public function clear(Project $project, array $areas): void
|
|
{
|
|
$remaining = array_values(array_diff($project->template_overrides ?? [], $areas));
|
|
$project->forceFill(['template_overrides' => $remaining])->saveQuietly();
|
|
}
|
|
|
|
public function withoutRecording(callable $callback): mixed
|
|
{
|
|
self::$suppressionDepth++;
|
|
|
|
try {
|
|
return $callback();
|
|
} finally {
|
|
self::$suppressionDepth--;
|
|
}
|
|
}
|
|
|
|
public function isRecording(): bool
|
|
{
|
|
return self::$suppressionDepth === 0;
|
|
}
|
|
}
|