diff --git a/.changeset/proud-results-sort.md b/.changeset/proud-results-sort.md new file mode 100644 index 00000000..cdd10b7b --- /dev/null +++ b/.changeset/proud-results-sort.md @@ -0,0 +1,5 @@ +--- +"@labdigital/commercetools-mock": minor +--- + +Add order search endpoint functionality diff --git a/src/orderSearch.ts b/src/orderSearch.ts new file mode 100644 index 00000000..607ab8ce --- /dev/null +++ b/src/orderSearch.ts @@ -0,0 +1,40 @@ +import type { + OrderPagedSearchResponse, + OrderSearchRequest, +} from "@commercetools/platform-sdk"; +import type { Hit } from "@commercetools/platform-sdk/dist/declarations/src/generated/models/order"; +import type { Config } from "#src/config.ts"; +import type { AbstractStorage } from "#src/storage/index.ts"; + +export class OrderSearch { + protected _storage: AbstractStorage; + + constructor(config: Config) { + this._storage = config.storage; + } + + search( + projectKey: string, + params: OrderSearchRequest, + ): OrderPagedSearchResponse { + const orderResources = this._storage.all(projectKey, "order"); + + // TODO: implement filtering based on params.query + const offset = params.offset || 0; + const limit = params.limit || 20; + const orderResult = orderResources.slice(offset, offset + limit); + + // Transform orders into Hit objects for the OrderSearchResult + const results: Hit[] = orderResult.map((order) => ({ + id: order.id, + version: order.version, + })); + + return { + total: orderResources.length, + offset: offset, + limit: limit, + hits: results, + }; + } +} diff --git a/src/repositories/order/index.ts b/src/repositories/order/index.ts index abfbc35f..720152a6 100644 --- a/src/repositories/order/index.ts +++ b/src/repositories/order/index.ts @@ -10,6 +10,8 @@ import type { Order, OrderFromCartDraft, OrderImportDraft, + OrderPagedSearchResponse, + OrderSearchRequest, Product, ProductPagedQueryResponse, ProductVariant, @@ -27,6 +29,7 @@ import { calculateTaxedPriceFromRate, calculateTaxTotals, } from "#src/lib/tax.ts"; +import { OrderSearch } from "#src/orderSearch.ts"; import { createShippingInfoFromMethod, getShippingMethodsMatchingCart, @@ -46,9 +49,12 @@ import { import { OrderUpdateHandler } from "./actions.ts"; export class OrderRepository extends AbstractResourceRepository<"order"> { + protected _searchService: OrderSearch; + constructor(config: Config) { super("order", config); this.actions = new OrderUpdateHandler(config.storage); + this._searchService = new OrderSearch(config); } create(context: RepositoryContext, draft: OrderFromCartDraft): Order { @@ -265,7 +271,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> { centAmount: calculateMoneyTotalCentAmount(draft.price.value, quantity), }); - const lineItem: LineItem = { + return { ...getBaseResourceProperties(), custom: createCustomFields( draft.custom, @@ -296,9 +302,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> { price: createPrice(draft.price), attributes: variant.attributes, }, - }; - - return lineItem; + } satisfies LineItem; } private customLineItemFromImportDraft( @@ -311,7 +315,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> { centAmount: calculateMoneyTotalCentAmount(draft.money, quantity), }); - const lineItem: CustomLineItem = { + return { ...getBaseResourceProperties(), custom: createCustomFields( draft.custom, @@ -333,9 +337,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> { draft.taxRate, ), taxedPricePortions: [], - }; - - return lineItem; + } satisfies CustomLineItem; } getWithOrderNumber( @@ -410,4 +412,11 @@ export class OrderRepository extends AbstractResourceRepository<"order"> { deliveries: [], }; } + + search( + context: RepositoryContext, + searchRequest: OrderSearchRequest, + ): OrderPagedSearchResponse { + return this._searchService.search(context.projectKey, searchRequest); + } } diff --git a/src/services/order.ts b/src/services/order.ts index ea3c297b..b476d920 100644 --- a/src/services/order.ts +++ b/src/services/order.ts @@ -17,6 +17,7 @@ export class OrderService extends AbstractService { extraRoutes(router: Router) { router.post("/import", this.import.bind(this)); + router.post("/search", this.search.bind(this)); router.get( "/order-number=:orderNumber", this.getWithOrderNumber.bind(this), @@ -56,4 +57,12 @@ export class OrderService extends AbstractService { ], }); } + + search(request: Request, response: Response) { + const resource = this.repository.search( + getRepositoryContext(request), + request.body, + ); + response.status(200).send(resource); + } }