From 17f36fdc63b7a457875fc0083f5e11ef69576262 Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Wed, 24 Jun 2026 17:10:27 +0100 Subject: [PATCH] fixed ( partial) for ticket level commits --- Modules/Helpdesk/Livewire/TicketShow.php | 61 ++++++++++++++++++- .../TicketGitCommitDisplayFilesTest.php | 34 +++++++++++ Modules/Helpdesk/changelog.yaml | 11 ++++ Modules/Helpdesk/module.json | 2 +- 4 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 Modules/Helpdesk/Tests/Feature/TicketGitCommitDisplayFilesTest.php diff --git a/Modules/Helpdesk/Livewire/TicketShow.php b/Modules/Helpdesk/Livewire/TicketShow.php index 2e05558b..bb0d84a2 100644 --- a/Modules/Helpdesk/Livewire/TicketShow.php +++ b/Modules/Helpdesk/Livewire/TicketShow.php @@ -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 + */ + 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 + */ + 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. */ diff --git a/Modules/Helpdesk/Tests/Feature/TicketGitCommitDisplayFilesTest.php b/Modules/Helpdesk/Tests/Feature/TicketGitCommitDisplayFilesTest.php new file mode 100644 index 00000000..9e896123 --- /dev/null +++ b/Modules/Helpdesk/Tests/Feature/TicketGitCommitDisplayFilesTest.php @@ -0,0 +1,34 @@ +