mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 15:09:02 +00:00
fix(accounts): align detail and mutation payloads with backend
This commit is contained in:
parent
a1ed14538c
commit
786e588623
4 changed files with 74 additions and 17 deletions
|
|
@ -20,6 +20,37 @@ function buildSearchParams(params: AccountsListParams): Record<string, string |
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function findAccountInList(id: string | number): Promise<Account> {
|
||||||
|
const targetId = String(id);
|
||||||
|
let page = 1;
|
||||||
|
const pageSize = 100;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const data = await apiGet<unknown>(API_PATHS.account.getList, {
|
||||||
|
searchParams: { search: "", page, pageSize },
|
||||||
|
});
|
||||||
|
const paginated = handlePaginatedResponse<unknown>(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 = {
|
export const accountsApi = {
|
||||||
getList: async (params: AccountsListParams = {}): Promise<AccountsListResult> => {
|
getList: async (params: AccountsListParams = {}): Promise<AccountsListResult> => {
|
||||||
const searchParams = buildSearchParams(params);
|
const searchParams = buildSearchParams(params);
|
||||||
|
|
@ -37,12 +68,8 @@ export const accountsApi = {
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
getById: async (id: string | number): Promise<Account> => {
|
/** Backend has no GetById — resolve from paginated list. */
|
||||||
const data = await apiGet<unknown>(API_PATHS.account.getById, {
|
getById: async (id: string | number): Promise<Account> => findAccountInList(id),
|
||||||
searchParams: { id },
|
|
||||||
});
|
|
||||||
return mapAccount(handleApiResponse(data));
|
|
||||||
},
|
|
||||||
|
|
||||||
create: async (payload: unknown): Promise<Account> => {
|
create: async (payload: unknown): Promise<Account> => {
|
||||||
const data = await apiPost<unknown>(
|
const data = await apiPost<unknown>(
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,8 @@ export function mapAccount(raw: unknown): Account {
|
||||||
State: readString(item, "State", "state") || undefined,
|
State: readString(item, "State", "state") || undefined,
|
||||||
Zip: readString(item, "Zip", "zip", "zipCode") || undefined,
|
Zip: readString(item, "Zip", "zip", "zipCode") || undefined,
|
||||||
Country: readString(item, "Country", "country") || undefined,
|
Country: readString(item, "Country", "country") || undefined,
|
||||||
|
Phone: readString(item, "Phone", "phone", "phoneNumber", "PhoneNumber") || undefined,
|
||||||
|
Email: readString(item, "Email", "email") || undefined,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,22 +68,23 @@ export function mapAccountToBackend(account: unknown): Record<string, unknown> {
|
||||||
>;
|
>;
|
||||||
|
|
||||||
const payload: Record<string, unknown> = {
|
const payload: Record<string, unknown> = {
|
||||||
AccountName: item.AccountName ?? "",
|
Name: item.AccountName ?? item.Name ?? "",
|
||||||
AccountNumber: item.AccountNumber ?? "",
|
|
||||||
Industry: item.Industry ?? "",
|
|
||||||
Website: item.Website ?? "",
|
Website: item.Website ?? "",
|
||||||
Notes: item.Notes ?? "",
|
|
||||||
Address1: item.Address1 ?? "",
|
|
||||||
Address2: item.Address2 ?? "",
|
|
||||||
City: item.City ?? "",
|
|
||||||
State: item.State ?? "",
|
|
||||||
Zip: item.Zip ?? "",
|
|
||||||
Country: item.Country ?? "US",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const phone = item.Phone ?? item.phoneNumber ?? item.PhoneNumber;
|
||||||
|
if (typeof phone === "string" && phone) {
|
||||||
|
payload.Phone = phone;
|
||||||
|
}
|
||||||
|
|
||||||
|
const email = item.Email ?? item.email;
|
||||||
|
if (typeof email === "string" && email) {
|
||||||
|
payload.Email = email;
|
||||||
|
}
|
||||||
|
|
||||||
const id = item.id ?? item.Id;
|
const id = item.id ?? item.Id;
|
||||||
if (typeof id === "string" || typeof id === "number") {
|
if (typeof id === "string" || typeof id === "number") {
|
||||||
payload.id = id;
|
payload.Id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return payload;
|
return payload;
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ export interface Account {
|
||||||
State?: string;
|
State?: string;
|
||||||
Zip?: string;
|
Zip?: string;
|
||||||
Country?: string;
|
Country?: string;
|
||||||
|
Phone?: string;
|
||||||
|
Email?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AccountsListParams {
|
export interface AccountsListParams {
|
||||||
|
|
|
||||||
25
src/test/domain/accounts/mappers/account-mapper.test.ts
Normal file
25
src/test/domain/accounts/mappers/account-mapper.test.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import { mapAccountToBackend } from "@/domain/accounts/mappers/account-mapper";
|
||||||
|
|
||||||
|
describe("mapAccountToBackend", () => {
|
||||||
|
it("maps AccountName to backend Name field", () => {
|
||||||
|
const payload = mapAccountToBackend({
|
||||||
|
AccountName: "Acme Corp",
|
||||||
|
Website: "https://acme.example",
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(payload.Name).toBe("Acme Corp");
|
||||||
|
expect(payload.Website).toBe("https://acme.example");
|
||||||
|
expect(payload).not.toHaveProperty("AccountName");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("includes Id for updates", () => {
|
||||||
|
const payload = mapAccountToBackend({
|
||||||
|
id: 42,
|
||||||
|
AccountName: "Acme Corp",
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(payload.Id).toBe(42);
|
||||||
|
expect(payload.Name).toBe("Acme Corp");
|
||||||
|
});
|
||||||
|
});
|
||||||
Loading…
Add table
Reference in a new issue