Agregar y eliminar de un restaurante

This commit is contained in:
2021-04-30 22:51:57 -04:00
parent 65810b83d4
commit 736a5d2441
3 changed files with 202 additions and 7 deletions

View File

@@ -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 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 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 puede ser el UUID del usuario o el ID entregado por Auth0.
si el frontend tiene solamente acceso al ID entregado por Auth0.
Los usuarios eliminados podrán ser recuperados localmente, pero en auth0 serán Los usuarios eliminados podrán ser recuperados localmente, pero en auth0 serán
eliminados permanentemente y su asociación con restaurantes se perderá. 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 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 cualquier error, principalmente proviniendo desde Auth0, se utilizará el cuerpo
de error definido al inicio. 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"
}
}
]
}
```

View File

@@ -25,14 +25,14 @@ class UsuariosController extends Controller {
$paginate['links'] = [ $paginate['links'] = [
'first' => route('users.all', ['page' => 1, 'per_page' => $paginate['per_page']]), '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, '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']]), '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, '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']]), 'last' => route('users.all', ['page' => $paginate['last_page'], 'per_page' => $paginate['per_page']]),
]; ];
return response()->json([ return response()->json([
'pagination' => $paginate, '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); 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']));
}
} }

View File

@@ -12,8 +12,8 @@ function register_user_api($router) {
$router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete']); $router->delete('/{id}', ['as' => 'users.delete', 'uses' => 'UsuariosController@delete']);
// Rutas de acciones // Rutas de acciones
$router->put('/{id}/restaurantes', ['as' => 'users.add_restaurante', 'uses' => 'UsuariosController@addRestaurante']); $router->put('/{id}/restaurantes/{restaurant}', ['as' => 'users.add_to_restaurant', 'uses' => 'UsuariosController@addToRestaurant']);
$router->delete('/{id}/restaurantes', ['as' => 'users.remove_restaurante', 'uses' => 'UsuariosController@removeRestaurante']); $router->delete('/{id}/restaurantes/{restaurant}', ['as' => 'users.remove_from_restaurant', 'uses' => 'UsuariosController@removeFromRestaurant']);
}); });
} }