From 3b4200a0e58fb45faac0474642c5f535c8de976c Mon Sep 17 00:00:00 2001 From: myrmidex Date: Mon, 10 Aug 2026 21:43:47 +0200 Subject: [PATCH] 91 - Show the feed name on article activity entries --- app/Livewire/Activity.php | 9 ++++++- database/factories/ActivityLogFactory.php | 2 +- resources/views/livewire/activity.blade.php | 3 +++ tests/Feature/Livewire/ActivityTest.php | 30 ++++++++++++++++++++- tests/Unit/Models/ActivityLogTest.php | 2 +- 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/app/Livewire/Activity.php b/app/Livewire/Activity.php index 68db7c9a..07efe099 100644 --- a/app/Livewire/Activity.php +++ b/app/Livewire/Activity.php @@ -4,9 +4,12 @@ use App\Enums\ActivityTypeEnum; use App\Models\ActivityLog; +use App\Models\Article; use App\Services\Activity\ActivitySummary; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\MorphTo; +use Illuminate\Database\Eloquent\Relations\Relation; use Livewire\Component; use Livewire\WithPagination; @@ -34,7 +37,11 @@ public function updatedDays(): void private function query(): Builder { return ActivityLog::query() - ->with('subject') + ->with(['subject' => function (Relation $morphTo): void { + if ($morphTo instanceof MorphTo) { + $morphTo->morphWith([Article::class => ['feed']]); + } + }]) ->since(now()->subDays($this->days)) ->when( $this->type !== '', diff --git a/database/factories/ActivityLogFactory.php b/database/factories/ActivityLogFactory.php index 32b447dd..511e1914 100644 --- a/database/factories/ActivityLogFactory.php +++ b/database/factories/ActivityLogFactory.php @@ -40,7 +40,7 @@ public function loggedAt(Carbon $loggedAt): static return $this->state(['logged_at' => $loggedAt]); } - public function for_subject(Model $subject): static + public function forSubject(Model $subject): static { return $this->state([ 'subject_type' => $subject->getMorphClass(), diff --git a/resources/views/livewire/activity.blade.php b/resources/views/livewire/activity.blade.php index b74ad0c3..185f281c 100644 --- a/resources/views/livewire/activity.blade.php +++ b/resources/views/livewire/activity.blade.php @@ -44,6 +44,9 @@ class="w-44 shrink-0 pl-3 pr-10 py-2 border border-gray-300 rounded-md text-sm f

{{ $entry->message }}

+ @if ($entry->subject instanceof App\Models\Article) +

{{ $entry->subject->feed?->name }}

+ @endif @if (($entry->context['reason'] ?? null) !== null)

{{ $entry->context['reason'] }}

@endif diff --git a/tests/Feature/Livewire/ActivityTest.php b/tests/Feature/Livewire/ActivityTest.php index 143ff30d..299bd04c 100644 --- a/tests/Feature/Livewire/ActivityTest.php +++ b/tests/Feature/Livewire/ActivityTest.php @@ -6,7 +6,9 @@ use App\Livewire\Activity; use App\Models\ActivityLog; use App\Models\Article; +use App\Models\Feed; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\DB; use Livewire\Livewire; use Tests\TestCase; @@ -70,7 +72,7 @@ public function test_entry_without_a_subject_renders(): void public function test_entry_with_a_deleted_subject_renders(): void { $article = Article::factory()->create(); - ActivityLog::factory()->for_subject($article)->create(['message' => 'Dangling subject']); + ActivityLog::factory()->forSubject($article)->create(['message' => 'Dangling subject']); $article->delete(); Livewire::test(Activity::class) @@ -83,6 +85,32 @@ public function test_empty_state_is_shown_when_there_is_no_activity(): void Livewire::test(Activity::class)->assertSee('No activity in this period.'); } + public function test_an_article_subject_shows_its_feed_name(): void + { + $feed = Feed::factory()->create(['name' => 'VRT News']); + $article = Article::factory()->create(['feed_id' => $feed->id]); + ActivityLog::factory()->forSubject($article)->create(['message' => 'Published something']); + + Livewire::test(Activity::class)->assertSee('VRT News'); + } + + public function test_subjects_are_eager_loaded(): void + { + $feed = Feed::factory()->create(); + + foreach (range(1, 5) as $i) { + $article = Article::factory()->create(['feed_id' => $feed->id]); + ActivityLog::factory()->forSubject($article)->create(); + } + + DB::enableQueryLog(); + Livewire::test(Activity::class); + $queries = count(DB::getQueryLog()); + DB::disableQueryLog(); + + $this->assertLessThan(10, $queries); + } + public function test_a_reason_in_context_is_shown_under_the_message(): void { ActivityLog::factory()->create([ diff --git a/tests/Unit/Models/ActivityLogTest.php b/tests/Unit/Models/ActivityLogTest.php index 0f98eb45..b5e0dfc0 100644 --- a/tests/Unit/Models/ActivityLogTest.php +++ b/tests/Unit/Models/ActivityLogTest.php @@ -58,7 +58,7 @@ public function test_latest_first_breaks_ties_on_id(): void public function test_subject_resolves_to_the_related_model(): void { $article = Article::factory()->create(); - $log = ActivityLog::factory()->for_subject($article)->create(); + $log = ActivityLog::factory()->forSubject($article)->create(); $this->assertInstanceOf(Article::class, $log->subject); $this->assertSame($article->id, $log->subject->id);