abortUnlessCanManage($request, $project); return Inertia::render( 'projects/settings/Metadata', $this->buildProjectTicketMetadataSettingsPayload->handle($project, session('status'), session('error')), ); } public function update(UpdateProjectTicketMetadataSettings $request, Project $project): RedirectResponse { $this->abortUnlessCanManage($request, $project); $this->updateProjectTicketMetadataSettings->handle($project, $request->validated()); return to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $project) ->with('error', true) ->with('status', $result['message']); } return to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $project) ->with('error', true) ->with('status', $result['message']); } return to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $project) ->with('status', "{$deletedLabel} field was removed."); } public function storeLinkType(StoreProjectNamedSettingRequest $request, Project $project): RedirectResponse { $this->abortUnlessCanManage($request, $project); $ticketLinkType = $this->storeTicketLinkType->handle($project, $request->validated()); return to_route('projects.settings.metadata', $project) ->with('status', "{$ticketLinkType->label} link type was added."); } public function updateLinkType( UpdateProjectNamedSettingRequest $request, Project $project, TicketLinkType $ticketLinkType, ): RedirectResponse { $this->abortUnlessCanManage($request, $project); $ticketLinkType = $this->updateTicketLinkType->handle($project, $ticketLinkType, $request->validated()); return to_route('projects.settings.metadata', $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 to_route('projects.settings.metadata', $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, ); } }