248 lines
9.5 KiB
PHP
248 lines
9.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Actions\Permissions\PermissionService;
|
|
use App\Actions\ProjectTicketMetadata\DeleteProjectTicketPriority;
|
|
use App\Actions\ProjectTicketMetadata\DeleteProjectTicketType;
|
|
use App\Actions\ProjectTicketMetadata\DeleteTicketFieldDefinition;
|
|
use App\Actions\ProjectTicketMetadata\DeleteTicketLinkType;
|
|
use App\Actions\ProjectTicketMetadata\StoreProjectTicketPriority;
|
|
use App\Actions\ProjectTicketMetadata\StoreProjectTicketType;
|
|
use App\Actions\ProjectTicketMetadata\StoreTicketFieldDefinition;
|
|
use App\Actions\ProjectTicketMetadata\StoreTicketLinkType;
|
|
use App\Actions\ProjectTicketMetadata\UpdateProjectTicketMetadataSettings as UpdateProjectTicketMetadataSettingsAction;
|
|
use App\Actions\ProjectTicketMetadata\UpdateProjectTicketPriority;
|
|
use App\Actions\ProjectTicketMetadata\UpdateProjectTicketType;
|
|
use App\Actions\ProjectTicketMetadata\UpdateTicketFieldDefinition;
|
|
use App\Actions\ProjectTicketMetadata\UpdateTicketLinkType;
|
|
use App\Enums\Permission;
|
|
use App\Enums\ProjectSettingsSection;
|
|
use App\Http\Requests\DestroyProjectTicketTypeRequest;
|
|
use App\Http\Requests\StoreProjectNamedSettingRequest;
|
|
use App\Http\Requests\StoreProjectTicketTypeRequest;
|
|
use App\Http\Requests\StoreTicketFieldDefinitionRequest;
|
|
use App\Http\Requests\StoreTicketLinkTypeRequest;
|
|
use App\Http\Requests\UpdateProjectNamedSettingRequest;
|
|
use App\Http\Requests\UpdateProjectTicketMetadataSettings;
|
|
use App\Http\Requests\UpdateProjectTicketTypeRequest;
|
|
use App\Http\Requests\UpdateTicketFieldDefinitionRequest;
|
|
use App\Http\Requests\UpdateTicketLinkTypeRequest;
|
|
use App\Models\Project;
|
|
use App\Models\TicketFieldDefinition;
|
|
use App\Models\TicketLinkType;
|
|
use App\Models\TicketPriority;
|
|
use App\Models\TicketType;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class ProjectTicketMetadataSettingsController extends Controller
|
|
{
|
|
public function __construct(
|
|
private readonly DeleteProjectTicketPriority $deleteProjectTicketPriority,
|
|
private readonly DeleteProjectTicketType $deleteProjectTicketType,
|
|
private readonly DeleteTicketFieldDefinition $deleteTicketFieldDefinition,
|
|
private readonly DeleteTicketLinkType $deleteTicketLinkType,
|
|
private readonly PermissionService $permissionService,
|
|
private readonly StoreProjectTicketPriority $storeProjectTicketPriority,
|
|
private readonly StoreProjectTicketType $storeProjectTicketType,
|
|
private readonly StoreTicketFieldDefinition $storeTicketFieldDefinition,
|
|
private readonly StoreTicketLinkType $storeTicketLinkType,
|
|
private readonly UpdateProjectTicketMetadataSettingsAction $updateProjectTicketMetadataSettings,
|
|
private readonly UpdateProjectTicketPriority $updateProjectTicketPriority,
|
|
private readonly UpdateProjectTicketType $updateProjectTicketType,
|
|
private readonly UpdateTicketFieldDefinition $updateTicketFieldDefinition,
|
|
private readonly UpdateTicketLinkType $updateTicketLinkType,
|
|
) {}
|
|
|
|
public function update(UpdateProjectTicketMetadataSettings $request, Project $project): RedirectResponse
|
|
{
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$this->updateProjectTicketMetadataSettings->handle($project, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', 'Settings have been updated.');
|
|
}
|
|
|
|
public function storeType(StoreProjectTicketTypeRequest $request, Project $project): RedirectResponse
|
|
{
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketType = $this->storeProjectTicketType->handle($project, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketType->name} type was added.");
|
|
}
|
|
|
|
public function updateType(
|
|
UpdateProjectTicketTypeRequest $request,
|
|
Project $project,
|
|
TicketType $ticketType,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketType = $this->updateProjectTicketType->handle($project, $ticketType, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketType->fresh()->name} type was updated.");
|
|
}
|
|
|
|
public function destroyType(
|
|
DestroyProjectTicketTypeRequest $request,
|
|
Project $project,
|
|
TicketType $ticketType,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$result = $this->deleteProjectTicketType->handle(
|
|
$project,
|
|
$ticketType,
|
|
$request->user(),
|
|
$request->validated(),
|
|
);
|
|
|
|
if (! $result['deleted']) {
|
|
return $this->settingsRedirect($project)
|
|
->with('error', true)
|
|
->with('status', $result['message']);
|
|
}
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', $result['message']);
|
|
}
|
|
|
|
public function storePriority(StoreProjectNamedSettingRequest $request, Project $project): RedirectResponse
|
|
{
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketPriority = $this->storeProjectTicketPriority->handle($project, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketPriority->name} priority was added.");
|
|
}
|
|
|
|
public function updatePriority(
|
|
UpdateProjectNamedSettingRequest $request,
|
|
Project $project,
|
|
TicketPriority $ticketPriority,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketPriority = $this->updateProjectTicketPriority->handle($project, $ticketPriority, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketPriority->fresh()->name} priority was updated.");
|
|
}
|
|
|
|
public function destroyPriority(
|
|
Request $request,
|
|
Project $project,
|
|
TicketPriority $ticketPriority,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$result = $this->deleteProjectTicketPriority->handle($project, $ticketPriority);
|
|
|
|
if (! $result['deleted']) {
|
|
return $this->settingsRedirect($project)
|
|
->with('error', true)
|
|
->with('status', $result['message']);
|
|
}
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', $result['message']);
|
|
}
|
|
|
|
public function storeFieldDefinition(
|
|
StoreTicketFieldDefinitionRequest $request,
|
|
Project $project,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketFieldDefinition = $this->storeTicketFieldDefinition->handle($project, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketFieldDefinition->label} field was added.");
|
|
}
|
|
|
|
public function updateFieldDefinition(
|
|
UpdateTicketFieldDefinitionRequest $request,
|
|
Project $project,
|
|
TicketFieldDefinition $ticketFieldDefinition,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketFieldDefinition = $this->updateTicketFieldDefinition->handle($project, $ticketFieldDefinition, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketFieldDefinition->fresh()->label} field was updated.");
|
|
}
|
|
|
|
public function destroyFieldDefinition(
|
|
Request $request,
|
|
Project $project,
|
|
TicketFieldDefinition $ticketFieldDefinition,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$deletedLabel = $this->deleteTicketFieldDefinition->handle($project, $ticketFieldDefinition);
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$deletedLabel} field was removed.");
|
|
}
|
|
|
|
public function storeLinkType(StoreTicketLinkTypeRequest $request, Project $project): RedirectResponse
|
|
{
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketLinkType = $this->storeTicketLinkType->handle($project, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketLinkType->label} link type was added.");
|
|
}
|
|
|
|
public function updateLinkType(
|
|
UpdateTicketLinkTypeRequest $request,
|
|
Project $project,
|
|
TicketLinkType $ticketLinkType,
|
|
): RedirectResponse {
|
|
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$ticketLinkType = $this->updateTicketLinkType->handle($project, $ticketLinkType, $request->validated());
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$ticketLinkType->fresh()->label} link type was updated.");
|
|
}
|
|
|
|
public function destroyLinkType(
|
|
Request $request,
|
|
Project $project,
|
|
TicketLinkType $ticketLinkType,
|
|
): RedirectResponse {
|
|
$this->abortUnlessCanManage($request, $project);
|
|
|
|
$deletedLabel = $this->deleteTicketLinkType->handle($project, $ticketLinkType);
|
|
|
|
return $this->settingsRedirect($project)
|
|
->with('status', "{$deletedLabel} link type was removed.");
|
|
}
|
|
|
|
private function abortUnlessCanManage(Request $request, Project $project): void
|
|
{
|
|
abort_unless(
|
|
$this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project),
|
|
403,
|
|
);
|
|
}
|
|
|
|
private function settingsRedirect(Project $project): RedirectResponse
|
|
{
|
|
return to_route('projects.settings.index', [
|
|
'project' => $project,
|
|
'section' => ProjectSettingsSection::Metadata->value,
|
|
]);
|
|
}
|
|
}
|