import { API_PATHS } from "@/api/api-paths"; import { apiGet, apiPost } from "@/api/api"; import { handleApiResponse, handlePaginatedResponse } from "@/api/handle-api-response"; import { mapAccount, mapAccountListItems, mapAccountToBackend, } from "@/domain/accounts/mappers/account-mapper"; import type { Account, AccountsListParams, AccountsListResult, } from "@/domain/accounts/types/account"; function buildSearchParams(params: AccountsListParams): Record { return { search: params.search ?? "", page: params.page ?? 1, pageSize: params.pageSize ?? 12, }; } async function findAccountInList(id: string | number): Promise { const targetId = String(id); let page = 1; const pageSize = 100; while (true) { const data = await apiGet(API_PATHS.account.getList, { searchParams: { search: "", page, pageSize }, }); const paginated = handlePaginatedResponse(data, { page, pageSize }); const match = paginated.items.find((item) => { const record = (typeof item === "object" && item !== null ? item : {}) as Record< string, unknown >; const itemId = record.id ?? record.Id; return String(itemId) === targetId; }); if (match) { return mapAccount(match); } if (paginated.items.length === 0 || page * pageSize >= paginated.totalCount) { throw new Error("Account not found"); } page += 1; } } export const accountsApi = { getList: async (params: AccountsListParams = {}): Promise => { const searchParams = buildSearchParams(params); const data = await apiGet(API_PATHS.account.getList, { searchParams }); const paginated = handlePaginatedResponse(data, { page: params.page, pageSize: params.pageSize, }); return { items: mapAccountListItems(paginated.items), totalCount: paginated.totalCount, page: paginated.page, pageSize: paginated.pageSize, }; }, /** Backend has no GetById — resolve from paginated list. */ getById: async (id: string | number): Promise => findAccountInList(id), create: async (payload: unknown): Promise => { const data = await apiPost( API_PATHS.account.addAccounts, mapAccountToBackend(payload), ); return mapAccount(handleApiResponse(data)); }, update: async (id: string | number, payload: unknown): Promise => { const data = await apiPost( API_PATHS.account.editAccounts, mapAccountToBackend({ ...(payload as object), id }), ); return mapAccount(handleApiResponse(data)); }, delete: async (id: string | number): Promise => { await apiGet(API_PATHS.account.deleteAccounts, { searchParams: { id }, }); }, };