Creating a control panel infrastructure

This commit is contained in:
2026-07-23 19:41:21 +03:30
parent 7fbc47766c
commit ddf36f8470
18 changed files with 3377 additions and 35 deletions
+37 -11
View File
@@ -11,17 +11,11 @@ export class GetUserService {
throw new NotFoundException('domain required');
}
const tenant = await this.prisma.tenant.findFirst({
where: {
isActive: true,
OR: [
{ domain: host },
{ domain: host.replace(/^www\./, '') },
{ domain: `www.${host.replace(/^www\./, '')}` },
],
},
const tenants = await this.prisma.tenant.findMany({
where: { isActive: true },
});
const tenant = tenants.find((item) => this.matchesHost(item, host));
if (!tenant) {
throw new NotFoundException('tenant not found for domain');
}
@@ -31,7 +25,7 @@ export class GetUserService {
const branding = {
id: tenant.id,
name: tenant.slug,
name: tenant.nameEn || tenant.slug,
name_fa: tenant.nameFa,
name_en: tenant.nameEn,
avatar: tenant.avatarUrl,
@@ -43,7 +37,7 @@ export class GetUserService {
app_url: tenant.appUrl,
admin_url: tenant.adminUrl,
product: tenant.product,
theme: ui?.app?.theme?.mode === 'light' ? 'dynamicMode' : 'dynamicMode',
theme: 'dynamicMode',
mode: 'dynamicMode',
app_ui_config: tenant.product === 'khanegi' ? ui : undefined,
};
@@ -54,6 +48,38 @@ export class GetUserService {
};
}
private matchesHost(
tenant: {
domain: string;
domains: unknown;
},
host: string,
) {
const candidates = new Set<string>();
for (const value of [tenant.domain, ...this.readDomains(tenant.domains)]) {
const normalized = this.normalizeHost(value);
if (!normalized) continue;
candidates.add(normalized);
candidates.add(normalized.replace(/^www\./, ''));
candidates.add(`www.${normalized.replace(/^www\./, '')}`);
}
return candidates.has(host) || candidates.has(host.replace(/^www\./, ''));
}
private readDomains(raw: unknown): string[] {
if (!raw) return [];
if (Array.isArray(raw)) return raw.map(String);
if (typeof raw === 'string') {
try {
const parsed = JSON.parse(raw);
return Array.isArray(parsed) ? parsed.map(String) : [];
} catch {
return [];
}
}
return [];
}
private normalizeHost(value: string) {
return value
.trim()