Files
KanbanGit/app/Actions/Tickets/DeleteProjectTicketLink.php
Koda 486994e441
linter / quality (pull_request) Successful in 3m5s
tests / ci (8.4) (pull_request) Failing after 1m41s
Model ticket link counterparts explicitly
2026-05-23 10:29:22 +00:00

63 lines
2.0 KiB
PHP

<?php
namespace App\Actions\Tickets;
use App\Enums\TicketWorklogEntryType;
use App\Models\Ticket;
use App\Models\TicketLink;
use App\Models\User;
use Illuminate\Support\Facades\DB;
class DeleteProjectTicketLink
{
public function __construct(
private readonly CreateTicketWorklogEntry $createTicketWorklogEntry,
) {}
public function handle(Ticket $ticket, TicketLink $ticketLink, User $user): string
{
$ticketLink->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;
}
}