Skip to content

Commit f80c762

Browse files
committed
feat(fulfillment): create and handle fulfilment request
1 parent 75cf3e1 commit f80c762

7 files changed

Lines changed: 116 additions & 4 deletions

File tree

‎packages/modules/fulfillment/src/lib/data/fulfillment.repository.ts‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { map, Observable } from 'rxjs';
33

44
import {
55
FulfillmentFulfillmentReadGQL,
6+
FulfillmentFulfillmentSubmitGQL,
67
FulfillmentListReadGQL,
78
IIoRestorecommerceResourcebaseReadRequest,
89
IoRestorecommerceFulfillmentFulfillment,
@@ -13,6 +14,9 @@ import {
1314
export class FulfillmentRepository {
1415
private readonly fulfilmentListReadGQL = inject(FulfillmentListReadGQL);
1516
private readonly fulfillmentReadGQL = inject(FulfillmentFulfillmentReadGQL);
17+
private readonly fulfillmentSubmitGQL = inject(
18+
FulfillmentFulfillmentSubmitGQL
19+
);
1620

1721
list(): Observable<IoRestorecommerceFulfillmentFulfillment[]> {
1822
return this.fulfilmentListReadGQL
@@ -71,4 +75,32 @@ export class FulfillmentRepository {
7175
})
7276
);
7377
}
78+
79+
submit(
80+
fulfillmentId: string
81+
): Observable<IoRestorecommerceFulfillmentFulfillment> {
82+
return this.fulfillmentSubmitGQL
83+
.mutate({
84+
input: {
85+
items: [
86+
{
87+
id: fulfillmentId,
88+
},
89+
],
90+
},
91+
})
92+
.pipe(
93+
map((result) => {
94+
const fulfillment =
95+
result.data?.fulfillment?.fulfillment?.Submit?.details?.items?.[0]
96+
?.payload;
97+
98+
if (!fulfillment) {
99+
throw new Error('Fulfillment not found or response is malformed');
100+
}
101+
102+
return fulfillment as IoRestorecommerceFulfillmentFulfillment;
103+
})
104+
);
105+
}
74106
}

‎packages/modules/fulfillment/src/lib/modules-fulfillment.module.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
fulfillmentViewReducer,
1212
loadFulfillmentListEffect,
1313
loadFulfillmentViewEffect,
14+
submitFulfillmentViewEffect,
1415
} from './store';
1516

1617
@NgModule({
@@ -21,6 +22,7 @@ import {
2122
EffectsModule.forFeature({
2223
loadFulfillmentListEffect,
2324
loadFulfillmentViewEffect,
25+
submitFulfillmentViewEffect,
2426
}),
2527
],
2628
})

‎packages/modules/fulfillment/src/lib/store/fulfillment-view/fulfillment-view.actions.ts‎

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,21 @@ export const loadFulfillmentSuccess = createAction(
2222
export const loadFulfillmentFailure = createAction(
2323
'[Fulfillment View] Load Fulfillment Failure',
2424
props<{ error: string }>()
25-
);
25+
);
26+
27+
/// Actions for fulfilment.
28+
29+
export const fulfillmentSubmitRequest = createAction(
30+
'[Fulfillment View] Submit Request',
31+
props<{ fulfillmentId: string }>()
32+
);
33+
34+
export const fulfillmentSubmitSuccess = createAction(
35+
'[Fulfillment View] Fulfillment Submit Success',
36+
props<{ fulfillment: Fulfillment }>()
37+
);
38+
39+
export const fulfillmentSubmitFailure = createAction(
40+
'[Fulfillment View] Fulfillment Submit Failure',
41+
props<{ error: string }>()
42+
);

‎packages/modules/fulfillment/src/lib/store/fulfillment-view/fulfillment-view.effects.ts‎

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ export const loadFulfillmentViewEffect = createEffect(
1717
ofType(FulfillmentViewActions.enterPage),
1818
switchMap(({ fulfillmentId }) =>
1919
fulfillmentsRepository.getFulfillment(fulfillmentId).pipe(
20-
map((fulfillments) =>
20+
map((fulfillment) =>
2121
FulfillmentViewActions.loadFulfillmentSuccess({
22-
fulfillment: mapFulfillmentDto(fulfillments),
22+
fulfillment: mapFulfillmentDto(fulfillment),
2323
})
2424
),
2525
catchError((error) =>
@@ -35,3 +35,31 @@ export const loadFulfillmentViewEffect = createEffect(
3535
},
3636
{ functional: true }
3737
);
38+
39+
export const submitFulfillmentViewEffect = createEffect(
40+
(
41+
actions$ = inject(Actions),
42+
fulfillmentsRepository = inject(FulfillmentRepository)
43+
) => {
44+
return actions$.pipe(
45+
ofType(FulfillmentViewActions.fulfillmentSubmitRequest),
46+
switchMap(({ fulfillmentId }) =>
47+
fulfillmentsRepository.submit(fulfillmentId).pipe(
48+
map((fulfillment) =>
49+
FulfillmentViewActions.fulfillmentSubmitSuccess({
50+
fulfillment: mapFulfillmentDto(fulfillment),
51+
})
52+
),
53+
catchError((error) =>
54+
of(
55+
FulfillmentViewActions.fulfillmentSubmitFailure({
56+
error: error.message ?? 'Failed to submit fulfillment',
57+
})
58+
)
59+
)
60+
)
61+
)
62+
);
63+
},
64+
{ functional: true }
65+
);

‎packages/modules/fulfillment/src/lib/store/fulfillment-view/fulfillment-view.facade.ts‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,10 @@ export class FulfillmentViewFacade {
3737
fulfillmentViewActions.loadFulfillment({ fulfillmentId })
3838
);
3939
}
40+
41+
submitFulfillment(fulfillmentId: string) {
42+
this.store.dispatch(
43+
fulfillmentViewActions.fulfillmentSubmitRequest({ fulfillmentId })
44+
);
45+
}
4046
}

‎packages/modules/fulfillment/src/lib/store/fulfillment-view/fulfillment-view.reducer.ts‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,28 @@ export const fulfillmentViewReducer = createReducer(
4545
on(
4646
FulfillmentViewActions.leavePage,
4747
(): FulfillmentViewState => initialFulfillmentViewState
48+
),
49+
on(
50+
FulfillmentViewActions.fulfillmentSubmitRequest,
51+
(state): FulfillmentViewState => ({
52+
...state,
53+
loading: true,
54+
})
55+
),
56+
on(
57+
FulfillmentViewActions.fulfillmentSubmitSuccess,
58+
(state, { fulfillment }): FulfillmentViewState => ({
59+
...state,
60+
fulfillment,
61+
loading: false,
62+
})
63+
),
64+
on(
65+
FulfillmentViewActions.fulfillmentSubmitFailure,
66+
(state, { error }): FulfillmentViewState => ({
67+
...state,
68+
loading: false,
69+
error,
70+
})
4871
)
4972
);

‎packages/modules/fulfillment/src/lib/ui/pages/fulfillment-view/fulfillment-view.component.ts‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ export class FulfillmentViewComponent implements OnInit {
6969
}
7070

7171
onSubmitFulfillment() {
72-
// TODO
72+
const fulfillment = this.fulfillment();
73+
if (fulfillment) {
74+
console.log('Submiting fulfilment for id', fulfillment.id);
75+
this.fulfillmentFacade.submitFulfillment(fulfillment.id);
76+
}
7377
}
7478
}

0 commit comments

Comments
 (0)