Skip to content

Commit

Permalink
feature: install spatie/laravel-json-api-paginate
Browse files Browse the repository at this point in the history
  • Loading branch information
mascam97 committed Dec 3, 2023
1 parent 2949ec0 commit 71aaeee
Show file tree
Hide file tree
Showing 23 changed files with 290 additions and 42 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
"rebing/graphql-laravel": "^9.1",
"spatie/laravel-activitylog": "^4.7",
"spatie/laravel-data": "^2.1",
"spatie/laravel-json-api-paginate": "^1.13",
"spatie/laravel-model-states": "^2.3",
"spatie/laravel-permission": "^5.9",
"spatie/laravel-query-builder": "5.1.2",
Expand Down
69 changes: 67 additions & 2 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

58 changes: 58 additions & 0 deletions config/json-api-paginate.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

return [

/*
* The maximum number of results that will be returned
* when using the JSON API paginator.
*/
'max_results' => 50,

/*
* The default number of results that will be returned
* when using the JSON API paginator.
*/
'default_size' => 20,

/*
* The key of the page[x] query string parameter for page number.
*/
'number_parameter' => 'number',

/*
* The key of the page[x] query string parameter for page size.
*/
'size_parameter' => 'size',

/*
* The key of the page[x] query string parameter for cursor.
*/
'cursor_parameter' => 'cursor',

/*
* The name of the macro that is added to the Eloquent query builder.
*/
'method_name' => 'jsonPaginate',

/*
* If you only need to display Next and Previous links, you may use
* simple pagination to perform a more efficient query.
*/
'use_simple_pagination' => false,

/*
* If you want to use cursor pagination, set this to true.
* This would override use_simple_pagination.
*/
'use_cursor_pagination' => false,

/*
* Here you can override the base url to be used in the link items.
*/
'base_url' => null,

/*
* The name of the query parameter used for pagination
*/
'pagination_parameter' => 'page',
];
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use App\Api\PublicQuotes\Resources\PublicQuoteResource;
use App\Controller;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Support\Metadata\GetQueryMetaDataAction;

/** @authenticated */
class PublicQuotesController extends Controller
Expand All @@ -19,9 +20,12 @@ class PublicQuotesController extends Controller
*/
public function index(PublicQuoteIndexQuery $quoteQuery): AnonymousResourceCollection
{
$quotes = $quoteQuery->paginate();
$quotes = $quoteQuery
->jsonPaginate()
->withQueryString();

return PublicQuoteResource::collection($quotes);
return PublicQuoteResource::collection($quotes)
->additional(['meta' => (new GetQueryMetaDataAction())->__invoke($quoteQuery->getQuery())]);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/App/Api/PublicQuotes/Queries/PublicQuoteIndexQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public function __construct(Request $request)

$this->allowedFilters(['title', 'content', 'user_id'])
->allowedIncludes('user')
->defaultSort('created_at')
->allowedSorts('id', 'title', 'created_at');
}
}
8 changes: 6 additions & 2 deletions src/App/Api/Quotes/Controllers/QuoteController.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Spatie\ModelStates\Exceptions\CouldNotPerformTransition;
use Support\Metadata\GetQueryMetaDataAction;

/** @authenticated */
class QuoteController extends Controller
Expand All @@ -28,9 +29,12 @@ class QuoteController extends Controller
*/
public function index(IndexQuoteQuery $quoteQuery): AnonymousResourceCollection
{
$quotes = $quoteQuery->paginate();
$quotes = $quoteQuery
->jsonPaginate()
->withQueryString();

return QuoteResource::collection($quotes);
return QuoteResource::collection($quotes)
->additional(['meta' => (new GetQueryMetaDataAction())->__invoke($quoteQuery->getQuery())]);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/App/Api/Quotes/Queries/IndexQuoteQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public function __construct(Request $request)
parent::__construct($query, $request);

$this->allowedFilters(['title', 'content', 'state'])
->defaultSort('created_at')
->allowedSorts('id', 'title', 'created_at');
}
}
10 changes: 7 additions & 3 deletions src/App/Api/Ratings/Controllers/RatingController.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Support\Metadata\GetQueryMetaDataAction;

