usAppAuth.ts 2.17 KB
import type { UsAppBoundLocationDto } from '../types/usAppBound'
import { usAppApiRequest } from '../utils/usAppApiRequest'

export type { UsAppBoundLocationDto }

export interface UsAppLoginInput {
  email: string
  password: string
  uuid?: string
  code?: string
}

export interface UsAppLoginOutputDto {
  token: string
  refreshToken: string
  locations: UsAppBoundLocationDto[]
}

function normalizeLocation(raw: Record<string, unknown>): UsAppBoundLocationDto {
  return {
    id: String(raw.id ?? raw.Id ?? ''),
    locationCode: String(raw.locationCode ?? raw.LocationCode ?? ''),
    locationName: String(raw.locationName ?? raw.LocationName ?? ''),
    fullAddress: String(raw.fullAddress ?? raw.FullAddress ?? ''),
    state: raw.state !== false && raw.State !== false,
  }
}

function normalizeLoginOutput(raw: unknown): UsAppLoginOutputDto {
  const o = raw as Record<string, unknown>
  const locs = o.locations ?? o.Locations
  const arr = Array.isArray(locs) ? locs : []
  return {
    token: String(o.token ?? o.Token ?? ''),
    refreshToken: String(o.refreshToken ?? o.RefreshToken ?? ''),
    locations: arr.map((x) => normalizeLocation(x as Record<string, unknown>)),
  }
}

function normalizeLocationList(raw: unknown): UsAppBoundLocationDto[] {
  const arr = Array.isArray(raw) ? raw : []
  return arr.map((x) => normalizeLocation(x as Record<string, unknown>))
}

/** POST /api/app/us-app-auth/login(401 不触发全局跳转) */
export async function usAppLogin(input: UsAppLoginInput): Promise<UsAppLoginOutputDto> {
  const raw = await usAppApiRequest<unknown>({
    path: '/api/app/us-app-auth/login',
    method: 'POST',
    skipUnauthorizedRedirect: true,
    data: {
      email: input.email.trim(),
      password: input.password,
      ...(input.uuid ? { uuid: input.uuid } : {}),
      ...(input.code != null ? { code: input.code } : {}),
    },
  })
  return normalizeLoginOutput(raw)
}

/** GET /api/app/us-app-auth/my-locations */
export async function usAppFetchMyLocations(): Promise<UsAppBoundLocationDto[]> {
  const raw = await usAppApiRequest<unknown>({
    path: '/api/app/us-app-auth/my-locations',
    method: 'GET',
    auth: true,
  })
  return normalizeLocationList(raw)
}