function resolve()

in server/multitenancy/tenant_resolver.ts [91:157]


function resolve(
  username: string,
  requestedTenant: string | undefined,
  preferredTenants: string[] | undefined,
  availableTenants: any, // is an object like { tenant_name_1: true, tenant_name_2: false, ... }
  globalTenantEnabled: boolean,
  privateTenantEnabled: boolean
): string | undefined {
  const availableTenantsClone = cloneDeep(availableTenants);
  delete availableTenantsClone[username];

  if (!globalTenantEnabled && !privateTenantEnabled && isEmpty(availableTenantsClone)) {
    return undefined;
  }

  if (isValidTenant(requestedTenant)) {
    requestedTenant = requestedTenant!;
    if (requestedTenant in availableTenants) {
      return requestedTenant;
    }

    if (
      privateTenantEnabled &&
      username in availableTenants &&
      PRIVATE_TENANTS.indexOf(requestedTenant) > -1
    ) {
      return PRIVATE_TENANT_SYMBOL;
    }

    if (globalTenantEnabled && GLOBAL_TENANTS.indexOf(requestedTenant) > -1) {
      return GLOBAL_TENANT_SYMBOL;
    }
  }

  if (preferredTenants && !isEmpty(preferredTenants)) {
    for (const element of preferredTenants) {
      const tenant = element.toLowerCase();

      if (globalTenantEnabled && GLOBAL_TENANTS.indexOf(tenant) > -1) {
        return GLOBAL_TENANT_SYMBOL;
      }

      if (
        privateTenantEnabled &&
        PRIVATE_TENANTS.indexOf(tenant) > -1 &&
        username in availableTenants
      ) {
        return PRIVATE_TENANT_SYMBOL;
      }

      if (tenant in availableTenants) {
        return tenant;
      }
    }
  }

  if (globalTenantEnabled) {
    return GLOBAL_TENANT_SYMBOL;
  }

  if (privateTenantEnabled) {
    return PRIVATE_TENANT_SYMBOL;
  }

  // fall back to the first tenant in the available tenants
  return findKey(availableTenantsClone, () => true);
}