Skip to content

Commit f4fbfb3

Browse files
authored
Merge pull request #35 from lara-zeus/feat/add-local-scopes
feat(scopes): add local scopes
2 parents c860c4a + 032b393 commit f4fbfb3

28 files changed

+923
-16
lines changed

.github/workflows/run-tests.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: run-tests
22

33
on:
44
push:
5-
branches: [main]
5+
branches: [1.x]
66
pull_request:
7-
branches: [main]
7+
branches: [1.x]
88
workflow_dispatch:
99

1010
jobs:
@@ -14,7 +14,7 @@ jobs:
1414
fail-fast: true
1515
matrix:
1616
os: [ubuntu-latest, windows-latest]
17-
php: [8.2,8.3]
17+
php: [8.2,8.3,8.4]
1818
laravel: [11.*,12.*]
1919
stability: [prefer-lowest, prefer-stable]
2020
include:

.github/workflows/update-changelog.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
- name: Checkout code
1616
uses: actions/checkout@v4
1717
with:
18-
ref: main
18+
ref: 1.x
1919

2020
- name: Update Changelog
2121
uses: stefanzweifel/changelog-updater-action@v1
@@ -26,6 +26,6 @@ jobs:
2626
- name: Commit updated CHANGELOG
2727
uses: stefanzweifel/git-auto-commit-action@v5
2828
with:
29-
branch: main
29+
branch: 1.x
3030
commit_message: Update CHANGELOG
3131
file_pattern: CHANGELOG.md

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222
"require": {
2323
"php": "^8.2",
2424
"filament/filament": "^3.2",
25+
"illuminate/database": "^11.40|^12.0",
2526
"spatie/laravel-package-tools": "^1.18"
2627
},
2728
"require-dev": {
2829
"laravel/pint": "^1.0",
2930
"nunomaduro/collision": "^8.0",
3031
"larastan/larastan": "^3.0",
3132
"orchestra/testbench": "^10.0",
32-
"pestphp/pest": "^3.0",
33+
"pestphp/pest": "^3.5",
3334
"pestphp/pest-plugin-arch": "^3.0",
3435
"pestphp/pest-plugin-laravel": "^3.0",
3536
"phpstan/extension-installer": "^1.0",
@@ -49,7 +50,7 @@
4950
"scripts": {
5051
"post-autoload-dump": "@php ./vendor/bin/testbench package:discover --ansi",
5152
"analyse": "vendor/bin/phpstan analyse",
52-
"test": "vendor/bin/pest",
53+
"test": "vendor/bin/pest --parallel",
5354
"test-coverage": "vendor/bin/pest --coverage",
5455
"format": "vendor/bin/pint",
5556
"lint": [

src/Traits/Bookmark/Bookmarkable.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ trait Bookmarkable
1212
use Markable\Actions;
1313
use Markable\Indicators;
1414
use Markable\Relations;
15+
use Markable\Scopes;
1516
}

src/Traits/Bookmark/HasBookmarks.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ trait HasBookmarks
1212
use Marker\Actions;
1313
use Marker\Indicators;
1414
use Marker\Relations;
15+
use Marker\Scopes;
1516
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Traits\Bookmark\Markable;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Collection;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
trait Scopes
10+
{
11+
public function scopeWhereBookmarkedBy(Builder $query, Model | Collection $marker): Builder
12+
{
13+
return $query->whereRelation(
14+
'bookmarks',
15+
fn (Builder $q) => $q->whereBelongsTo($marker, 'marker')
16+
);
17+
}
18+
}

src/Traits/Bookmark/Marker/Scopes.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Traits\Bookmark\Marker;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Collection;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
trait Scopes
10+
{
11+
public function scopeWhereBookmarked(Builder $query, Model | Collection $markable): Builder
12+
{
13+
return $query->whereRelation(
14+
'bookmarks',
15+
fn (Builder $q) => $q->whereMorphedTo('markable', $markable)
16+
);
17+
}
18+
}

src/Traits/Like/HasLikes.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ trait HasLikes
1212
use Marker\Actions;
1313
use Marker\Indicators;
1414
use Marker\Relations;
15+
use Marker\Scopes;
1516
}

src/Traits/Like/Likeable.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ trait Likeable
1212
use Markable\Actions;
1313
use Markable\Indicators;
1414
use Markable\Relations;
15+
use Markable\Scopes;
1516
}

src/Traits/Like/Markable/Scopes.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Traits\Like\Markable;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Collection;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
trait Scopes
10+
{
11+
public function scopeWhereLikedOrDislikedBy(Builder $query, Model | Collection $marker): Builder
12+
{
13+
return $query->whereRelation(
14+
'likes',
15+
fn (Builder $q) => $q->whereBelongsTo($marker, 'marker')
16+
);
17+
}
18+
19+
public function scopeWhereLikedBy(Builder $query, Model | Collection $marker): Builder
20+
{
21+
return $query->whereRelation(
22+
'likes',
23+
fn (Builder $q) => $q
24+
->whereBelongsTo($marker, 'marker')
25+
->where('value', true)
26+
);
27+
}
28+
29+
public function scopeWhereDislikedBy(Builder $query, Model | Collection $marker): Builder
30+
{
31+
return $query->whereRelation(
32+
'likes',
33+
fn (Builder $q) => $q
34+
->whereBelongsTo($marker, 'marker')
35+
->where('value', false)
36+
);
37+
}
38+
}

