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) { 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' ]); } if (!$usuario) { return response()->json([ 'error' => 'not_found', 'message' => 'El usuario con id ' . $id . ' no existe' ], 404); } return response()->json(['usuario' => $usuario]); } /** * @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', ]); $restaurant = $request->input('restaurant'); // solo un global admin puede crear usuarios en cualquier restaurant if (!in_array('global_admin', $request->user->roles)) { // si el usuario no es administrador no puede crear usuarios if (!in_array('admin', $request->user->roles)) { return response()->json([ 'error' => 'not_allowed', 'message' => 'El usuario no puede tiene permisos para crear usuarios' ]); } // 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' ]); } } $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 = new Usuario(); $usuario->id = Uuid::uuid4(); $usuario->auth0_id = $auth0User['identities'][0]['provider'] . '|' . $auth0User['identities'][0]['user_id']; $usuario->nombre = $request->input('nombre'); $usuario->save(); $usuario->restaurantes()->attach($restaurant); return response()->json(["usuario" => $usuario]); } public function update(Request $request) { } public function delete(Request $request) { } }