Skip to content

Commit 63edbc1

Browse files
committed
Change injection and introduce Order Fetcher
1 parent fdba31b commit 63edbc1

File tree

10 files changed

+139
-44
lines changed

10 files changed

+139
-44
lines changed

src/core/catalogue.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212

1313
export function createCatalogueFetcher(client: ClientInterface) {
1414
return <T>(query: any): Promise<T> => {
15-
return client.catalogueApi(jsonToGraphQLQuery({ query: { ...query } }));
15+
return client.catalogueApi(jsonToGraphQLQuery({ query }));
1616
};
1717
}
1818

src/core/hydrate.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export type ProductHydrater = (
99
perVariant?: (item: string, index: number) => any
1010
) => Promise<any>;
1111

12-
export function createProductHydraterByPaths(client: ClientInterface): ProductHydrater {
12+
function byPaths(client: ClientInterface): ProductHydrater {
1313
return <T>(
1414
paths: string[],
1515
language: string,
@@ -56,18 +56,16 @@ export function createProductHydraterByPaths(client: ClientInterface): ProductHy
5656
}, {});
5757

5858
const query = {
59-
query: {
60-
...{ ...productListQuery },
61-
...(extraQuery !== undefined ? extraQuery : {})
62-
}
59+
...{ ...productListQuery },
60+
...(extraQuery !== undefined ? extraQuery : {})
6361
};
6462

6563
const fetch = client.catalogueApi;
66-
return fetch(jsonToGraphQLQuery(query));
64+
return fetch(jsonToGraphQLQuery({ query }));
6765
};
6866
}
6967

70-
export function createProductHydraterBySkus(client: ClientInterface): ProductHydrater {
68+
function bySkus(client: ClientInterface): ProductHydrater {
7169
async function getPathForSkus(skus: string[], language: string): Promise<string[]> {
7270
const search = client.searchApi;
7371
const pathsSet = new Set<string>();
@@ -137,6 +135,16 @@ export function createProductHydraterBySkus(client: ClientInterface): ProductHyd
137135

138136
return empty as any;
139137
}
140-
return createProductHydraterByPaths(client)(paths, language, extraQuery, perProduct, perVariant);
138+
return byPaths(client)(paths, language, extraQuery, perProduct, perVariant);
139+
};
140+
}
141+
142+
export function createProductHydrater(client: ClientInterface): {
143+
byPaths: ProductHydrater;
144+
bySkus: ProductHydrater;
145+
} {
146+
return {
147+
byPaths: byPaths(client),
148+
bySkus: bySkus(client)
141149
};
142150
}

src/core/navigation.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,23 +90,23 @@ function fetchTree<T>(client: ClientInterface, type: NavigationType): TreeFetche
9090
const fetch = client.catalogueApi;
9191
const baseQuery = buildQueryFor(type, path);
9292
const query = {
93-
query: {
94-
...baseQuery,
95-
tree: {
96-
...baseQuery.tree,
97-
...nestedQuery(depth, 1, perLevel)
98-
},
99-
...(extraQuery !== undefined ? extraQuery : {})
100-
}
93+
...baseQuery,
94+
tree: {
95+
...baseQuery.tree,
96+
...nestedQuery(depth, 1, perLevel)
97+
},
98+
...(extraQuery !== undefined ? extraQuery : {})
10199
};
102-
return fetch(jsonToGraphQLQuery(query), { language, path });
100+
return fetch(jsonToGraphQLQuery({ query }), { language, path });
103101
};
104102
}
105103

