export function setupMultitenantRoutes()

in server/multitenancy/routes.ts [22:135]


export function setupMultitenantRoutes(
  router: IRouter,
  sessionStroageFactory: SessionStorageFactory<SecuritySessionCookie>,
  securityClient: SecurityClient
) {
  const PREFIX: string = '/api/v1';

  const entities = new AllHtmlEntities();

  /**
   * Updates selected tenant.
   */
  router.post(
    {
      path: `${PREFIX}/multitenancy/tenant`,
      validate: {
        body: schema.object({
          username: schema.string(),
          tenant: schema.string(),
        }),
      },
    },
    async (context, request, response) => {
      const tenant = request.body.tenant;

      const cookie: SecuritySessionCookie | null = await sessionStroageFactory
        .asScoped(request)
        .get();
      if (!cookie) {
        return response.badRequest({
          body: 'Invalid cookie',
        });
      }
      cookie.tenant = tenant;
      sessionStroageFactory.asScoped(request).set(cookie);
      return response.ok({
        body: entities.encode(tenant),
      });
    }
  );

  /**
   * Gets current selected tenant from session.
   */
  router.get(
    {
      path: `${PREFIX}/multitenancy/tenant`,
      validate: false,
    },
    async (context, request, response) => {
      const cookie = await sessionStroageFactory.asScoped(request).get();
      if (!cookie) {
        return response.badRequest({
          body: 'Invalid cookie.',
        });
      }
      return response.ok({
        body: entities.encode(cookie.tenant),
      });
    }
  );

  /**
   * Gets multitenant info of current user.
   *
   * Sample response of this API:
   * {
   *   "user_name": "admin",
   *   "not_fail_on_forbidden_enabled": false,
   *   "opensearch_dashboards_mt_enabled": true,
   *   "opensearch_dashboards_index": ".opensearch_dashboards",
   *   "opensearch_dashboards_server_user": "opensearch_dashboardsserver"
   * }
   */
  router.get(
    {
      path: `${PREFIX}/multitenancy/info`,
      validate: false,
    },
    async (context, request, response) => {
      try {
        const esResponse = await securityClient.getMultitenancyInfo(request);
        return response.ok({
          body: esResponse,
          headers: {
            'content-type': 'application/json',
          },
        });
      } catch (error) {
        return response.internalError({
          body: error.message,
        });
      }
    }
  );

  router.post(
    {
      // FIXME: Seems this is not being used, confirm and delete if not used anymore
      path: `${PREFIX}/multitenancy/migrate/{tenantindex}`,
      validate: {
        params: schema.object({
          tenantindex: schema.string(),
        }),
        query: schema.object({
          force: schema.literal('true'),
        }),
      },
    },
    async (context, request, response) => {
      return response.ok(); // TODO: implement tenant index migration logic
    }
  );
}