export interface ThWebLoginInput { tenantId: string; userName: string; password: string; uuid?: string; code?: string; } export interface ThWebLoginOutputDto { token: string; refreshToken: string; tenantId: string; tenantName: string; } let loginInFlight: Promise | null = null; function normalizeWebLoginOutput(raw: unknown): ThWebLoginOutputDto { const o = raw && typeof raw === 'object' ? (raw as Record) : {}; const token = String(o.token ?? o.Token ?? '').trim(); return { token: token.replace(/^Bearer\s+/i, ''), refreshToken: String(o.refreshToken ?? o.RefreshToken ?? ''), tenantId: String(o.tenantId ?? o.TenantId ?? ''), tenantName: String(o.tenantName ?? o.TenantName ?? ''), }; } export async function thWebLogin( input: ThWebLoginInput, ): Promise { if (loginInFlight) { return loginInFlight; } loginInFlight = (async () => { const { requestClient } = await import('#/api/request'); const raw = await requestClient.post( 'th-web-auth/login', { tenantId: input.tenantId, userName: input.userName.trim(), password: input.password, ...(input.uuid ? { uuid: input.uuid } : {}), ...(input.code != null && input.code !== '' ? { code: input.code } : {}), }, { errorMessageMode: 'none', headers: { __tenant: input.tenantId, }, successMessageMode: 'none', }, ); return normalizeWebLoginOutput(raw); })().finally(() => { loginInFlight = null; }); return loginInFlight; }