Add application API and OpenAPI docs
This commit is contained in:
@@ -0,0 +1,254 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Actions\Permissions\PermissionService;
|
||||
use App\Actions\Projects\BuildProjectTicketMetadataSettingsPayload;
|
||||
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;
|
||||
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\Http\Requests\DestroyProjectTicketTypeRequest;
|
||||
use App\Http\Requests\StoreProjectNamedSettingRequest;
|
||||
use App\Http\Requests\StoreProjectTicketTypeRequest;
|
||||
use App\Http\Requests\StoreTicketFieldDefinitionRequest;
|
||||
use App\Http\Requests\UpdateProjectNamedSettingRequest;
|
||||
use App\Http\Requests\UpdateProjectTicketMetadataSettings as UpdateProjectTicketMetadataSettingsRequest;
|
||||
use App\Http\Requests\UpdateProjectTicketTypeRequest;
|
||||
use App\Http\Requests\UpdateTicketFieldDefinitionRequest;
|
||||
use App\Http\Resources\ProjectResource;
|
||||
use App\Http\Resources\TicketFieldDefinitionResource;
|
||||
use App\Http\Resources\TicketLinkTypeResource;
|
||||
use App\Http\Resources\TicketPriorityResource;
|
||||
use App\Http\Resources\TicketTypeResource;
|
||||
use App\Models\Project;
|
||||
use App\Models\TicketFieldDefinition;
|
||||
use App\Models\TicketLinkType;
|
||||
use App\Models\TicketPriority;
|
||||
use App\Models\TicketType;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
class ProjectTicketMetadataSettingsController extends ApiController
|
||||
{
|
||||
public function __construct(
|
||||
private readonly BuildProjectTicketMetadataSettingsPayload $buildProjectTicketMetadataSettingsPayload,
|
||||
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 UpdateProjectTicketMetadataSettings $updateProjectTicketMetadataSettings,
|
||||
private readonly UpdateProjectTicketPriority $updateProjectTicketPriority,
|
||||
private readonly UpdateProjectTicketType $updateProjectTicketType,
|
||||
private readonly UpdateTicketFieldDefinition $updateTicketFieldDefinition,
|
||||
private readonly UpdateTicketLinkType $updateTicketLinkType,
|
||||
) {}
|
||||
|
||||
public function show(Request $request, Project $project): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
return response()->json([
|
||||
'data' => $this->buildProjectTicketMetadataSettingsPayload->handle($project),
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(UpdateProjectTicketMetadataSettingsRequest $request, Project $project): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$project = $this->updateProjectTicketMetadataSettings->handle($project, $request->validated());
|
||||
|
||||
return ProjectResource::make($project)
|
||||
->additional([
|
||||
'meta' => [
|
||||
'message' => 'Settings have been updated.',
|
||||
],
|
||||
])
|
||||
->response();
|
||||
}
|
||||
|
||||
public function storeType(StoreProjectTicketTypeRequest $request, Project $project): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketType = $this->storeProjectTicketType->handle($project, $request->validated());
|
||||
|
||||
return TicketTypeResource::make($ticketType)
|
||||
->additional(['meta' => ['message' => "{$ticketType->name} type was added."]])
|
||||
->response()
|
||||
->setStatusCode(201);
|
||||
}
|
||||
|
||||
public function updateType(
|
||||
UpdateProjectTicketTypeRequest $request,
|
||||
Project $project,
|
||||
TicketType $ticketType,
|
||||
): JsonResponse {
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketType = $this->updateProjectTicketType->handle($project, $ticketType, $request->validated());
|
||||
|
||||
return TicketTypeResource::make($ticketType)
|
||||
->additional(['meta' => ['message' => "{$ticketType->name} type was updated."]])
|
||||
->response();
|
||||
}
|
||||
|
||||
public function destroyType(
|
||||
DestroyProjectTicketTypeRequest $request,
|
||||
Project $project,
|
||||
TicketType $ticketType,
|
||||
): JsonResponse {
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$result = $this->deleteProjectTicketType->handle(
|
||||
$project,
|
||||
$ticketType,
|
||||
$this->authenticatedUser($request),
|
||||
$request->validated(),
|
||||
);
|
||||
|
||||
if (! $result['deleted']) {
|
||||
throw ValidationException::withMessages([
|
||||
'ticket_type_id' => $result['message'],
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json(null, 204);
|
||||
}
|
||||
|
||||
public function storePriority(StoreProjectNamedSettingRequest $request, Project $project): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketPriority = $this->storeProjectTicketPriority->handle($project, $request->validated());
|
||||
|
||||
return TicketPriorityResource::make($ticketPriority)
|
||||
->additional(['meta' => ['message' => "{$ticketPriority->name} priority was added."]])
|
||||
->response()
|
||||
->setStatusCode(201);
|
||||
}
|
||||
|
||||
public function updatePriority(
|
||||
UpdateProjectNamedSettingRequest $request,
|
||||
Project $project,
|
||||
TicketPriority $ticketPriority,
|
||||
): JsonResponse {
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketPriority = $this->updateProjectTicketPriority->handle($project, $ticketPriority, $request->validated());
|
||||
|
||||
return TicketPriorityResource::make($ticketPriority)
|
||||
->additional(['meta' => ['message' => "{$ticketPriority->name} priority was updated."]])
|
||||
->response();
|
||||
}
|
||||
|
||||
public function destroyPriority(Request $request, Project $project, TicketPriority $ticketPriority): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$result = $this->deleteProjectTicketPriority->handle($project, $ticketPriority);
|
||||
|
||||
if (! $result['deleted']) {
|
||||
throw ValidationException::withMessages([
|
||||
'ticket_priority_id' => $result['message'],
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json(null, 204);
|
||||
}
|
||||
|
||||
public function storeFieldDefinition(StoreTicketFieldDefinitionRequest $request, Project $project): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketFieldDefinition = $this->storeTicketFieldDefinition->handle($project, $request->validated());
|
||||
|
||||
return TicketFieldDefinitionResource::make($ticketFieldDefinition)
|
||||
->additional(['meta' => ['message' => "{$ticketFieldDefinition->label} field was added."]])
|
||||
->response()
|
||||
->setStatusCode(201);
|
||||
}
|
||||
|
||||
public function updateFieldDefinition(
|
||||
UpdateTicketFieldDefinitionRequest $request,
|
||||
Project $project,
|
||||
TicketFieldDefinition $ticketFieldDefinition,
|
||||
): JsonResponse {
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketFieldDefinition = $this->updateTicketFieldDefinition->handle($project, $ticketFieldDefinition, $request->validated());
|
||||
|
||||
return TicketFieldDefinitionResource::make($ticketFieldDefinition)
|
||||
->additional(['meta' => ['message' => "{$ticketFieldDefinition->label} field was updated."]])
|
||||
->response();
|
||||
}
|
||||
|
||||
public function destroyFieldDefinition(Request $request, Project $project, TicketFieldDefinition $ticketFieldDefinition): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$this->deleteTicketFieldDefinition->handle($project, $ticketFieldDefinition);
|
||||
|
||||
return response()->json(null, 204);
|
||||
}
|
||||
|
||||
public function storeLinkType(StoreProjectNamedSettingRequest $request, Project $project): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketLinkType = $this->storeTicketLinkType->handle($project, $request->validated());
|
||||
|
||||
return TicketLinkTypeResource::make($ticketLinkType)
|
||||
->additional(['meta' => ['message' => "{$ticketLinkType->label} link type was added."]])
|
||||
->response()
|
||||
->setStatusCode(201);
|
||||
}
|
||||
|
||||
public function updateLinkType(
|
||||
UpdateProjectNamedSettingRequest $request,
|
||||
Project $project,
|
||||
TicketLinkType $ticketLinkType,
|
||||
): JsonResponse {
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$ticketLinkType = $this->updateTicketLinkType->handle($project, $ticketLinkType, $request->validated());
|
||||
|
||||
return TicketLinkTypeResource::make($ticketLinkType)
|
||||
->additional(['meta' => ['message' => "{$ticketLinkType->label} link type was updated."]])
|
||||
->response();
|
||||
}
|
||||
|
||||
public function destroyLinkType(Request $request, Project $project, TicketLinkType $ticketLinkType): JsonResponse
|
||||
{
|
||||
$this->abortUnlessCanManage($request, $project);
|
||||
|
||||
$this->deleteTicketLinkType->handle($project, $ticketLinkType);
|
||||
|
||||
return response()->json(null, 204);
|
||||
}
|
||||
|
||||
private function abortUnlessCanManage(Request $request, Project $project): void
|
||||
{
|
||||
abort_unless(
|
||||
$this->permissionService->allows($this->authenticatedUser($request), Permission::ProjectAdmin, $project),
|
||||
403,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user