/** @authenticated */
class RatingController extends Controller
Expand All @@ -26,11 +27,14 @@ class RatingController extends Controller
* @bodyParam include string Include qualifier and rateable Example: qualifier,rateable
* @bodyParam sort string Sort by fields Example: id,created_at
*/
public function index(RatingIndexQuery $quoteQuery): AnonymousResourceCollection
public function index(RatingIndexQuery $ratingQuery): AnonymousResourceCollection
{
$quotes = $quoteQuery->paginate();
$quotes = $ratingQuery
->jsonPaginate()
->withQueryString();

return RatingResource::collection($quotes);
return RatingResource::collection($quotes)
->additional(['meta' => (new GetQueryMetaDataAction())->__invoke($ratingQuery->getQuery())]);
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/App/Api/Ratings/Queries/RatingIndexQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public function __construct(Request $request)

$this->allowedFilters(['qualifier_type', 'rateable_type'])
->allowedIncludes(['qualifier', 'rateable'])
->defaultSort('created_at')
->allowedSorts('id', 'created_at');
}
}
8 changes: 6 additions & 2 deletions src/App/Api/Users/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use App\Api\Users\Resources\UserResource;
use App\Controller;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Support\Metadata\GetQueryMetaDataAction;

/** @authenticated */
class UserController extends Controller
Expand All @@ -19,9 +20,12 @@ class UserController extends Controller
*/
public function index(UserIndexQuery $userQuery): AnonymousResourceCollection
{
$users = $userQuery->paginate();
$users = $userQuery
->jsonPaginate()
->withQueryString();

return UserResource::collection($users);
return UserResource::collection($users)
->additional(['meta' => (new GetQueryMetaDataAction())->__invoke($userQuery->getQuery())]);
}

/**
Expand Down
3 changes: 2 additions & 1 deletion src/App/Api/Users/Queries/UserIndexQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public function __construct(Request $request)

$this->allowedFilters(['id', 'name'])
->allowedIncludes('quotes')
->allowedSorts('id', 'name');
->defaultSort('created_at')
->allowedSorts('id', 'name', 'created_at');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Maatwebsite\Excel\Facades\Excel;
use Spatie\Activitylog\Models\Activity;
use Support\Metadata\GetQueryMetaDataAction;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

/** @authenticated */
Expand All @@ -27,9 +28,12 @@ public function index(ActivityIndexQuery $activityQuery): AnonymousResourceColle
{
$this->authorize('viewAny', Activity::class);

$activities = $activityQuery->paginate();
$activities = $activityQuery
->jsonPaginate()
->withQueryString();

return ActivityResource::collection($activities);
return ActivityResource::collection($activities)
->additional(['meta' => (new GetQueryMetaDataAction())->__invoke($activityQuery->getQuery())]);
}

/**
Expand Down
8 changes: 6 additions & 2 deletions src/App/ApiAdmin/Users/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Support\Facades\Auth;
use Support\Metadata\GetQueryMetaDataAction;

/** @authenticated */
class UserController extends Controller
Expand All @@ -29,9 +30,12 @@ public function index(UserIndexQuery $userQuery): AnonymousResourceCollection
{
$this->authorize('viewAny', User::class);

$users = $userQuery->paginate();
$users = $userQuery
->jsonPaginate()
->withQueryString();

return UserResource::collection($users);
return UserResource::collection($users)
->additional(['meta' => (new GetQueryMetaDataAction())->__invoke($userQuery->getQuery())]);
}

/**
Expand Down
3 changes: 2 additions & 1 deletion src/App/ApiAdmin/Users/Queries/UserIndexQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public function __construct(Request $request)

$this->allowedFilters(['id', 'name', AllowedFilter::trashed()])
->allowedIncludes(['permissions', 'roles'])
->allowedSorts('id', 'name');
->defaultSort('created_at')
->allowedSorts('id', 'name', 'created_at');
}
}
3 changes: 2 additions & 1 deletion src/App/Web/Quotes/Queries/QuoteIndexQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public function __construct(Request $request)
parent::__construct($query, $request);

$this->allowedFilters(['title', 'content'])
->allowedSorts('title');
->defaultSort('created_at')
->allowedSorts('title', 'created_at');
}
}
15 changes: 15 additions & 0 deletions src/Support/Metadata/GetQueryMetaDataAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Support\Metadata;

use Illuminate\Database\Query\Builder;

class GetQueryMetaDataAction
{
public function __invoke(Builder $query): array
{
return [
'current_sort' => $query->orders,
];
}
}
Loading

0 comments on commit 71aaeee

Please sign in to comment.