function getRoutes(gladys) {
  const areaController = AreaController(gladys);
  const calendarController = CalendarController(gladys);
  const cameraController = CameraController(gladys);
  const dashboardController = DashboardController(gladys);
  const deviceController = DeviceController(gladys);
  const lightController = LightController(gladys);
  const jobController = JobController(gladys);
  const locationController = LocationController(gladys);
  const userController = UserController(gladys);
  const houseController = HouseController(gladys);
  const httpController = HttpController(gladys);
  const messageController = MessageController(gladys);
  const pingController = PingController();
  const gatewayController = GatewayController(gladys);
  const roomController = RoomController(gladys);
  const variableController = VariableController(gladys);
  const sessionController = SessionController(gladys);
  const serviceController = ServiceController(gladys);
  const sceneController = SceneController(gladys);
  const systemController = SystemController(gladys);
  const weatherController = WeatherController(gladys);

  const routes = {};

  // add services routes
  const services = Object.entries(gladys.service.getServices());
  // foreach service
  services.forEach((service) => {
    // if the service has a controllers object
    if (service[1].get().controllers) {
      Object.assign(routes, service[1].get().controllers);
    }
  });

  const coreRoutes = {
    // open routes
    'get /api/v1/ping': {
      authenticated: false,
      controller: pingController.ping,
    },
    'post /api/v1/login': {
      authenticated: false,
      rateLimit: true,
      controller: userController.login,
    },
    'post /api/v1/access_token': {
      authenticated: false,
      rateLimit: true,
      controller: userController.getAccessToken,
    },
    'post /api/v1/forgot_password': {
      authenticated: false,
      rateLimit: true,
      controller: userController.forgotPassword,
    },
    'post /api/v1/reset_password': {
      authenticated: false,
      rateLimit: true,
      resetPasswordAuth: true,
      controller: userController.resetPassword,
    },
    'get /api/v1/setup': {
      authenticated: false,
      controller: userController.getSetupState,
    },
    'post /api/v1/signup': {
      authenticated: false,
      instanceNotConfigured: true,
      controller: userController.create,
    },
    // area
    'post /api/v1/area': {
      authenticated: true,
      controller: areaController.create,
    },
    'get /api/v1/area': {
      authenticated: true,
      controller: areaController.get,
    },
    'get /api/v1/area/:area_selector': {
      authenticated: true,
      controller: areaController.getBySelector,
    },
    'patch /api/v1/area/:area_selector': {
      authenticated: true,
      controller: areaController.update,
    },
    'delete /api/v1/area/:area_selector': {
      authenticated: true,
      controller: areaController.destroy,
    },
    // calendar
    'post /api/v1/calendar': {
      authenticated: true,
      controller: calendarController.create,
    },
    'get /api/v1/calendar': {
      authenticated: true,
      controller: calendarController.get,
    },
    'get /api/v1/calendar/event': {
      authenticated: true,
      controller: calendarController.getEvents,
    },
    'patch /api/v1/calendar/:calendar_selector': {
      authenticated: true,
      controller: calendarController.update,
    },
    'delete /api/v1/calendar/:calendar_selector': {
      authenticated: true,
      controller: calendarController.destroy,
    },
    'post /api/v1/calendar/:calendar_selector/event': {
      authenticated: true,
      controller: calendarController.createEvent,
    },
    'patch /api/v1/calendar/event/:calendar_event_selector': {
      authenticated: true,
      controller: calendarController.updateEvent,
    },
    'delete /api/v1/calendar/event/:calendar_event_selector': {
      authenticated: true,
      controller: calendarController.destroyEvent,
    },
    // camera
    'get /api/v1/camera': {
      authenticated: true,
      controller: cameraController.get,
    },
    'get /api/v1/camera/:camera_selector/image': {
      authenticated: true,
      controller: cameraController.getImage,
    },
    'post /api/v1/camera/:camera_selector/image': {
      authenticated: true,
      controller: cameraController.setImage,
    },
    // dashboard
    'get /api/v1/dashboard': {
      authenticated: true,
      controller: dashboardController.get,
    },
    'post /api/v1/dashboard': {
      authenticated: true,
      controller: dashboardController.create,
    },
    'post /api/v1/dashboard/order': {
      authenticated: true,
      controller: dashboardController.updateOrder,
    },
    'get /api/v1/dashboard/:dashboard_selector': {
      authenticated: true,
      controller: dashboardController.getBySelector,
    },
    'patch /api/v1/dashboard/:dashboard_selector': {
      authenticated: true,
      controller: dashboardController.update,
    },
    'delete /api/v1/dashboard/:dashboard_selector': {
      authenticated: true,
      controller: dashboardController.destroy,
    },
    // device
    'post /api/v1/device': {
      authenticated: true,
      controller: deviceController.create,
    },
    'get /api/v1/device': {
      authenticated: true,
      controller: deviceController.get,
    },
    'get /api/v1/device/duckdb_migration_state': {
      authenticated: true,
      controller: deviceController.getDuckDbMigrationState,
    },
    'post /api/v1/device/purge_all_sqlite_state': {
      authenticated: true,
      controller: deviceController.purgeAllSqliteStates,
    },
    'post /api/v1/device/migrate_from_sqlite_to_duckdb': {
      authenticated: true,
      controller: deviceController.migrateFromSQLiteToDuckDb,
    },
    'get /api/v1/service/:service_name/device': {
      authenticated: true,
      controller: deviceController.getDevicesByService,
    },
    'get /api/v1/device/:device_selector': {
      authenticated: true,
      controller: deviceController.getBySelector,
    },
    'delete /api/v1/device/:device_selector': {
      authenticated: true,
      controller: deviceController.destroy,
    },
    'post /api/v1/device/:device_selector/:feature_category/:feature_type/value': {
      authenticated: true,
      controller: deviceController.setValue,
    },
    'post /api/v1/device_feature/:device_feature_selector/value': {
      authenticated: true,
      controller: deviceController.setValueFeature,
    },
    'get /api/v1/device_feature/aggregated_states': {
      authenticated: true,
      controller: deviceController.getDeviceFeaturesAggregated,
    },
    // house
    'post /api/v1/house': {
      authenticated: true,
      admin: true,
      controller: houseController.create,
    },
    'get /api/v1/house/:house_selector': {
      authenticated: true,
      controller: houseController.getBySelector,
    },
    'patch /api/v1/house/:house_selector': {
      authenticated: true,
      admin: true,
      controller: houseController.update,
    },
    'get /api/v1/house': {
      authenticated: true,
      controller: houseController.get,
    },
    'delete /api/v1/house/:house_selector': {
      authenticated: true,
      admin: true,
      controller: houseController.destroy,
    },
    'get /api/v1/house/:house_selector/room': {
      authenticated: true,
      controller: houseController.getRooms,
    },
    'post /api/v1/house/:house_selector/user/:user_selector/seen': {
      authenticated: true,
      controller: houseController.userSeen,
    },
    // House Alarm
    'post /api/v1/house/:house_selector/arm': {
      authenticated: true,
      controller: houseController.arm,
    },
    'post /api/v1/house/:house_selector/disarm': {
      authenticated: true,
      controller: houseController.disarm,
    },
    'post /api/v1/house/:house_selector/disarm_with_code': {
      alarmAuth: true,
      controller: houseController.disarmWithCode,
    },
    'post /api/v1/house/:house_selector/partial_arm': {
      authenticated: true,
      controller: houseController.partialArm,
    },
    'post /api/v1/house/:house_selector/panic': {
      authenticated: true,
      controller: houseController.panic,
    },
    // job
    'get /api/v1/job': {
      authenticated: true,
      admin: true,
      controller: jobController.get,
    },
    // http
    'post /api/v1/http/request': {
      authenticated: true,
      admin: true,
      controller: httpController.request,
    },
    // gateway
    'get /api/v1/gateway/status': {
      authenticated: true,
      admin: true,
      controller: gatewayController.getStatus,
    },
    'post /api/v1/gateway/login': {
      authenticated: true,
      admin: true,
      controller: gatewayController.login,
    },
    'post /api/v1/gateway/logout': {
      authenticated: true,
      admin: true,
      controller: gatewayController.logout,
    },
    'post /api/v1/gateway/login-two-factor': {
      authenticated: true,
      admin: true,
      controller: gatewayController.loginTwoFactor,
    },
    'get /api/v1/gateway/key': {
      authenticated: true,
      admin: true,
      controller: gatewayController.getUsersKeys,
    },
    'patch /api/v1/gateway/key': {
      authenticated: true,
      controller: gatewayController.saveUsersKeys,
    },
    'get /api/v1/gateway/backup': {
      authenticated: true,
      admin: true,
      controller: gatewayController.getBackups,
    },
    'post /api/v1/gateway/backup': {
      authenticated: true,
      admin: true,
      controller: gatewayController.createBackup,
    },
    'post /api/v1/gateway/backup/restore': {
      authenticated: true,
      admin: true,
      controller: gatewayController.restoreBackup,
    },
    'get /api/v1/gateway/backup/restore/status': {
      authenticated: true,
      admin: true,
      controller: gatewayController.getRestoreStatus,
    },
    'get /api/v1/gateway/instance/key': {
      authenticated: true,
      admin: true,
      controller: gatewayController.getInstanceKeysFingerprint,
    },
    'post /api/v1/gateway/openai/ask': {
      authenticated: true,
      controller: gatewayController.openAIAsk,
    },
    'post /api/v1/gateway/refresh-latest-gladys-version': {
      authenticated: true,
      admin: true,
      controller: gatewayController.refreshLatestGladysVersion,
    },
    // room
    'get /api/v1/room': {
      authenticated: true,
      controller: roomController.get,
    },
    'get /api/v1/room/:room_selector': {
      authenticated: true,
      controller: roomController.getBySelector,
    },
    'post /api/v1/house/:house_selector/room': {
      authenticated: true,
      admin: true,
      controller: roomController.create,
    },
    'patch /api/v1/room/:room_selector': {
      authenticated: true,
      admin: true,
      controller: roomController.update,
    },
    'delete /api/v1/room/:room_selector': {
      authenticated: true,
      admin: true,
      controller: roomController.destroy,
    },
    // message
    'post /api/v1/message': {
      authenticated: true,
      controller: messageController.create,
    },
    'get /api/v1/message': {
      authenticated: true,
      controller: messageController.get,
    },
    // service
    'post /api/v1/service/:service_name/start': {
      authenticated: true,
      admin: true,
      controller: serviceController.start,
    },
    'post /api/v1/service/:service_name/stop': {
      authenticated: true,
      admin: true,
      controller: serviceController.stop,
    },
    'get /api/v1/service/:service_name': {
      authenticated: true,
      controller: serviceController.getByName,
    },
    'get /api/v1/service': {
      authenticated: true,
      controller: serviceController.getAll,
    },
    // user
    'get /api/v1/user': {
      authenticated: true,
      controller: userController.getUsers,
    },
    'get /api/v1/user/:user_selector': {
      authenticated: true,
      controller: userController.getUserBySelector,
    },
    'patch /api/v1/user/:user_selector': {
      authenticated: true,
      admin: true,
      controller: userController.update,
    },
    'delete /api/v1/user/:user_selector': {
      authenticated: true,
      admin: true,
      controller: userController.deleteUser,
    },
    'get /api/v1/me': {
      authenticated: true,
      controller: userController.getMySelf,
    },
    'patch /api/v1/me': {
      authenticated: true,
      controller: userController.updateMySelf,
    },
    'get /api/v1/me/picture': {
      authenticated: true,
      controller: userController.getMyPicture,
    },
    // location
    'post /api/v1/user/:user_selector/location': {
      authenticated: true,
      controller: locationController.create,
    },
    'get /api/v1/user/:user_selector/location': {
      authenticated: true,
      controller: locationController.getLocationsUser,
    },
    // variable
    'post /api/v1/service/:service_name/variable/:variable_key': {
      authenticated: true,
      controller: variableController.setForLocalService,
    },
    'get /api/v1/service/:service_name/variable/:variable_key': {
      authenticated: true,
      controller: variableController.getByLocalService,
    },
    'post /api/v1/variable/:variable_key': {
      authenticated: true,
      controller: variableController.setValue,
    },
    'get /api/v1/variable/:variable_key': {
      authenticated: true,
      controller: variableController.getValue,
    },
    // session
    'post /api/v1/session/:session_id/revoke': {
      authenticated: true,
      controller: sessionController.revoke,
    },
    'post /api/v1/session/tablet_mode': {
      authenticated: true,
      controller: sessionController.setTabletMode,
    },
    'get /api/v1/session/tablet_mode': {
      authenticated: true,
      controller: sessionController.getTabletMode,
    },
    'post /api/v1/session/api_key': {
      authenticated: true,
      controller: sessionController.createApiKey,
    },
    'get /api/v1/session': {
      authenticated: true,
      controller: sessionController.get,
    },
    // light
    'post /api/v1/light/:device_selector/on': {
      authenticated: true,
      controller: lightController.turnOn,
    },
    // scene
    'post /api/v1/scene': {
      authenticated: true,
      admin: true,
      controller: sceneController.create,
    },
    'get /api/v1/scene': {
      authenticated: true,
      controller: sceneController.get,
    },
    'get /api/v1/scene/:scene_selector': {
      authenticated: true,
      controller: sceneController.getBySelector,
    },
    'patch /api/v1/scene/:scene_selector': {
      authenticated: true,
      admin: true,
      controller: sceneController.update,
    },
    'delete /api/v1/scene/:scene_selector': {
      authenticated: true,
      admin: true,
      controller: sceneController.destroy,
    },
    'post /api/v1/scene/:scene_selector/start': {
      authenticated: true,
      controller: sceneController.start,
    },
    'post /api/v1/scene/:scene_selector/duplicate': {
      authenticated: true,
      controller: sceneController.duplicate,
    },
    'get /api/v1/tag_scene': {
      authenticated: true,
      controller: sceneController.getTag,
    },
    // system
    'get /api/v1/system/info': {
      authenticated: true,
      controller: systemController.getSystemInfos,
    },
    'get /api/v1/system/disk': {
      authenticated: true,
      controller: systemController.getDiskSpace,
    },
    'get /api/v1/system/container': {
      authenticated: true,
      controller: systemController.getContainers,
    },
    'post /api/v1/system/shutdown': {
      authenticated: true,
      admin: true,
      controller: systemController.shutdown,
    },
    'post /api/v1/system/upgrade': {
      authenticated: true,
      admin: true,
      controller: systemController.installUpgrade,
    },
    'post /api/v1/system/vacuum': {
      authenticated: true,
      admin: true,
      controller: systemController.vacuum,
    },
    // user
    'post /api/v1/user': {
      authenticated: true,
      admin: true,
      controller: userController.create,
    },
    // weather
    'get /api/v1/user/:user_selector/weather': {
      authenticated: true,
      controller: weatherController.getByUser,
    },
    'get /api/v1/house/:house_selector/weather': {
      authenticated: true,
      controller: weatherController.getByHouse,
    },
  };

  Object.assign(routes, coreRoutes);

  return routes;
}
@description Return object of routes.
@param {object} gladys - Gladys object.
@returns {object} Return object of routes.
@example
getRoutes(gladys);