*/ public function handle(Project $project, Ticket $ticket, User $user, mixed $status = null): array { $canEditTicket = $this->permissionService->allows($user, Permission::ProjectWrite, $project); $canManageProject = $this->permissionService->allows($user, Permission::ProjectAdmin, $project); $displayTicket = $ticket->load([ 'assignee', 'author', 'fieldValues.ticketFieldDefinition', 'fieldValues.userValue', 'parentTicket', 'ticketPriority', 'ticketStatus.boardColumn', 'ticketType', 'worklogEntries.actor', ]); if (! $project->show_author && ! $canManageProject) { $displayTicket->setRelation('author', null); $displayTicket->author_user_id = null; } return [ 'canEditTicket' => $canEditTicket, 'canManageProject' => $canManageProject, 'childTicketTree' => TicketTreeNodeResource::collection( $ticket->childTickets() ->with('ticketType') ->get(), )->resolve(), 'linkedTickets' => TicketLinkResource::collection( TicketLink::query() ->with(['sourceTicket', 'targetTicket', 'ticketLinkType']) ->where(function ($query) use ($ticket): void { $query ->where('source_ticket_id', $ticket->id) ->orWhere('target_ticket_id', $ticket->id); }) ->orderBy('id') ->get() ->each(fn (TicketLink $ticketLink) => $ticketLink->setAttribute('current_ticket_id', $ticket->id)), )->resolve(), 'parentTicketOptions' => TicketReferenceResource::collection( Ticket::query() ->where('project_id', $project->id) ->whereKeyNot($ticket->id) ->whereHas('ticketType', fn ($query) => $query->where('is_parent', true)) ->orderByDesc('sequence_number') ->get(), )->resolve(), 'project' => ProjectResource::make($project)->resolve(), 'repositoryBranches' => TicketRepositoryBranchResource::collection( $this->resolveTicketBranchMatches->handle( $user, $project, $ticket, ), )->resolve(), 'repositoryPullRequests' => TicketRepositoryPullRequestResource::collection( $this->resolveTicketPullRequestMatches->handle( $user, $project, $ticket, ), )->resolve(), 'status' => $status, 'suggestedBranchName' => $this->buildSuggestedTicketBranchName->handle($ticket), 'ticket' => TicketResource::make($displayTicket)->resolve(), 'ticketFieldDefinitions' => TicketFieldDefinitionResource::collection($project->ticketFieldDefinitions()->get())->resolve(), 'ticketLinkOptions' => TicketReferenceResource::collection( Ticket::query() ->where('project_id', $project->id) ->whereKeyNot($ticket->id) ->orderByDesc('sequence_number') ->get(), )->resolve(), 'ticketLinkTypes' => TicketLinkTypeResource::collection($project->ticketLinkTypes()->get())->resolve(), 'ticketPriorities' => TicketPriorityResource::collection($project->ticketPriorities()->get())->resolve(), 'ticketTypes' => TicketTypeResource::collection($project->ticketTypes()->get())->resolve(), 'users' => UserResource::collection( User::query() ->orderBy('name') ->get(), )->resolve(), ]; } }