json(['usuarios' => $usuarios]); } /** * Obtiene un usuario por su id, siendo el id de auth0 o el id de la base de datos * @param $id * @return JsonResponse */ public function get($id) { $usuario = Usuario::findByIdOrAuth0Id($id); if (!$usuario) { return response()->json([ 'error' => 'not_found', 'message' => 'El usuario con id ' . $id . ' no existe' ], 404); } return response()->json(['usuario' => $usuario]); } /** * Crea un nuevo usuario localmente y en auth0 * @throws ValidationException */ public function create(Request $request) { $this->validate($request, [ 'nombre' => 'required', 'email' => 'required|email', 'username' => 'required', 'password' => 'required', 'roles' => 'required|array', 'roles.*' => ['required', Rule::in(['admin', 'mesero', 'recaudador', 'productor'])], 'restaurant' => 'required|exists:restaurantes,id', ]); /** @var Usuario $logged_user */ $logged_user = $request->user; $restaurant = Restaurante::find($request->input('restaurant')); if (!$logged_user->canManageUsers()) { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no tiene permisos para crear usuarios' ], 403); } if (!$logged_user->hasPermissionsOnRestaurant($restaurant)) { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no puede crear un usuario en un restaurant al que no pertenece' ], 403); } $auth0 = app(Auth0Service::class); $auth0User = $auth0->createUser( email: $request->input('email'), username: $request->input('username'), password: $request->input('password'), metadata: [ 'roles' => $request->input('roles'), 'restaurantes' => [$restaurant], ] ); if (array_key_exists('error', $auth0User)) { return response()->json([ 'error' => $auth0User['errorCode'], 'message' => $auth0User['message'], ], $auth0User['statusCode']); } $usuario = $restaurant->usuarios()->create([ 'id' => Uuid::uuid4(), 'auth0_id' => $auth0User['identities'][0]['provider'] . '|' . $auth0User['identities'][0]['user_id'], 'nombre' => $request->input('nombre') ]); return response()->json(["usuario" => $usuario]); } /** * 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'])], ]); /** @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); } if (!$logged_user->canManageUsers()) { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no tiene permisos para modificar usuarios' ], 403); } if (!$logged_user->hasPermissionsOverUser($usuario)) { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no tiene permisos para modificar a este usuario' ], 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) { } }