Files
nodewarden/webapp/src/lib/api/domains.ts
T
shuaiplus 7c58282e42 feat: add registration invite code handling and improve error translations
- Updated AuthViews component to conditionally show invite code field based on registrationInviteRequired prop.
- Enhanced error handling in auth API functions to use translateServerError for better user feedback.
- Added new translations for various server error messages in English, Spanish, Russian, Chinese (Simplified and Traditional).
- Modified demo initial bootstrap state to include registrationInviteRequired flag.
- Updated types to include registrationInviteRequired in WebBootstrapResponse.
2026-05-10 23:07:07 +08:00

62 lines
2.4 KiB
TypeScript

import { t } from '@/lib/i18n';
import type { DomainRules } from '@/lib/types';
import { parseErrorMessage, parseJson, type AuthedFetch } from './shared';
function normalizeDomainsResponse(body: Partial<DomainRules> & Record<string, unknown>): DomainRules {
const equivalentDomains = Array.isArray(body.equivalentDomains)
? body.equivalentDomains
: Array.isArray(body.EquivalentDomains)
? body.EquivalentDomains as string[][]
: [];
const globalEquivalentDomains = Array.isArray(body.globalEquivalentDomains)
? body.globalEquivalentDomains
: Array.isArray(body.GlobalEquivalentDomains)
? body.GlobalEquivalentDomains as DomainRules['globalEquivalentDomains']
: [];
const customEquivalentDomains = Array.isArray(body.customEquivalentDomains)
? body.customEquivalentDomains as DomainRules['customEquivalentDomains']
: Array.isArray(body.CustomEquivalentDomains)
? body.CustomEquivalentDomains as DomainRules['customEquivalentDomains']
: equivalentDomains.map((domains, index) => ({
id: `custom:${index}`,
domains,
excluded: false,
}));
return {
equivalentDomains,
customEquivalentDomains,
globalEquivalentDomains,
object: 'domains',
};
}
export async function getDomainRules(authedFetch: AuthedFetch): Promise<DomainRules> {
const resp = await authedFetch('/api/settings/domains');
if (!resp.ok) throw new Error(await parseErrorMessage(resp, t('txt_domain_rules_load_failed')));
const body = await parseJson<Partial<DomainRules> & Record<string, unknown>>(resp);
if (!body) throw new Error(t('txt_domain_rules_invalid_response'));
return normalizeDomainsResponse(body);
}
export async function saveDomainRules(
authedFetch: AuthedFetch,
payload: {
customEquivalentDomains: DomainRules['customEquivalentDomains'];
equivalentDomains: string[][];
excludedGlobalEquivalentDomains: number[];
}
): Promise<DomainRules> {
const resp = await authedFetch('/api/settings/domains', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
if (!resp.ok) {
throw new Error(await parseErrorMessage(resp, t('txt_domain_rules_save_failed')));
}
const body = await parseJson<Partial<DomainRules> & Record<string, unknown>>(resp);
if (!body) throw new Error(t('txt_domain_rules_invalid_response'));
return normalizeDomainsResponse(body);
}