diff --git a/backend/README.md b/backend/README.md index 63df341..6fab563 100644 --- a/backend/README.md +++ b/backend/README.md @@ -248,8 +248,7 @@ la [documentación de Auth0](https://auth0.com/docs/api/management/v2#!/Users/pa Para eliminar a un usuario hay que enviar un `DELETE` a la ruta `/api/v1/user/{id}` donde `{id}` es el ID del usuario a buscar, este ID -puede ser el UUID del usuario o el ID entregado por Auth0, esto puede ser util -si el frontend tiene solamente acceso al ID entregado por Auth0. +puede ser el UUID del usuario o el ID entregado por Auth0. Los usuarios eliminados podrán ser recuperados localmente, pero en auth0 serán eliminados permanentemente y su asociación con restaurantes se perderá. @@ -257,3 +256,92 @@ eliminados permanentemente y su asociación con restaurantes se perderá. La respuesta de la API al eliminar será un código `204` sin cuerpo, pero ante cualquier error, principalmente proviniendo desde Auth0, se utilizará el cuerpo de error definido al inicio. + +### Agregar a un restaurant + +El usuario puede ser agregado a distintos restaurantes, para esto se envía +un `PUT` a la ruta `/api/v1/user/{id}/restaurantes/{restaurante_id}` +donde `{id}` es el ID del usuario a buscar, este ID puede ser el UUID del +usuario o el ID entregado por Auth0, y `{restaurante_id}` es el ID del +restaurante al que se va a agregar al usuario. + +La API responderá con el modelo del usuario actualizado, como en el siguiente +ejemplo, donde se agregó al restaurante `4e47a419-9398-47ff-82e9-b78851e71226` + +```json +{ + "id": "340c8e54-9a15-4bd2-9b59-108f267d5872", + "auth0_id": "auth0|608ca16fcfc3df0068fea6a4", + "nombre": "Jhon 2", + "created_at": "2021-04-30T18:31:44.000000Z", + "updated_at": "2021-04-30T18:31:52.000000Z", + "deleted_at": null, + "roles": [ + "admin", + "recaudador" + ], + "restaurantes": [ + { + "id": "63f62e17-e011-4f6f-8c15-5eb65a5014be", + "nombre": "Todo Rico Restaurant", + "created_at": "2021-04-26T16:37:59.181869Z", + "updated_at": "2021-04-26T16:37:59.181869Z", + "deleted_at": null, + "pivot": { + "usuario_id": "340c8e54-9a15-4bd2-9b59-108f267d5872", + "restaurante_id": "63f62e17-e011-4f6f-8c15-5eb65a5014be" + } + }, + { + "id": "4e47a419-9398-47ff-82e9-b78851e71226", + "nombre": "Otro Restaurant", + "created_at": "2021-05-01T02:40:10.047257Z", + "updated_at": "2021-05-01T02:40:10.047257Z", + "deleted_at": null, + "pivot": { + "usuario_id": "340c8e54-9a15-4bd2-9b59-108f267d5872", + "restaurante_id": "4e47a419-9398-47ff-82e9-b78851e71226" + } + } + ] +} +``` + +### Eliminar de un restaurant + +Si es necesario eliminar a un usuario de un restaurant, se debe enviar +un `DELETE` a la ruta `/api/v1/user/{id}/restaurantes/{restaurante_id}` +donde `{id}` es el ID del usuario a buscar, este ID puede ser el UUID del +usuario o el ID entregado por Auth0, y `{restaurante_id}` es el ID del +restaurante al que se va a agregar al usuario. + +La API responderá con el modelo del usuario actualizado, como en el siguiente +ejemplo, donde se eliminó del restaurante `4e47a419-9398-47ff-82e9-b78851e71226` + +```json +{ + "id": "340c8e54-9a15-4bd2-9b59-108f267d5872", + "auth0_id": "auth0|608ca16fcfc3df0068fea6a4", + "nombre": "Jhon 2", + "created_at": "2021-04-30T18:31:44.000000Z", + "updated_at": "2021-04-30T18:31:52.000000Z", + "deleted_at": null, + "roles": [ + "admin", + "recaudador" + ], + "restaurantes": [ + { + "id": "63f62e17-e011-4f6f-8c15-5eb65a5014be", + "nombre": "Todo Rico Restaurant", + "created_at": "2021-04-26T16:37:59.181869Z", + "updated_at": "2021-04-26T16:37:59.181869Z", + "deleted_at": null, + "pivot": { + "usuario_id": "340c8e54-9a15-4bd2-9b59-108f267d5872", + "restaurante_id": "63f62e17-e011-4f6f-8c15-5eb65a5014be" + } + } + ] +} +``` diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index 7227868..ae50567 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -25,14 +25,14 @@ class UsuariosController extends Controller { $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, + '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::with('restaurantes')->skip($paginate['from'] - 1 )->take($paginate['per_page'])->get()->all()) + 'data' => array_values(Usuario::with('restaurantes')->skip($paginate['from'] - 1)->take($paginate['per_page'])->get()->all()) ]); } @@ -229,4 +229,111 @@ class UsuariosController extends Controller { return response()->json([], 204); } + + /** + * Agrega usuario a un restaurant + * @param Request $request + * @param $id + * @param $restaurant + * @return JsonResponse + */ + public function addToRestaurant(Request $request, $id, $restaurant) { + /** @var Usuario $logged_user */ + $logged_user = $request->user; + + $usuario = Usuario::findByIdOrAuth0Id($id); + if (!$usuario) { + return response()->json([ + 'error' => 'not_found', + 'message' => 'El usuario con id ' . $id . ' no existe' + ], 404); + } + + $restaurant = Restaurante::find($restaurant); + if (!$restaurant) { + return response()->json([ + 'error' => 'not_found', + 'message' => 'El restaurante con id ' . $id . ' no existe' + ], 404); + } + + if (!$logged_user->canManageUsers()) { + return response()->json([ + 'error' => 'cant_manage_users', + 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para modificar usuarios' + ], 403); + } + + if (!$logged_user->hasPermissionsOnRestaurant($restaurant)) { + return response()->json([ + 'error' => 'cant_manage_user_of_another_restaurant', + 'message' => 'El usuario ' . $logged_user->id . ' no puede agregar un usuario al restaurant ' . $restaurant->id . ' porque que no pertenece a el' + ], 403); + } + + if ($usuario->restaurantes->contains($restaurant)) { + return response()->json([ + 'error' => 'already_on_restaurant', + 'message' => 'El usuario ' . $usuario->id . ' ya se encuentra en el restaurante ' . $restaurant->id + ], 400); + } + + $restaurant->usuarios()->attach($usuario); + + return response()->json($usuario->fresh(['restaurantes'])); + } + + /** + * Saca a un usuario de un restaurant + * + * @param Request $request + * @param $id + * @param $restaurant + * @return JsonResponse + */ + public function removeFromRestaurant(Request $request, $id, $restaurant) { + /** @var Usuario $logged_user */ + $logged_user = $request->user; + + $usuario = Usuario::findByIdOrAuth0Id($id); + if (!$usuario) { + return response()->json([ + 'error' => 'not_found', + 'message' => 'El usuario con id ' . $id . ' no existe' + ], 404); + } + + $restaurant = Restaurante::find($restaurant); + if (!$restaurant) { + return response()->json([ + 'error' => 'not_found', + 'message' => 'El restaurante con id ' . $id . ' no existe' + ], 404); + } + + if (!$logged_user->canManageUsers()) { + return response()->json([ + 'error' => 'cant_manage_users', + 'message' => 'El usuario ' . $logged_user->id . ' no tiene permisos para modificar usuarios' + ], 403); + } + + if (!$logged_user->hasPermissionsOnRestaurant($restaurant)) { + return response()->json([ + 'error' => 'cant_manage_user_of_another_restaurant', + 'message' => 'El usuario ' . $logged_user->id . ' no puede agregar un usuario al restaurant ' . $restaurant->id . ' porque que no pertenece a el' + ], 403); + } + + if (!$usuario->restaurantes->contains($restaurant)) { + return response()->json([ + 'error' => 'already_not_on_restaurant', + 'message' => 'El usuario ' . $usuario->id . ' no encuentra en el restaurante ' . $restaurant->id + ], 400); + } + + $restaurant->usuarios()->detach($usuario); + + return response()->json($usuario->fresh(['restaurantes'])); + } } diff --git a/backend/routes/web.php b/backend/routes/web.php index 0ea20cf..69a92ee 100644 --- a/backend/routes/web.php +++ b/backend/routes/web.php @@ -12,8 +12,8 @@ function register_user_api($router) { $router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete']); // Rutas de acciones - $router->put('/{id}/restaurantes', ['as' => 'users.add_restaurante', 'uses' => 'UsuariosController@addRestaurante']); - $router->delete('/{id}/restaurantes', ['as' => 'users.remove_restaurante', 'uses' => 'UsuariosController@removeRestaurante']); + $router->put('/{id}/restaurantes/{restaurant}', ['as' => 'users.add_to_restaurant', 'uses' => 'UsuariosController@addToRestaurant']); + $router->delete('/{id}/restaurantes/{restaurant}', ['as' => 'users.remove_from_restaurant', 'uses' => 'UsuariosController@removeFromRestaurant']); }); }