load(['sourceTicket', 'targetTicket', 'ticketLinkType']); abort_unless( $ticketLink->source_ticket_id === $ticket->id || $ticketLink->target_ticket_id === $ticket->id, 404, ); $isSourceTicket = $ticketLink->source_ticket_id === $ticket->id; $linkedTicket = $isSourceTicket ? $ticketLink->targetTicket : $ticketLink->sourceTicket; $label = $ticketLink->ticketLinkType->labelForSource($isSourceTicket); $counterpartLabel = $ticketLink->ticketLinkType->labelForSource(! $isSourceTicket); DB::transaction(function () use ($label, $counterpartLabel, $linkedTicket, $user, $ticket, $ticketLink): void { $ticketLink->delete(); $this->createTicketWorklogEntry->handle( $ticket, $user, TicketWorklogEntryType::LinkRemoved, "Removed {$label} link to {$linkedTicket->ticket_key}.", [ 'linked_ticket_key' => $linkedTicket->ticket_key, 'ticket_link_type' => $label, ], ); $this->createTicketWorklogEntry->handle( $linkedTicket, $user, TicketWorklogEntryType::LinkRemoved, "Removed {$counterpartLabel} link to {$ticket->ticket_key}.", [ 'linked_ticket_key' => $ticket->ticket_key, 'ticket_link_type' => $counterpartLabel, ], ); }); return $label; } }