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);
}