Skip to content

Commit 837b168

Browse files
authored
MIM-506 (#299)
* use correct schema types for work order adapter and endpoints * adapt routes, adapter and tests for previous changes * wip add duedate * add duedate to xpand work order schema * add back url
1 parent 13b582f commit 837b168

File tree

10 files changed

+379
-213
lines changed

10 files changed

+379
-213
lines changed

src/adapters/tests/work-order-adapter.test.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ describe('work-order-adapter', () => {
2121
})
2222

2323
describe(workOrderAdapter.getWorkOrdersByContactCode, () => {
24-
const workOrderMock = factory.workOrder.buildList(2)
24+
const workOrderMock = factory.externalXpandWorkOrder.build()
25+
2526
it('returns err if request fails', async () => {
2627
mockServer.use(
2728
http.get(
@@ -43,7 +44,7 @@ describe('work-order-adapter', () => {
4344
() =>
4445
HttpResponse.json(
4546
{
46-
content: { workOrders: workOrderMock },
47+
content: { workOrders: [workOrderMock] },
4748
},
4849
{ status: 200 }
4950
)
@@ -54,14 +55,14 @@ describe('work-order-adapter', () => {
5455

5556
expect(result).toMatchObject({
5657
ok: true,
57-
data: workOrderMock,
58+
data: [workOrderMock],
5859
})
5960
})
6061
})
6162

6263
describe(workOrderAdapter.getXpandWorkOrdersByRentalPropertyId, () => {
6364
const rentalPropertyId = '406-028-02-0101'
64-
const xpandWorkOrderMock = factory.xpandWorkOrder.buildList(3)
65+
const xpandWorkOrderMock = factory.externalXpandWorkOrder.buildList(3)
6566

6667
it('returns err if request fails', async () => {
6768
mockServer.use(
@@ -108,9 +109,10 @@ describe('work-order-adapter', () => {
108109

109110
describe(workOrderAdapter.getXpandWorkOrderDetails, () => {
110111
const workOrderCode = '25-000050'
111-
const xpandWorkOrderDetailsMock = factory.xpandWorkOrderDetails.build({
112-
Code: workOrderCode,
113-
})
112+
const xpandWorkOrderDetailsMock =
113+
factory.externalXpandWorkOrderDetails.build({
114+
Code: workOrderCode,
115+
})
114116

115117
it('returns err if request fails', async () => {
116118
mockServer.use(

src/adapters/work-order-adapter/generated/api-types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,7 @@ export interface components {
608608
Priority: string;
609609
/** Format: date-time */
610610
Registered: string;
611+
DueDate: string | null;
611612
RentalObjectCode: string;
612613
Status: string;
613614
UseMasterKey: boolean;
@@ -638,6 +639,7 @@ export interface components {
638639
Priority: string | null;
639640
/** Format: date-time */
640641
Registered: string;
642+
DueDate: string | null;
641643
RentalObjectCode: string;
642644
Status: string;
643645
};
@@ -653,6 +655,7 @@ export interface components {
653655
Priority: string | null;
654656
/** Format: date-time */
655657
Registered: string;
658+
DueDate: string | null;
656659
RentalObjectCode: string;
657660
Status: string;
658661
WorkOrderRows: {

src/adapters/work-order-adapter/index.ts

Lines changed: 42 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,16 @@ import { logger } from 'onecore-utilities'
33
import config from '../../common/config'
44
import { AdapterResult } from '../types'
55
import {
6-
CoreWorkOrder,
7-
CoreWorkOrderSchema,
8-
CoreXpandWorkOrder,
9-
CoreXpandWorkOrderDetails,
10-
CoreXpandWorkOrderDetailsSchema,
11-
CoreXpandWorkOrderSchema,
126
CreateWorkOrderResponse,
137
CreateWorkOrderResponseSchema,
148
} from '../../services/work-order-service/schemas'
159
import { components, paths } from './generated/api-types'
1610

11+
export type OdooWorkOrder = components['schemas']['WorkOrder']
12+
export type XpandWorkOrder = components['schemas']['XpandWorkOrder']
13+
export type XpandWorkOrderDetails =
14+
components['schemas']['XpandWorkOrderDetails']
15+
1716
const client = () =>
1817
createClient<paths>({
1918
baseUrl: config.workOrderService.url,
@@ -24,29 +23,27 @@ const client = () =>
2423

2524
export const getWorkOrdersByContactCode = async (
2625
contactCode: string
27-
): Promise<AdapterResult<CoreWorkOrder[], 'schema-error' | 'unknown'>> => {
26+
): Promise<AdapterResult<OdooWorkOrder[], 'unknown'>> => {
2827
try {
2928
const fetchResponse = await client().GET(
3029
'/workOrders/contactCode/{contactCode}',
3130
{
3231
params: { path: { contactCode } },
3332
}
3433
)
35-
if (fetchResponse.data?.content?.workOrders) {
36-
const parsed = CoreWorkOrderSchema.array().safeParse(
37-
fetchResponse.data.content.workOrders
38-
)
39-
if (!parsed.success) {
40-
return { ok: false, err: 'schema-error' }
41-
}
4234

43-
return {
44-
ok: true,
45-
data: parsed.data,
46-
}
35+
if (fetchResponse.error) {
36+
throw fetchResponse.error
4737
}
4838

49-
return { ok: false, err: 'unknown' }
39+
if (!fetchResponse.data.content?.workOrders) {
40+
throw 'missing-content'
41+
}
42+
43+
return {
44+
ok: true,
45+
data: fetchResponse.data.content.workOrders,
46+
}
5047
} catch (error) {
5148
logger.error({ error }, 'work-order-adapter.getWorkOrdersByContactCode')
5249
return { ok: false, err: 'unknown' }
@@ -55,29 +52,27 @@ export const getWorkOrdersByContactCode = async (
5552

5653
export const getWorkOrdersByRentalPropertyId = async (
5754
rentalPropertyId: string
58-
): Promise<AdapterResult<CoreWorkOrder[], 'schema-error' | 'unknown'>> => {
55+
): Promise<AdapterResult<OdooWorkOrder[], 'unknown'>> => {
5956
try {
6057
const fetchResponse = await client().GET(
6158
'/workOrders/residenceId/{residenceId}',
6259
{
6360
params: { path: { residenceId: rentalPropertyId } },
6461
}
6562
)
66-
if (fetchResponse.data?.content?.workOrders) {
67-
const parsed = CoreWorkOrderSchema.array().safeParse(
68-
fetchResponse.data.content.workOrders
69-
)
70-
if (!parsed.success) {
71-
return { ok: false, err: 'schema-error' }
72-
}
7363

74-
return {
75-
ok: true,
76-
data: parsed.data,
77-
}
64+
if (fetchResponse.error) {
65+
throw fetchResponse.error
7866
}
7967

80-
return { ok: false, err: 'unknown' }
68+
if (!fetchResponse.data.content?.workOrders) {
69+
throw 'missing-content'
70+
}
71+
72+
return {
73+
ok: true,
74+
data: fetchResponse.data.content.workOrders,
75+
}
8176
} catch (error) {
8277
logger.error(
8378
{ error },
@@ -94,7 +89,7 @@ export const getXpandWorkOrdersByRentalPropertyId = async (
9489
limit = 100,
9590
sortAscending,
9691
}: { skip?: number; limit?: number; sortAscending?: boolean } = {}
97-
): Promise<AdapterResult<CoreXpandWorkOrder[], 'schema-error' | 'unknown'>> => {
92+
): Promise<AdapterResult<XpandWorkOrder[], 'unknown'>> => {
9893
try {
9994
const fetchResponse = await client().GET(
10095
'/workOrders/xpand/residenceId/{residenceId}',
@@ -105,39 +100,32 @@ export const getXpandWorkOrdersByRentalPropertyId = async (
105100
},
106101
}
107102
)
108-
if (fetchResponse.data?.content?.workOrders) {
109-
const parsed = CoreXpandWorkOrderSchema.array().safeParse(
110-
fetchResponse.data.content.workOrders
111-
)
112-
if (!parsed.success) {
113-
logger.error({ error: parsed.error.format() })
114-
return { ok: false, err: 'schema-error' }
115-
}
116103

117-
return {
118-
ok: true,
119-
data: parsed.data,
120-
}
104+
if (fetchResponse.error) {
105+
throw fetchResponse.error
121106
}
122107

123-
return { ok: false, err: 'unknown' }
108+
if (!fetchResponse.data.content?.workOrders) {
109+
throw 'missing-content'
110+
}
111+
112+
return {
113+
ok: true,
114+
data: fetchResponse.data?.content.workOrders,
115+
}
124116
} catch (error) {
125117
logger.error(
126118
{ error },
127119
'work-order-adapter.getXpandWorkOrdersByRentalPropertyId'
128120
)
121+
129122
return { ok: false, err: 'unknown' }
130123
}
131124
}
132125

133126
export const getXpandWorkOrderDetails = async (
134127
workOrderCode: string
135-
): Promise<
136-
AdapterResult<
137-
CoreXpandWorkOrderDetails,
138-
'not-found' | 'schema-error' | 'unknown'
139-
>
140-
> => {
128+
): Promise<AdapterResult<XpandWorkOrderDetails, 'not-found' | 'unknown'>> => {
141129
try {
142130
const fetchResponse = await client().GET('/workOrders/xpand/{code}', {
143131
params: { path: { code: workOrderCode } },
@@ -148,17 +136,9 @@ export const getXpandWorkOrderDetails = async (
148136
}
149137

150138
if (fetchResponse.data?.content) {
151-
const parsed = CoreXpandWorkOrderDetailsSchema.safeParse(
152-
fetchResponse.data.content
153-
)
154-
if (!parsed.success) {
155-
logger.error({ error: parsed.error.format() })
156-
return { ok: false, err: 'schema-error' }
157-
}
158-
159139
return {
160140
ok: true,
161-
data: parsed.data,
141+
data: fetchResponse.data.content,
162142
}
163143
}
164144

@@ -180,6 +160,7 @@ export const createWorkOrder = async (
180160
const parsed = CreateWorkOrderResponseSchema.safeParse(
181161
fetchResponse.data.content
182162
)
163+
183164
if (!parsed.success) {
184165
return { ok: false, err: 'schema-error' }
185166
}

src/services/work-order-service/index.ts

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,29 @@ export const routes = (router: KoaRouter) => {
290290
ctx.body = {
291291
content: {
292292
totalCount: result.data.length,
293-
workOrders: result.data satisfies schemas.CoreWorkOrder[],
293+
workOrders: result.data.map(
294+
(v): schemas.CoreWorkOrder => ({
295+
accessCaption: v.AccessCaption,
296+
caption: v.Caption,
297+
code: v.Code,
298+
contactCode: v.ContactCode,
299+
description: v.Description,
300+
detailsCaption: v.DetailsCaption,
301+
externalResource: v.ExternalResource,
302+
id: v.Id,
303+
lastChanged: new Date(v.LastChanged),
304+
priority: v.Priority,
305+
registered: new Date(v.Registered),
306+
rentalObjectCode: v.RentalObjectCode,
307+
status: v.Status,
308+
dueDate: v.DueDate ? new Date(v.DueDate) : null,
309+
workOrderRows: v.WorkOrderRows.map((row) => ({
310+
description: row.Description,
311+
locationCode: row.LocationCode,
312+
equipmentCode: row.EquipmentCode,
313+
})),
314+
})
315+
),
294316
},
295317
...metadata,
296318
}
@@ -364,12 +386,36 @@ export const routes = (router: KoaRouter) => {
364386
const result = await workOrderAdapter.getWorkOrdersByRentalPropertyId(
365387
ctx.params.rentalPropertyId
366388
)
389+
367390
if (result.ok) {
368391
ctx.status = 200
369392
ctx.body = {
370393
content: {
371394
totalCount: result.data.length,
372-
workOrders: result.data satisfies schemas.CoreWorkOrder[],
395+
workOrders: result.data.map(
396+
(v): schemas.CoreWorkOrder => ({
397+
accessCaption: v.AccessCaption,
398+
caption: v.Caption,
399+
code: v.Code,
400+
dueDate: v.DueDate ? new Date(v.DueDate) : null,
401+
contactCode: v.ContactCode,
402+
description: v.Description,
403+
detailsCaption: v.DetailsCaption,
404+
externalResource: v.ExternalResource,
405+
id: v.Id,
406+
lastChanged: new Date(v.LastChanged),
407+
priority: v.Priority,
408+
registered: new Date(v.Registered),
409+
rentalObjectCode: v.RentalObjectCode,
410+
status: v.Status,
411+
url: v.Url,
412+
workOrderRows: v.WorkOrderRows.map((row) => ({
413+
description: row.Description,
414+
locationCode: row.LocationCode,
415+
equipmentCode: row.EquipmentCode,
416+
})),
417+
})
418+
),
373419
},
374420
...metadata,
375421
}
@@ -460,12 +506,27 @@ export const routes = (router: KoaRouter) => {
460506
ctx.params.rentalPropertyId,
461507
{ skip, limit, sortAscending }
462508
)
509+
463510
if (result.ok) {
464511
ctx.status = 200
465512
ctx.body = {
466513
content: {
467514
totalCount: result.data.length,
468-
workOrders: result.data satisfies schemas.CoreXpandWorkOrder[],
515+
workOrders: result.data.map(
516+
(v): schemas.CoreXpandWorkOrder => ({
517+
accessCaption: v.AccessCaption,
518+
caption: v.Caption,
519+
code: v.Code,
520+
contactCode: v.ContactCode,
521+
id: v.Id,
522+
lastChanged: new Date(v.LastChanged),
523+
priority: v.Priority,
524+
dueDate: v.DueDate ? new Date(v.DueDate) : null,
525+
registered: new Date(v.Registered),
526+
rentalObjectCode: v.RentalObjectCode,
527+
status: v.Status,
528+
})
529+
),
469530
},
470531
...metadata,
471532
}
@@ -547,7 +608,25 @@ export const routes = (router: KoaRouter) => {
547608
if (result.ok) {
548609
ctx.status = 200
549610
ctx.body = {
550-
content: result.data satisfies schemas.CoreXpandWorkOrder,
611+
content: {
612+
id: result.data.Id,
613+
accessCaption: result.data.AccessCaption,
614+
caption: result.data.Caption,
615+
code: result.data.Code,
616+
contactCode: result.data.ContactCode,
617+
lastChanged: new Date(result.data.LastChanged),
618+
priority: result.data.Priority,
619+
registered: new Date(result.data.Registered),
620+
dueDate: result.data.DueDate ? new Date(result.data.DueDate) : null,
621+
rentalObjectCode: result.data.RentalObjectCode,
622+
status: result.data.Status,
623+
workOrderRows: result.data.WorkOrderRows.map((row) => ({
624+
description: row.Description,
625+
locationCode: row.LocationCode,
626+
equipmentCode: row.EquipmentCode,
627+
})),
628+
description: result.data.Description,
629+
} satisfies schemas.CoreXpandWorkOrderDetails,
551630
...metadata,
552631
}
553632
} else {

0 commit comments

Comments
 (0)