106-
export function createNavigationByFoldersFetcher(client: ClientInterface): TreeFetcher {
107-
return fetchTree(client, NavigationType.Tree);
108-
}
109-
110-
export function createNavigationByTopicsFetcher(client: ClientInterface): TreeFetcher {
111-
return fetchTree(client, NavigationType.Topics);
104+
export function createNavigationFetcher(client: ClientInterface): {
105+
byFolders: TreeFetcher;
106+
byTopics: TreeFetcher;
107+
} {
108+
return {
109+
byFolders: fetchTree(client, NavigationType.Tree),
110+
byTopics: fetchTree(client, NavigationType.Topics)
111+
};
112112
}

src/core/order.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,73 @@ import { ClientInterface } from './client';
22
import {
33
CreateOrderInputRequest,
44
createOrderInputRequest,
5+
Order,
56
OrderCreatedConfirmation,
67
OrderUpdatedConfirmation,
78
updateOrderInputRequest,
89
UpdateOrderInputRequest
910
} from '../types/order.types';
1011
import { jsonToGraphQLQuery } from 'json-to-graphql-query';
1112

13+
export function createOrderFetcher(apiClient: ClientInterface) {
14+
const fetchOrderById = async (
15+
orderId: string,
16+
onCustomer?: any,
17+
onOrderItem?: any,
18+
extraQuery?: any
19+
): Promise<Order> => {
20+
const orderApi = apiClient.orderApi;
21+
const query = {
22+
orders: {
23+
get: {
24+
__args: {
25+
id: orderId
26+
},
27+
id: true,
28+
createdAt: true,
29+
updatedAt: true,
30+
customer: {
31+
identifier: true,
32+
...(onCustomer !== undefined ? onCustomer : {})
33+
},
34+
cart: {
35+
name: true,
36+
sku: true,
37+
imageUrl: true,
38+
quantity: true,
39+
...(onOrderItem !== undefined ? onOrderItem : {}),
40+
price: {
41+
gross: true,
42+
net: true,
43+
discounts: {
44+
percent: true
45+
}
46+
}
47+
},
48+
total: {
49+
gross: true,
50+
net: true,
51+
currency: true,
52+
discounts: {
53+
percent: true
54+
},
55+
tax: {
56+
name: true,
57+
percent: true
58+
}
59+
},
60+
...(extraQuery !== undefined ? extraQuery : {})
61+
}
62+
}
63+
};
64+
return (await orderApi(jsonToGraphQLQuery({ query })))?.orders?.get;
65+
};
66+
67+
return {
68+
byId: fetchOrderById
69+
};
70+
}
71+
1272
export function createOrderPusher(apiClient: ClientInterface) {
1373
return async function pushOrder(intentOrder: CreateOrderInputRequest): Promise<OrderCreatedConfirmation> {
1474
const intent = createOrderInputRequest.parse(intentOrder);

src/index.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ export * from './core/client';
22
export * from './core/navigation';
33
export * from './core/hydrate';
44
export * from './core/catalogue';
5+
export * from './core/order';
56
export * from './types/product.types';
67
export * from './types/order.types';
78
export * from './types/payment.types';
89

910
import { createClient } from './core/client';
10-
import { createNavigationByFoldersFetcher, createNavigationByTopicsFetcher } from './core/navigation';
11-
import { createProductHydraterByPaths, createProductHydraterBySkus } from './core/hydrate';
11+
import { createNavigationFetcher } from './core/navigation';
12+
import { createProductHydrater } from './core/hydrate';
1213

13-
import { createOrderPusher, createOrderPaymentUpdater } from './core/order';
14+
import { createOrderPusher, createOrderPaymentUpdater, createOrderFetcher } from './core/order';
1415
import { createCatalogueFetcher } from './core/catalogue';
1516

1617
export const CrystallizeClient = createClient({
@@ -19,10 +20,18 @@ export const CrystallizeClient = createClient({
1920
accessTokenSecret: typeof process === 'object' ? process?.env.CRYSTALLIZE_ACCESS_TOKEN_SECRET || '' : ''
2021
});
2122

22-
export const CrystallizeNavigationFoldersFetcher = createNavigationByFoldersFetcher(CrystallizeClient);
23-
export const CrystallizeNavigationTopicsFetcher = createNavigationByTopicsFetcher(CrystallizeClient);
24-
export const CrystallizeHydraterByPaths = createProductHydraterByPaths(CrystallizeClient);
25-
export const CrystallizeHydraterBySkus = createProductHydraterBySkus(CrystallizeClient);
23+
const navigationFetcher = createNavigationFetcher(CrystallizeClient);
24+
export const CrystallizeNavigationFoldersFetcher = navigationFetcher.byFolders;
25+
export const CrystallizeNavigationTopicsFetcher = navigationFetcher.byTopics;
26+
27+
const productHydrator = createProductHydrater(CrystallizeClient);
28+
export const CrystallizeHydraterByPaths = productHydrator.byPaths;
29+
export const CrystallizeHydraterBySkus = productHydrator.bySkus;
30+
2631
export const CrystallizeOrderPusher = createOrderPusher(CrystallizeClient);
2732
export const CrystallizeCreateOrderPaymentUpdater = createOrderPaymentUpdater(CrystallizeClient);
33+
2834
export const CrystallizeCatalogueFetcher = createCatalogueFetcher(CrystallizeClient);
35+
36+
const orderFetcher = createOrderFetcher(CrystallizeClient);
37+
export const CrystallizeOrderFetcherById = orderFetcher.byId;

tests/hydrate.paths.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
const { createClient, createProductHydraterByPaths } = require('../dist/index.js');
1+
const { createClient, createProductHydrater } = require('../dist/index.js');
22

33
test('Hydrate Paths', async () => {
44
const CrystallizeClient = createClient({
55
tenantIdentifier: 'furniture'
66
});
77

8-
const hydrater = createProductHydraterByPaths(CrystallizeClient);
8+
const hydrater = createProductHydrater(CrystallizeClient).byPaths;
99
const response = await hydrater(
1010
[
1111
'/shop/bathroom-fitting/large-mounted-cabinet-in-treated-wood',

tests/hydrate.skus.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
const { createClient, createProductHydraterBySkus } = require('../dist/index.js');
1+
const { createClient, createProductHydrater } = require('../dist/index.js');
22

33
test('Hydrate Skus', async () => {
44
const CrystallizeClient = createClient({
55
tenantIdentifier: 'furniture'
66
});
77

8-
const hydrater = createProductHydraterBySkus(CrystallizeClient);
8+
const hydrater = createProductHydrater(CrystallizeClient).bySkus;
99
const response = await hydrater(['b-1628520141076', 'b-1628514494819'], 'en');
1010

1111
expect(response.product0.path).toBe('/shop/bathroom-fitting/large-mounted-cabinet-in-treated-wood');

tests/navigationFolders.test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
const { createNavigationByFoldersFetcher, createClient } = require('../dist/index.js');
1+
const { createNavigationFetcher, createClient } = require('../dist/index.js');
22

33
test('Test Nav fetching Node: Shop', async () => {
44
const CrystallizeClient = createClient({
55
tenantIdentifier: 'furniture'
66
});
77

8-
const fetch = createNavigationByFoldersFetcher(CrystallizeClient);
8+
const fetch = createNavigationFetcher(CrystallizeClient).byFolders;
99
const response = await fetch('/shop', 'en', 3);
1010

1111
expect(response.tree.path).toBe('/shop');
@@ -21,7 +21,7 @@ test('Test Nav fetching Node: /', async () => {
2121
tenantIdentifier: 'furniture'
2222
});
2323

24-
const fetch = createNavigationByFoldersFetcher(CrystallizeClient);
24+
const fetch = createNavigationFetcher(CrystallizeClient).byFolders;
2525
const response = await fetch('/', 'en', 3);
2626
expect(response.tree.path).toBe('/');
2727
expect(response.tree.children[0].path).toBe('/shop');
@@ -32,7 +32,7 @@ test('Test Nav fetching Node: / + extra data', async () => {
3232
tenantIdentifier: 'furniture'
3333
});
3434

35-
const fetch = createNavigationByFoldersFetcher(CrystallizeClient);
35+
const fetch = createNavigationFetcher(CrystallizeClient).byFolders;
3636
const response = await fetch('/', 'en', 2, {
3737
tenant: {
3838
__args: {
@@ -51,7 +51,7 @@ test('Test Nav fetching Node: / + extra data + specific level', async () => {
5151
tenantIdentifier: 'furniture'
5252
});
5353

54-
const fetch = createNavigationByFoldersFetcher(CrystallizeClient);
54+
const fetch = createNavigationFetcher(CrystallizeClient).byFolders;
5555
const response = await fetch(
5656
'/',
5757
'en',

tests/navigationTopics.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
const { createNavigationByTopicsFetcher, createClient } = require('../dist/index.js');
1+
const { createNavigationFetcher, createClient } = require('../dist/index.js');
22

33
test('Test Nav fetching Topic: /', async () => {
44
const CrystallizeClient = createClient({
55
tenantIdentifier: 'furniture'
66
});
77

8-
const fetch = createNavigationByTopicsFetcher(CrystallizeClient);
8+
const fetch = createNavigationFetcher(CrystallizeClient).byTopics;
99
const response = await fetch('/', 'en', 3);
1010

1111
// fetch topics returns a list of topics with no parents
@@ -19,7 +19,7 @@ test('Test Nav fetching Topic: /specials', async () => {
1919
tenantIdentifier: 'furniture'
2020
});
2121

22-
const fetch = createNavigationByTopicsFetcher(CrystallizeClient);
22+
const fetch = createNavigationFetcher(CrystallizeClient).byTopics;
2323
const response = await fetch('/specials', 'en', 3);
2424

2525
expect(response.tree.name).toBe('Specials');
@@ -32,7 +32,7 @@ test('Test Nav fetching Topic: /specials + extra data + specific level', async (
3232
tenantIdentifier: 'furniture'
3333
});
3434

35-
const fetch = createNavigationByTopicsFetcher(CrystallizeClient);
35+
const fetch = createNavigationFetcher(CrystallizeClient).byTopics;
3636
const response = await fetch(
3737
'/specials',
3838
'en',

tests/order.fetch.test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const { CrystallizeOrderFetcherById } = require('../dist/index.js');
2+
3+
test('Hydrate Paths', async () => {
4+
const fetcher = CrystallizeOrderFetcherById;
5+
const order = await fetcher('62557a65be73e0f09258ef69');
6+
console.log(order);
7+
// const hydrater = createProductHydraterByPaths(CrystallizeClient);
8+
// const response = await hydrater(
9+
// [
10+
// '/shop/bathroom-fitting/large-mounted-cabinet-in-treated-wood',
11+
// '/shop/bathroom-fitting/mounted-bathroom-counter-with-shelf'
12+
// ],
13+
// 'en'
14+
// );
15+
16+
// expect(response.product0.path).toBe('/shop/bathroom-fitting/large-mounted-cabinet-in-treated-wood');
17+
// expect(response.product1.path).toBe('/shop/bathroom-fitting/mounted-bathroom-counter-with-shelf');
18+
});

0 commit comments

Comments
 (0)