From a0ab2c6c8c4bf0a10918e7cdad6c0046848c7119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Fri, 30 Apr 2021 15:42:59 -0400 Subject: [PATCH] Mejor paginado, y actualizado el .env.example! --- backend/.env.example | 6 +++ .../Http/Controllers/UsuariosController.php | 49 +++++++++++++------ backend/app/Models/Usuario.php | 1 + backend/app/Providers/AppServiceProvider.php | 4 ++ backend/app/Services/PaginatorService.php | 47 ++++++++++++++++++ backend/routes/web.php | 3 +- 6 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 backend/app/Services/PaginatorService.php diff --git a/backend/.env.example b/backend/.env.example index 5f2f204..1e2fa8d 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -21,3 +21,9 @@ QUEUE_CONNECTION=sync AUTH0_DOMAIN=https://super-domain.auth0.com/ AUTH0_AUD=https://audience + +AUTH0_API_AUD=https://super-domain.auth0.com/api/v2/ +AUTH0_CLIENT_ID=secret +AUTH0_CLIENT_SECRET=secret +AUTH0_CONNECTION=Username-Password-Authentication +AUTH0_VERIFY_MAIL=false diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index 3d222db..0002e23 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Models\Restaurante; use App\Models\Usuario; use App\Services\Auth0Service; +use App\Services\PaginatorService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Validation\Rule; @@ -14,12 +15,24 @@ use Ramsey\Uuid\Uuid; class UsuariosController extends Controller { /** - * Obtiene todos los usuarios registrados en el backend + * Obtiene de forma paginada los usuarios registrados en el backend + * @param Request $request * @return JsonResponse */ - public function all() { - $usuarios = Usuario::all(); - return response()->json(['usuarios' => $usuarios]); + public function all(Request $request) { + $paginate = app(PaginatorService::class)->paginate($request->input('per_page', 15), $request->input('page', 1), Usuario::all()->count()); + $paginate['links'] = [ + 'first' => route('users.all', ['page' => 1, 'per_page' => $paginate['per_page']]), + 'prev' => $paginate['current_page'] - 1 >= 1 ? route('users.all', ['page' => $paginate['current_page'] - 1, 'per_page' => $paginate['per_page']]) : null, + 'current' => route('users.all', ['page' =>$paginate['current_page'], 'per_page' => $paginate['per_page']]), + 'next' => $paginate['current_page']+ 1 <= $paginate['last_page'] ? route('users.all', ['page' => $paginate['current_page'] + 1, 'per_page' => $paginate['per_page']]) : null, + 'last' => route('users.all', ['page' => $paginate['last_page'], 'per_page' => $paginate['per_page']]), + ]; + + return response()->json([ + 'pagination' => $paginate, + 'data' => array_values(Usuario::all()->skip($paginate['from'] - 1 )->take($paginate['per_page'])->all()) + ]); } /** @@ -32,12 +45,12 @@ class UsuariosController extends Controller { if (!$usuario) { return response()->json([ - 'error' => 'not_found', - 'message' => 'El usuario con id ' . $id . ' no existe' + 'error' => 'user_not_found', + 'message' => 'El usuario con id o auth0_id ' . $id . ' no existe' ], 404); } - return response()->json(['usuario' => $usuario]); + return response()->json($usuario); } /** @@ -62,14 +75,14 @@ class UsuariosController extends Controller { if (!$logged_user->canManageUsers()) { return response()->json([ - 'error' => 'not_allowed', + 'error' => 'cant_manage_users', 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para crear usuarios' ], 403); } if (!$logged_user->hasPermissionsOnRestaurant($restaurant)) { return response()->json([ - 'error' => 'not_allowed', + 'error' => 'cant_manage_user_of_another_restaurant', 'message' => 'El usuario ' . $logged_user->id . ' no puede crear un usuario en el restaurant ' . $restaurant->id . ' porque que no pertenece a el' ], 403); } @@ -98,7 +111,7 @@ class UsuariosController extends Controller { 'nombre' => $request->input('nombre') ]); - return response()->json(["usuario" => $usuario]); + return response()->json($usuario); } /** @@ -131,14 +144,14 @@ class UsuariosController extends Controller { if (!$logged_user->canManageUsers()) { return response()->json([ - 'error' => 'not_allowed', + 'error' => 'cant_manage_users', 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para modificar usuarios' ], 403); } if (!$logged_user->hasPermissionsOverUser($usuario)) { return response()->json([ - 'error' => 'not_allowed', + 'error' => 'cant_manage_that_user', 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para modificar al usuario ' . $usuario->id ], 403); } @@ -166,9 +179,15 @@ class UsuariosController extends Controller { if ($request->input('nombre')) $usuario->nombre = $request->input('nombre'); $usuario->save(); - return response()->json(["usuario" => $usuario]); + return response()->json($usuario); } + /** + * Elimina un usuario + * @param Request $request + * @param $id + * @return JsonResponse + */ public function delete(Request $request, $id) { /** @var Usuario $logged_user */ $logged_user = $request->user; @@ -183,14 +202,14 @@ class UsuariosController extends Controller { if (!$logged_user->canManageUsers()) { return response()->json([ - 'error' => 'not_allowed', + 'error' => 'cant_manage_users', 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para modificar usuarios' ], 403); } if (!$logged_user->hasPermissionsOverUser($usuario)) { return response()->json([ - 'error' => 'not_allowed', + 'error' => 'cant_manage_that_user', 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para modificar al usuario ' . $usuario->id ], 403); } diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index e75fd32..cfe4d02 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -21,6 +21,7 @@ use Ramsey\Uuid\Uuid; * @method static find($id) * @method static where(string $string, $sub) * @method static create(array $array) + * @method static paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) * * @package App\Models * diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php index 5d4ffac..d310c12 100644 --- a/backend/app/Providers/AppServiceProvider.php +++ b/backend/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Services\Auth0Service; +use App\Services\PaginatorService; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -17,5 +18,8 @@ class AppServiceProvider extends ServiceProvider $this->app->singleton(Auth0Service::class, function($app) { return new Auth0Service($app); }); + $this->app->singleton(PaginatorService::class, function($app) { + return new PaginatorService($app); + }); } } diff --git a/backend/app/Services/PaginatorService.php b/backend/app/Services/PaginatorService.php new file mode 100644 index 0000000..a6074af --- /dev/null +++ b/backend/app/Services/PaginatorService.php @@ -0,0 +1,47 @@ + "int", + 'from' => "int", + 'to' => "int", + 'total' => "int", + 'current_page' => "int", + 'last_page' => "int" + ])] + public function paginate(int $perPage, int $page, int $total) { + // Se mostraran entre 1 o mas elementos por pagina + $perPage = max(1, $perPage); + + // Se necesita saber cuantas paginas son, no recuerdo porque la formula funciona, pero lo hace + $lastPage = floor(($total + $perPage - 1) / $perPage); + + // Se necesita la pagina, la cual debe estar entre 1 y el numero de paginas calculadas previamente + $currentPage = min($lastPage, max(1, $page)); + + // Cuantos elementos se van a saltar para empezar a tomar usuarios + $skip = ($currentPage - 1) * $perPage; + + return [ + 'per_page' => $perPage, + 'from' => $skip + 1, + 'to' => min($total, $skip + $perPage), + 'total' => $total, + 'current_page' => $currentPage, + 'last_page' => $lastPage, + ]; + } +} diff --git a/backend/routes/web.php b/backend/routes/web.php index 67c3dea..a2be05f 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -1,7 +1,8 @@ get('/', function () use ($router) { return 'Public View';