Skip to content

Commit d464500

Browse files
committed
feat: implement order search functionality with pagination support
1 parent 9a6a5da commit d464500

File tree

4 files changed

+82
-28
lines changed

4 files changed

+82
-28
lines changed

.changeset/proud-results-sort.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@labdigital/commercetools-mock": minor
3+
---
4+
5+
Add order search endpoint functionality

src/orderSearch.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import type {
2+
OrderPagedSearchResponse,
3+
OrderSearchRequest,
4+
} from "@commercetools/platform-sdk";
5+
import type { Hit } from "@commercetools/platform-sdk/dist/declarations/src/generated/models/order";
6+
import type { AbstractStorage } from "#src/storage/index.ts";
7+
import type { Config } from "./config.ts";
8+
9+
export class OrderSearch {
10+
protected _storage: AbstractStorage;
11+
12+
constructor(config: Config) {
13+
this._storage = config.storage;
14+
}
15+
16+
search(
17+
projectKey: string,
18+
params: OrderSearchRequest,
19+
): OrderPagedSearchResponse {
20+
const orderResources = this._storage.all(projectKey, "order");
21+
22+
// TODO: implement filtering based on params.query
23+
const offset = params.offset || 0;
24+
const limit = params.limit || 20;
25+
const orderResult = orderResources.slice(offset, offset + limit);
26+
27+
// Transform to ProductSearchResult
28+
const results: Hit[] = orderResult.map((order) => ({
29+
id: order.id,
30+
version: order.version,
31+
}));
32+
33+
return {
34+
total: orderResources.length,
35+
offset: offset,
36+
limit: limit,
37+
hits: results,
38+
};
39+
}
40+
}

src/repositories/order/index.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,24 @@ import type {
1010
Order,
1111
OrderFromCartDraft,
1212
OrderImportDraft,
13+
OrderPagedSearchResponse,
14+
OrderSearchRequest,
1315
Product,
1416
ProductPagedQueryResponse,
1517
ProductVariant,
1618
ShippingInfo,
1719
ShippingMethodDoesNotMatchCartError,
1820
ShippingMethodReference,
1921
} from "@commercetools/platform-sdk";
20-
import type { Config } from "#src/config.ts";
21-
import { CommercetoolsError } from "#src/exceptions.ts";
22-
import {
23-
generateRandomString,
24-
getBaseResourceProperties,
25-
} from "#src/helpers.ts";
26-
import {
27-
calculateTaxedPriceFromRate,
28-
calculateTaxTotals,
29-
} from "#src/lib/tax.ts";
30-
import {
31-
createShippingInfoFromMethod,
32-
getShippingMethodsMatchingCart,
33-
} from "#src/shipping.ts";
34-
import type { Writable } from "#src/types.ts";
35-
import type { RepositoryContext } from "../abstract.ts";
36-
import { AbstractResourceRepository, type QueryParams } from "../abstract.ts";
22+
import type {Config} from "#src/config.ts";
23+
import {CommercetoolsError} from "#src/exceptions.ts";
24+
import {generateRandomString, getBaseResourceProperties,} from "#src/helpers.ts";
25+
import {calculateTaxedPriceFromRate, calculateTaxTotals,} from "#src/lib/tax.ts";
26+
import {OrderSearch} from "#src/orderSearch.ts";
27+
import {createShippingInfoFromMethod, getShippingMethodsMatchingCart,} from "#src/shipping.ts";
28+
import type {Writable} from "#src/types.ts";
29+
import type {RepositoryContext} from "../abstract.ts";
30+
import {AbstractResourceRepository, type QueryParams} from "../abstract.ts";
3731
import {
3832
calculateMoneyTotalCentAmount,
3933
createAddress,
@@ -43,12 +37,15 @@ import {
4337
createTypedMoney,
4438
resolveStoreReference,
4539
} from "../helpers.ts";
46-
import { OrderUpdateHandler } from "./actions.ts";
40+
import {OrderUpdateHandler} from "./actions.ts";
4741

4842
export class OrderRepository extends AbstractResourceRepository<"order"> {
43+
protected _searchService: OrderSearch;
44+
4945
constructor(config: Config) {
5046
super("order", config);
5147
this.actions = new OrderUpdateHandler(config.storage);
48+
this._searchService = new OrderSearch(config);
5249
}
5350

5451
create(context: RepositoryContext, draft: OrderFromCartDraft): Order {
@@ -265,7 +262,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
265262
centAmount: calculateMoneyTotalCentAmount(draft.price.value, quantity),
266263
});
267264

268-
const lineItem: LineItem = {
265+
return {
269266
...getBaseResourceProperties(),
270267
custom: createCustomFields(
271268
draft.custom,
@@ -296,9 +293,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
296293
price: createPrice(draft.price),
297294
attributes: variant.attributes,
298295
},
299-
};
300-
301-
return lineItem;
296+
} satisfies LineItem;
302297
}
303298

304299
private customLineItemFromImportDraft(
@@ -311,7 +306,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
311306
centAmount: calculateMoneyTotalCentAmount(draft.money, quantity),
312307
});
313308

314-
const lineItem: CustomLineItem = {
309+
return {
315310
...getBaseResourceProperties(),
316311
custom: createCustomFields(
317312
draft.custom,
@@ -333,9 +328,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
333328
draft.taxRate,
334329
),
335330
taxedPricePortions: [],
336-
};
337-
338-
return lineItem;
331+
} satisfies CustomLineItem;
339332
}
340333

341334
getWithOrderNumber(
@@ -410,4 +403,11 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
410403
deliveries: [],
411404
};
412405
}
406+
407+
search(
408+
context: RepositoryContext,
409+
searchRequest: OrderSearchRequest,
410+
): OrderPagedSearchResponse {
411+
return this._searchService.search(context.projectKey, searchRequest);
412+
}
413413
}

src/services/order.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Request, Response, Router } from "express";
2-
import { getRepositoryContext } from "../repositories/helpers.ts";
3-
import type { OrderRepository } from "../repositories/order/index.ts";
2+
import { getRepositoryContext } from "#src/repositories/helpers.ts";
3+
import type { OrderRepository } from "#src/repositories/order/index.ts";
44
import AbstractService from "./abstract.ts";
55

66
export class OrderService extends AbstractService {
@@ -17,6 +17,7 @@ export class OrderService extends AbstractService {
1717

1818
extraRoutes(router: Router) {
1919
router.post("/import", this.import.bind(this));
20+
router.post("/search", this.search.bind(this));
2021
router.get(
2122
"/order-number=:orderNumber",
2223
this.getWithOrderNumber.bind(this),
@@ -56,4 +57,12 @@ export class OrderService extends AbstractService {
5657
],
5758
});
5859
}
60+
61+
search(request: Request, response: Response) {
62+
const resource = this.repository.search(
63+
getRepositoryContext(request),
64+
request.body,
65+
);
66+
response.status(200).send(resource);
67+
}
5968
}

0 commit comments

Comments
 (0)