diff --git a/src/domain/work-orders/api/work-orders-api.ts b/src/domain/work-orders/api/work-orders-api.ts index ff5d59f0..8a298af7 100644 --- a/src/domain/work-orders/api/work-orders-api.ts +++ b/src/domain/work-orders/api/work-orders-api.ts @@ -110,18 +110,34 @@ function toUrlSearchParams( return sp; } +function readOptionalString(item: Record, ...keys: string[]): string { + for (const key of keys) { + const value = item[key]; + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + } + return ""; +} + +/** GET User exposes `Name` as first name only; prefer FirstName + LastName when present. */ +function mapUserDisplayName(item: Record): string { + const firstName = readOptionalString(item, "firstName", "FirstName"); + const lastName = readOptionalString(item, "lastName", "LastName"); + const fallback = readOptionalString(item, "name", "Name", "userName", "UserName"); + if (lastName) { + return `${firstName || fallback} ${lastName}`.trim(); + } + return firstName || fallback; +} + function mapUser(raw: unknown): WorkOrderUser { const item = (typeof raw === "object" && raw !== null ? raw : {}) as Record; const id = item.id ?? item.Id; - const name = - (typeof item.name === "string" ? item.name : undefined) ?? - (typeof item.Name === "string" ? item.Name : undefined) ?? - (typeof item.userName === "string" ? item.userName : "") ?? - ""; return { id: typeof id === "string" || typeof id === "number" ? id : "", - name, + name: mapUserDisplayName(item), }; } diff --git a/src/test/domain/work-orders/api/work-orders-api.test.ts b/src/test/domain/work-orders/api/work-orders-api.test.ts index a24381d0..28ca8c18 100644 --- a/src/test/domain/work-orders/api/work-orders-api.test.ts +++ b/src/test/domain/work-orders/api/work-orders-api.test.ts @@ -200,6 +200,33 @@ describe("workOrdersApi.fetchDispatchers", () => { }); }); +const GET_USER_SERIALIZED_DIRECTORY = { + data: [ + { + Id: "s1", + Name: "Alex", + FirstName: "Alex", + LastName: "Smith", + UserName: "alex.smith", + }, + ], +}; + +describe("workOrdersApi.fetchUsers", () => { + beforeEach(() => { + apiGet.mockReset(); + }); + + it("composes a full display name from the serialized GET User shape", async () => { + apiGet.mockResolvedValue(GET_USER_SERIALIZED_DIRECTORY); + + const users = await workOrdersApi.fetchUsers(); + + expect(apiGet).toHaveBeenCalledWith(API_PATHS.user.list); + expect(users).toEqual([{ id: "s1", name: "Alex Smith" }]); + }); +}); + describe("workOrdersApi.getBoard", () => { beforeEach(() => { apiGet.mockReset();