fixed ( partial) for ticket level commits

This commit is contained in:
Mark Gregory
2026-06-24 17:10:27 +01:00
parent 0ee87279b6
commit 17f36fdc63
4 changed files with 106 additions and 2 deletions
+60 -1
View File
@@ -22,6 +22,7 @@ use Livewire\WithFileUploads;
use Modules\Helpdesk\Models\CannedResponse;
use Modules\Helpdesk\Models\ChecklistItem;
use Modules\Helpdesk\Models\Comment;
use Modules\Helpdesk\Models\GitCommit;
use Modules\Helpdesk\Models\Priority;
use Modules\Helpdesk\Models\Status;
use Modules\Helpdesk\Models\Ticket;
@@ -352,9 +353,10 @@ final class TicketShow extends Component
'tags',
'checklistItems',
'attachments',
'gitCommits.repository',
]) ?? $ticket;
$ticket->setRelation('gitCommits', $this->ticketGitCommits($ticket));
$this->hydrateTicketUsers($ticket);
$comments = Comment::query()
@@ -374,6 +376,63 @@ final class TicketShow extends Component
return $ticket;
}
/**
* Load commits directly linked to this ticket plus older unlinked commits that still mention the ticket reference.
*
* @return EloquentCollection<int, GitCommit>
*/
private function ticketGitCommits(Ticket $ticket): EloquentCollection
{
$referencePatterns = $this->gitCommitReferencePatterns((string) $ticket->reference);
return GitCommit::query()
->with('repository')
->where(static function ($query) use ($ticket, $referencePatterns): void {
$query->where('ticket_id', $ticket->id);
foreach ($referencePatterns as $pattern) {
$likePattern = '%' . addcslashes(Str::lower($pattern), '\\%_') . '%';
$query->orWhere('message', 'ILIKE', $likePattern)
->orWhere('branch', 'ILIKE', $likePattern)
->orWhere('url', 'ILIKE', $likePattern);
}
})
->when($ticket->company_id !== null, static function ($query) use ($ticket): void {
$query->whereHas('repository', static function ($repositoryQuery) use ($ticket): void {
$repositoryQuery->whereNull('company_id')
->orWhere('company_id', $ticket->company_id);
});
})
->latest('committed_at')
->latest('id')
->get()
->unique('id')
->values();
}
/**
* Build practical Git reference variants so older unlinked commits still appear on their ticket.
*
* @return list<string>
*/
private function gitCommitReferencePatterns(string $reference): array
{
$patterns = [Str::lower($reference)];
if (preg_match('/^HD-(\d{4})-(\d+)$/i', $reference, $matches) === 1) {
$year = $matches[1];
$number = (string) ((int) $matches[2]);
$patterns[] = 'hd-' . $year . '-' . $number;
$patterns[] = 'hd ' . $year . ' ' . $number;
$patterns[] = 'hd_' . $year . '_' . $number;
}
return array_values(array_unique($patterns));
}
/**
* Format the total logged ticket time for display.
*/