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(StoreTicketLinkTypeRequest $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( UpdateTicketLinkTypeRequest $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, ); } }