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
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"
}
}
]
}
```

View File

@@ -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']));
}
}

View File

@@ -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']);
});
}