63 lines
2.0 KiB
PHP
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;
|
|
}
|
|
}
|