src/Traits/Like/Marker/Scopes.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Traits\Like\Marker;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Collection;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
trait Scopes
10+
{
11+
public function scopeWhereLikedOrDisliked(Builder $query, Model | Collection $markable): Builder
12+
{
13+
return $query->whereRelation(
14+
'likes',
15+
fn (Builder $q) => $q->whereMorphedTo('markable', $markable)
16+
);
17+
}
18+
19+
public function scopeWhereLiked(Builder $query, Model | Collection $markable): Builder
20+
{
21+
return $query->whereRelation(
22+
'likes',
23+
fn (Builder $q) => $q
24+
->whereMorphedTo('markable', $markable)
25+
->where('value', true)
26+
);
27+
}
28+
29+
public function scopeWhereDisliked(Builder $query, Model | Collection $markable): Builder
30+
{
31+
return $query->whereRelation(
32+
'likes',
33+
fn (Builder $q) => $q
34+
->whereMorphedTo('markable', $markable)
35+
->where('value', false)
36+
);
37+
}
38+
}

src/Traits/Rating/HasRatings.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ trait HasRatings
1212
use Marker\Actions;
1313
use Marker\Indicators;
1414
use Marker\Relations;
15+
use Marker\Scopes;
1516
}

src/Traits/Rating/Markable/Scopes.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Traits\Rating\Markable;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Collection;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
trait Scopes
10+
{
11+
public function scopeWhereRatedBy(Builder $query, Model | Collection $marker): Builder
12+
{
13+
return $query->whereRelation(
14+
'ratings',
15+
fn (Builder $q) => $q->whereBelongsTo($marker, 'marker')
16+
);
17+
}
18+
}

src/Traits/Rating/Marker/Scopes.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Traits\Rating\Marker;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
use Illuminate\Database\Eloquent\Collection;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
trait Scopes
10+
{
11+
public function scopeWhereRated(Builder $query, Model | Collection $markable): Builder
12+
{
13+
return $query->whereRelation(
14+
'ratings',
15+
fn (Builder $q) => $q->whereMorphedTo('markable', $markable)
16+
);
17+
}
18+
}

src/Traits/Rating/Rateable.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ trait Rateable
1212
use Markable\Actions;
1313
use Markable\Indicators;
1414
use Markable\Relations;
15+
use Markable\Scopes;
1516
}

tests/ExampleTest.php

Lines changed: 0 additions & 5 deletions
This file was deleted.

tests/Factories/MarkableFactory.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Tests\Factories;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
use LaraZeus\Mark\Tests\Models\Markable;
7+
8+
class MarkableFactory extends Factory
9+
{
10+
protected $model = Markable::class;
11+
12+
public function definition(): array
13+
{
14+
return [
15+
16+
];
17+
}
18+
}

tests/Factories/MarkerFactory.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace LaraZeus\Mark\Tests\Factories;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
use LaraZeus\Mark\Tests\Models\Marker;
7+
8+
class MarkerFactory extends Factory
9+
{
10+
protected $model = Marker::class;
11+
12+
public function definition(): array
13+
{
14+
return [
15+
16+
];
17+
}
18+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
3+
use Illuminate\Database\Eloquent\Builder;
4+
use Illuminate\Database\Eloquent\Collection;
5+
use Illuminate\Database\Eloquent\Model;
6+
use LaraZeus\Mark\Tests\Models\Markable;
7+
use LaraZeus\Mark\Tests\Models\Marker;
8+
9+
describe('scope', function () {
10+
beforeEach(function () {
11+
$this->marker1 = Marker::factory()->create();
12+
$this->markables1 = Markable::factory()
13+
->count(3)
14+
->create()
15+
->each(
16+
fn (Markable $markable) => $markable
17+
->bookmarkedBy()
18+
->attach($this->marker1, ['value' => true])
19+
);
20+
21+
$this->marker2 = Marker::factory()->create();
22+
$this->markables2 = Markable::factory()
23+
->count(3)
24+
->create()
25+
->each(
26+
fn (Markable $markable) => $markable
27+
->bookmarkedBy()
28+
->attach($this->marker2, ['value' => true])
29+
);
30+
});
31+
32+
describe('whereBookmarkedBy', function () {
33+
34+
test('has correct signature', function () {
35+
$method = (new ReflectionClass(Markable::class))
36+
->getMethod('scopeWhereBookmarkedBy');
37+
38+
expect($method->isPublic())->toBeTrue();
39+
40+
$parameters = $method->getParameters();
41+
expect($parameters)->toHaveCount(2);
42+
43+
[$queryParam, $markableParam] = $parameters;
44+
45+
expect($queryParam->getName())->toBe('query')
46+
->and($queryParam->getType()->getName())->toBe(Builder::class)
47+
->and($queryParam->getType()->allowsNull())->toBeFalse();
48+
49+
expect($markableParam->getName())->toBe('marker')
50+
->and($markableParam->getType())->toBeInstanceOf(ReflectionUnionType::class)
51+
->and(collect($markableParam->getType()->getTypes())->map(fn ($t) => $t->getName())->all())
52+
->toMatchArray([Model::class, Collection::class]);
53+
});
54+
55+
test('filter the relations currectly', function () {
56+
expect(Markable::whereBookmarkedBy($this->marker1)->get())
57+
->toHaveCount(3)
58+
->toContainModel($this->markables1);
59+
60+
expect(Markable::whereBookmarkedBy($this->marker2)->get())
61+
->toHaveCount(3)
62+
->toContainModel($this->markables2);
63+
64+
expect(Markable::whereBookmarkedBy($this->marker1)->get())
65+
->toHaveCount(3)
66+
->not->toContainModel($this->markables2);
67+
});
68+
});
69+
});

0 commit comments

Comments
 (0)