From 2510261b63b317305c813d51f40d3f8551b2655e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cort=C3=A9s?= Date: Fri, 30 Apr 2021 02:23:57 -0400 Subject: [PATCH] Actualizar usuarios --- .../Http/Controllers/UsuariosController.php | 85 ++++++++++++++++--- backend/app/Models/Usuario.php | 8 ++ backend/app/Services/Auth0Service.php | 26 ++++-- 3 files changed, 100 insertions(+), 19 deletions(-) diff --git a/backend/app/Http/Controllers/UsuariosController.php b/backend/app/Http/Controllers/UsuariosController.php index ce52b26..dd443b2 100644 --- a/backend/app/Http/Controllers/UsuariosController.php +++ b/backend/app/Http/Controllers/UsuariosController.php @@ -27,16 +27,7 @@ class UsuariosController extends Controller { * @return JsonResponse */ public function get($id) { - if (str_starts_with($id, 'auth0')) { - $usuario = Usuario::where('auth0_id', urldecode($id))->first(); - } else if (Uuid::isValid($id)) { - $usuario = Usuario::where('id', $id)->first(); - } else { - return response()->json([ - 'error' => 'invalid_id', - 'message' => 'El id debe ser un UUID valido' - ]); - } + $usuario = Usuario::findByIdOrAuth0Id($id); if (!$usuario) { return response()->json([ @@ -49,6 +40,7 @@ class UsuariosController extends Controller { } /** + * Crea un nuevo usuario localmente y en auth0 * @throws ValidationException */ public function create(Request $request) { @@ -71,14 +63,14 @@ class UsuariosController extends Controller { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no puede tiene permisos para crear usuarios' - ]); + ], 403); } // los administradores solo pueden crear usuarios en su propio restaurant if (!$request->user->restaurantes->contains($restaurant)) { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no puede crear un usuario en un restaurant al que no pertenece' - ]); + ], 403); } } @@ -111,8 +103,75 @@ class UsuariosController extends Controller { return response()->json(["usuario" => $usuario]); } - public function update(Request $request) { + /** + * Actualiza un usuario, dado su id o auth0_id + * @param Request $request + * @param $id + * @return JsonResponse + * @throws ValidationException + */ + public function update(Request $request, $id) { + $this->validate($request, [ + 'nombre' => 'sometimes', + 'email' => 'sometimes|email', + 'username' => 'sometimes', + 'password' => 'sometimes', + 'roles' => 'sometimes|array', + 'roles.*' => ['sometimes', Rule::in(['admin', 'mesero', 'recaudador', 'productor'])], + ]); + $usuario = Usuario::findByIdOrAuth0Id($id); + + if (!$usuario) { + return response()->json([ + 'error' => 'not_found', + 'message' => 'El usuario con id ' . $id . ' no existe' + ], 404); + } + + // solo un global admin puede modificar usuarios en cualquier restaurant + if (!in_array('global_admin', $request->user->roles)) { + // si el usuario no es administrador no puede modificar usuarios + if (!in_array('admin', $request->user->roles)) { + return response()->json([ + 'error' => 'not_allowed', + 'message' => 'El usuario no puede tiene permisos para modificar usuarios' + ], 403); + } + // los administradores solo pueden modificar usuarios en sus propio restaurantes + if ($request->user->restaurantes->intersect($usuario->restaurantes)->count() == 0) { + return response()->json([ + 'error' => 'not_allowed', + 'message' => 'El usuario no puede modificar un usuario en un restaurant al que no pertenece' + ], 403); + } + } + + $metadata = []; + if ($request->input('roles')) + $metadata['roles'] = $request->input('roles'); + + $auth0 = app(Auth0Service::class); + $auth0User = $auth0->updateUser( + auth0_id: $usuario->auth0_id, + email: $request->input('email'), + username: $request->input('username'), + password: $request->input('password'), + metadata: $metadata + ); + + if (array_key_exists('error', $auth0User)) { + return response()->json([ + 'error' => $auth0User['errorCode'], + 'message' => $auth0User['message'], + ], $auth0User['statusCode']); + } + + if ($request->input('nombre')) + $usuario->nombre = $request->input('nombre'); + $usuario->save(); + + return response()->json(["usuario" => $usuario]); } public function delete(Request $request) { diff --git a/backend/app/Models/Usuario.php b/backend/app/Models/Usuario.php index 158dc96..be8234a 100644 --- a/backend/app/Models/Usuario.php +++ b/backend/app/Models/Usuario.php @@ -27,6 +27,14 @@ class Usuario extends Model { protected $table = 'usuarios'; protected $appends = ['roles']; + public static function findByIdOrAuth0Id($id) { + if (str_starts_with($id, 'auth0')) { + return Usuario::where('auth0_id', urldecode($id))->first(); + } else { + return Usuario::where('id', $id)->first(); + } + } + public function restaurantes() { return $this->belongsToMany(Restaurante::class, 'usuarios_restaurantes', 'usuario_id', 'restaurante_id'); } diff --git a/backend/app/Services/Auth0Service.php b/backend/app/Services/Auth0Service.php index e3e9c9f..26636f9 100644 --- a/backend/app/Services/Auth0Service.php +++ b/backend/app/Services/Auth0Service.php @@ -49,12 +49,7 @@ class Auth0Service extends ServiceProvider { ->json(); } - public function createUser( - $email, - $username, - $password, - $metadata, - ) { + public function createUser($email, $username, $password, $metadata) { $endpoint = env('AUTH0_DOMAIN') . 'api/v2/users'; $payload = [ @@ -70,4 +65,23 @@ class Auth0Service extends ServiceProvider { ->post($endpoint, $payload) ->json(); } + + public function updateUser($auth0_id, $email, $username, $password, $metadata) { + $endpoint = env('AUTH0_DOMAIN') . 'api/v2/users/' . $auth0_id; + + $payload = ["connection" => env('AUTH0_CONNECTION')]; + + if ($email) + $payload["email"] = $email; + if ($username) + $payload["username"] = $username; + if ($password) + $payload["password"] = $password; + if ($metadata) + $payload["app_metadata"] = $metadata; + + return Http::withToken($this->getToken()) + ->patch($endpoint, $payload) + ->json(); + } }