th-web-auth.ts 1.63 KB
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<ThWebLoginOutputDto> | null = null;

function normalizeWebLoginOutput(raw: unknown): ThWebLoginOutputDto {
  const o =
    raw && typeof raw === 'object' ? (raw as Record<string, unknown>) : {};
  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<ThWebLoginOutputDto> {
  if (loginInFlight) {
    return loginInFlight;
  }

  loginInFlight = (async () => {
    const { requestClient } = await import('#/api/request');
    const raw = await requestClient.post<unknown>(
      '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;
}