diff --git a/app/Http/Controllers/LinkController.php b/app/Http/Controllers/LinkController.php index d6df8f218..2c37207a4 100644 --- a/app/Http/Controllers/LinkController.php +++ b/app/Http/Controllers/LinkController.php @@ -34,7 +34,7 @@ public function index(ListLinksRequest $request, #[CurrentUser] User $user, Link return Inertia::render('links/index', [ 'url' => $url, 'link' => $link, - 'stats' => $link === null ? ['commits' => 0, 'people' => 0] : $commits->stats($link), + 'stats' => $link === null ? ['commits' => 0, 'people' => 0] : $commits->stats($link, $user), 'commits' => $link === null ? null : Inertia::scroll(fn () => $commits->builder($link, $user)->cursorPaginate(20)), ]); } diff --git a/app/Queries/LinkCommitsQuery.php b/app/Queries/LinkCommitsQuery.php index 23f92ddd9..700c4317e 100644 --- a/app/Queries/LinkCommitsQuery.php +++ b/app/Queries/LinkCommitsQuery.php @@ -33,9 +33,9 @@ public function builder(LinkPreview $link, User $user): CommitBuilder /** * @return array{commits: int, people: int} */ - public function stats(LinkPreview $link): array + public function stats(LinkPreview $link, User $user): array { - $commits = Commit::query()->where('link_preview_id', $link->id)->approved(); + $commits = Commit::query()->where('link_preview_id', $link->id)->visibleTo($user); return ['commits' => $commits->count(), 'people' => $commits->distinct()->count('user_id')]; } diff --git a/tests/Feature/Controllers/LinkControllerTest.php b/tests/Feature/Controllers/LinkControllerTest.php index 7539d01ae..e1c874961 100644 --- a/tests/Feature/Controllers/LinkControllerTest.php +++ b/tests/Feature/Controllers/LinkControllerTest.php @@ -2,8 +2,10 @@ declare(strict_types=1); +use App\Enums\OrganizationRole; use App\Models\Commit; use App\Models\LinkPreview; +use App\Models\Organization; use App\Models\User; it('keeps the link page to signed-in users', function (): void { @@ -66,15 +68,27 @@ $blocked = User::factory()->create(); $viewer->blocking()->attach($blocked); $link = LinkPreview::factory()->create(); - $visible = Commit::factory()->create(['link_preview_id' => $link->id]); - Commit::factory()->for($blocked)->create(['link_preview_id' => $link->id]); + $visibleUser = User::factory()->create(); + $visible = Commit::factory()->for($visibleUser)->create(['link_preview_id' => $link->id]); + $visibleAgain = Commit::factory()->for($visibleUser)->create(['link_preview_id' => $link->id]); + $organization = Organization::factory()->create(); + $organization->members()->attach($viewer->id, ['role' => OrganizationRole::Member]); + $organizationPoster = User::factory()->create(); + $organizationCommit = Commit::factory()->for($organizationPoster)->create([ + 'link_preview_id' => $link->id, + 'author_id' => $organization->id, + ]); + Commit::factory()->count(2)->for($blocked)->create(['link_preview_id' => $link->id]); Commit::factory()->pending()->create(['link_preview_id' => $link->id]); $own = Commit::factory()->pending()->for($viewer)->create(['link_preview_id' => $link->id]); $this->actingAs($viewer)->get(route('link.index', ['url' => $link->url]))->assertOk()->assertInertia(fn ($page) => $page - ->has('commits.data', 2) + ->has('commits.data', 4) + ->where('stats', ['commits' => 4, 'people' => 3]) ->where('commits.data.0.id', $visible->id) - ->where('commits.data.1.id', $own->id)); + ->where('commits.data.1.id', $visibleAgain->id) + ->where('commits.data.2.id', $organizationCommit->id) + ->where('commits.data.3.id', $own->id)); }); it('finds the link of a bare domain like its card does', function (): void {