@unchainedshop/core 5.0.0-alpha.7 → 5.0.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +1 -1
  2. package/lib/bulk-importer/handlers/product/create.d.ts +132 -29
  3. package/lib/bulk-importer/handlers/product/create.js +31 -14
  4. package/lib/bulk-importer/handlers/product/update.d.ts +60 -30
  5. package/lib/bulk-importer/handlers/product/update.js +5 -48
  6. package/lib/core-index.d.ts +1 -2
  7. package/lib/core-index.js +2 -18
  8. package/lib/directors/BaseDiscountAdapter.d.ts +3 -0
  9. package/lib/directors/BaseDiscountDirector.d.ts +2 -2
  10. package/lib/directors/BaseDiscountDirector.js +3 -6
  11. package/lib/directors/BasePricingDirector.d.ts +2 -2
  12. package/lib/directors/BasePricingDirector.js +3 -6
  13. package/lib/directors/DeliveryDirector.d.ts +1 -1
  14. package/lib/directors/DeliveryDirector.js +2 -12
  15. package/lib/directors/DeliveryPricingDirector.js +1 -10
  16. package/lib/directors/EnrollmentAdapter.js +0 -1
  17. package/lib/directors/EnrollmentDirector.d.ts +1 -1
  18. package/lib/directors/EnrollmentDirector.js +3 -15
  19. package/lib/directors/FileDirector.d.ts +4 -4
  20. package/lib/directors/FileDirector.js +2 -13
  21. package/lib/directors/FilterDirector.d.ts +1 -1
  22. package/lib/directors/FilterDirector.js +2 -14
  23. package/lib/directors/OrderDiscountDirector.d.ts +1 -15
  24. package/lib/directors/OrderDiscountDirector.js +1 -13
  25. package/lib/directors/OrderPricingDirector.js +1 -10
  26. package/lib/directors/PaymentDirector.d.ts +1 -1
  27. package/lib/directors/PaymentDirector.js +2 -12
  28. package/lib/directors/PaymentPricingDirector.js +1 -10
  29. package/lib/directors/ProductDiscountDirector.d.ts +1 -15
  30. package/lib/directors/ProductDiscountDirector.js +1 -13
  31. package/lib/directors/ProductPricingDirector.js +1 -10
  32. package/lib/directors/QuotationDirector.d.ts +1 -1
  33. package/lib/directors/QuotationDirector.js +2 -14
  34. package/lib/directors/WarehousingDirector.js +16 -34
  35. package/lib/directors/WorkerDirector.d.ts +1 -1
  36. package/lib/directors/WorkerDirector.js +2 -14
  37. package/lib/directors/registryDirector.d.ts +2 -0
  38. package/lib/directors/registryDirector.js +6 -0
  39. package/lib/factory/registerVirtualWarehousing.js +1 -1
  40. package/lib/plugins/PluginRegistry.d.ts +1 -0
  41. package/lib/plugins/PluginRegistry.js +8 -1
  42. package/lib/services/checkoutOrder.js +4 -0
  43. package/lib/services/reserveOrderDiscountsForCheckout.d.ts +5 -0
  44. package/lib/services/reserveOrderDiscountsForCheckout.js +34 -0
  45. package/lib/services/simulateProductDispatching.d.ts +3 -1
  46. package/lib/services/simulateProductDispatching.js +3 -3
  47. package/lib/services/simulateProductInventory.d.ts +3 -1
  48. package/lib/services/simulateProductInventory.js +3 -3
  49. package/lib/services/supportedDeliveryProviders.js +9 -0
  50. package/lib/services/supportedPaymentProviders.js +9 -0
  51. package/lib/services/supportedWarehousingProviders.js +9 -0
  52. package/package.json +25 -22
@@ -2,6 +2,7 @@ import { OrderStatus } from '@unchainedshop/core-orders';
2
2
  import { nextUserCartService } from "./nextUserCart.js";
3
3
  import { validateOrderService } from "./validateOrder.js";
4
4
  import { processOrderService } from "./processOrder.js";
5
+ import { reserveOrderDiscountsForCheckout } from "./reserveOrderDiscountsForCheckout.js";
5
6
  export async function checkoutOrderService(orderId, transactionContext) {
6
7
  const order = await this.orders.findOrder({ orderId });
7
8
  if (!order)
@@ -10,7 +11,9 @@ export async function checkoutOrderService(orderId, transactionContext) {
10
11
  return order;
11
12
  await validateOrderService.bind(this)(order);
12
13
  const lock = await this.orders.acquireLock(order._id, 'checkout');
14
+ let discounts;
13
15
  try {
16
+ discounts = await reserveOrderDiscountsForCheckout.call(this, order);
14
17
  const processedOrder = await processOrderService.bind(this)(order, transactionContext);
15
18
  if (processedOrder.billingAddress) {
16
19
  await this.users.updateLastBillingAddress(processedOrder.userId, processedOrder.billingAddress);
@@ -27,6 +30,7 @@ export async function checkoutOrderService(orderId, transactionContext) {
27
30
  return processedOrder;
28
31
  }
29
32
  finally {
33
+ await discounts?.release();
30
34
  await lock.release();
31
35
  }
32
36
  }
@@ -0,0 +1,5 @@
1
+ import type { Order } from '@unchainedshop/core-orders';
2
+ import type { Modules } from '../modules.ts';
3
+ export declare function reserveOrderDiscountsForCheckout(this: Modules, order: Order): Promise<{
4
+ release: () => Promise<void>;
5
+ }>;
@@ -0,0 +1,34 @@
1
+ import { createLogger } from '@unchainedshop/logger';
2
+ import { OrderDiscountDirector } from "../directors/OrderDiscountDirector.js";
3
+ const logger = createLogger('unchained:core:checkoutOrder');
4
+ export async function reserveOrderDiscountsForCheckout(order) {
5
+ const reservations = [];
6
+ const release = async () => {
7
+ const results = await Promise.allSettled(reservations.map((reservation) => reservation.release()));
8
+ for (const result of results) {
9
+ if (result.status === 'rejected') {
10
+ logger.error(`Could not release a discount reservation of order ${order._id}`, {
11
+ error: result.reason,
12
+ });
13
+ }
14
+ }
15
+ };
16
+ try {
17
+ const discounts = await this.orders.discounts.findOrderDiscounts({ orderId: order._id });
18
+ for (const orderDiscount of discounts) {
19
+ const Adapter = OrderDiscountDirector.getAdapter(orderDiscount.discountKey);
20
+ if (!Adapter)
21
+ continue;
22
+ const adapter = await Adapter.actions({
23
+ context: { order, orderDiscount, code: orderDiscount.code, modules: this },
24
+ });
25
+ if (adapter.reserveForCheckout)
26
+ reservations.push(await adapter.reserveForCheckout());
27
+ }
28
+ return { release };
29
+ }
30
+ catch (error) {
31
+ await release();
32
+ throw error;
33
+ }
34
+ }
@@ -3,10 +3,12 @@ import type { Product } from '@unchainedshop/core-products';
3
3
  import { type EstimatedDispatch } from '../directors/WarehousingDirector.ts';
4
4
  import type { WarehousingContext } from '../directors/WarehousingAdapter.ts';
5
5
  import type { WarehousingProvider } from '@unchainedshop/core-warehousing';
6
- export declare function simulateProductDispatchingService(this: Modules, { product, quantity, referenceDate, }: {
6
+ import type { DeliveryProviderType } from '@unchainedshop/core-delivery';
7
+ export declare function simulateProductDispatchingService(this: Modules, { product, quantity, referenceDate, deliveryProviderType, }: {
7
8
  product: Product;
8
9
  quantity: number;
9
10
  referenceDate?: Date;
11
+ deliveryProviderType?: DeliveryProviderType | null;
10
12
  }): Promise<(WarehousingContext & EstimatedDispatch & {
11
13
  warehousingProvider: WarehousingProvider;
12
14
  })[]>;
@@ -1,7 +1,7 @@
1
1
  import { supportedWarehousingProvidersService } from "./supportedWarehousingProviders.js";
2
2
  import { WarehousingDirector } from "../directors/WarehousingDirector.js";
3
- export async function simulateProductDispatchingService({ product, quantity, referenceDate, }) {
4
- const deliveryProviders = await this.delivery.allProviders();
3
+ export async function simulateProductDispatchingService({ product, quantity, referenceDate, deliveryProviderType, }) {
4
+ const deliveryProviders = (await this.delivery.allProviders()).filter(({ type }) => !deliveryProviderType || type === deliveryProviderType);
5
5
  return deliveryProviders.reduce(async (oldResult, deliveryProvider) => {
6
6
  const result = await oldResult;
7
7
  const warehousingProviders = await supportedWarehousingProvidersService.bind(this)({
@@ -25,6 +25,6 @@ export async function simulateProductDispatchingService({ product, quantity, ref
25
25
  ...dispatch,
26
26
  };
27
27
  }));
28
- return result.concat(result, mappedWarehousingProviders);
28
+ return result.concat(mappedWarehousingProviders);
29
29
  }, Promise.resolve([]));
30
30
  }
@@ -2,9 +2,11 @@ import type { Modules } from '../modules.ts';
2
2
  import type { Product } from '@unchainedshop/core-products';
3
3
  import type { WarehousingContext } from '../directors/WarehousingAdapter.ts';
4
4
  import type { WarehousingProvider } from '@unchainedshop/core-warehousing';
5
- export declare function simulateProductInventoryService(this: Modules, { product, referenceDate, }: {
5
+ import type { DeliveryProviderType } from '@unchainedshop/core-delivery';
6
+ export declare function simulateProductInventoryService(this: Modules, { product, referenceDate, deliveryProviderType, }: {
6
7
  product: Product;
7
8
  referenceDate?: Date;
9
+ deliveryProviderType?: DeliveryProviderType | null;
8
10
  }): Promise<(WarehousingContext & {
9
11
  quantity?: number;
10
12
  } & {
@@ -1,7 +1,7 @@
1
1
  import { supportedWarehousingProvidersService } from "./supportedWarehousingProviders.js";
2
2
  import { WarehousingDirector } from "../directors/WarehousingDirector.js";
3
- export async function simulateProductInventoryService({ product, referenceDate, }) {
4
- const deliveryProviders = await this.delivery.allProviders();
3
+ export async function simulateProductInventoryService({ product, referenceDate, deliveryProviderType, }) {
4
+ const deliveryProviders = (await this.delivery.allProviders()).filter(({ type }) => !deliveryProviderType || type === deliveryProviderType);
5
5
  return deliveryProviders.reduce(async (oldResult, deliveryProvider) => {
6
6
  const result = await oldResult;
7
7
  const warehousingProviders = await supportedWarehousingProvidersService.bind(this)({
@@ -24,6 +24,6 @@ export async function simulateProductInventoryService({ product, referenceDate,
24
24
  ...stock,
25
25
  };
26
26
  }));
27
- return result.concat(result, mappedWarehousingProviders);
27
+ return result.concat(mappedWarehousingProviders);
28
28
  }, Promise.resolve([]));
29
29
  }
@@ -1,8 +1,17 @@
1
1
  import { deliverySettings } from '@unchainedshop/core-delivery';
2
+ import { createLogger } from '@unchainedshop/logger';
2
3
  import { DeliveryDirector } from "../directors/index.js";
4
+ const logger = createLogger('unchained:core');
3
5
  export async function supportedDeliveryProvidersService(params) {
4
6
  const allProviders = await this.delivery.allProviders();
5
7
  const providers = (await Promise.all(allProviders.map(async (provider) => {
8
+ if (!DeliveryDirector.getAdapter(provider.adapterKey)) {
9
+ logger.warn('Delivery provider skipped, its adapter is not registered', {
10
+ deliveryProviderId: provider._id,
11
+ adapterKey: provider.adapterKey,
12
+ });
13
+ return [];
14
+ }
6
15
  const adapter = await DeliveryDirector.actions(provider, params, { modules: this });
7
16
  return adapter.isActive() ? [provider] : [];
8
17
  }))).flat();
@@ -1,8 +1,17 @@
1
1
  import { paymentSettings } from '@unchainedshop/core-payment';
2
+ import { createLogger } from '@unchainedshop/logger';
2
3
  import { PaymentDirector } from "../directors/PaymentDirector.js";
4
+ const logger = createLogger('unchained:core');
3
5
  export async function supportedPaymentProvidersService(params) {
4
6
  const allProviders = await this.payment.paymentProviders.allProviders();
5
7
  const providers = (await Promise.all(allProviders.map(async (provider) => {
8
+ if (!PaymentDirector.getAdapter(provider.adapterKey)) {
9
+ logger.warn('Payment provider skipped, its adapter is not registered', {
10
+ paymentProviderId: provider._id,
11
+ adapterKey: provider.adapterKey,
12
+ });
13
+ return [];
14
+ }
6
15
  const adapter = await PaymentDirector.actions(provider, params, { modules: this });
7
16
  return adapter.isActive() ? [provider] : [];
8
17
  }))).flat();
@@ -1,7 +1,16 @@
1
+ import { createLogger } from '@unchainedshop/logger';
1
2
  import { WarehousingDirector } from "../directors/index.js";
3
+ const logger = createLogger('unchained:core');
2
4
  export async function supportedWarehousingProvidersService(params) {
3
5
  const allProviders = await this.warehousing.allProviders();
4
6
  const providers = (await Promise.all(allProviders.map(async (provider) => {
7
+ if (!WarehousingDirector.getAdapter(provider.adapterKey)) {
8
+ logger.warn('Warehousing provider skipped, its adapter is not registered', {
9
+ warehousingProviderId: provider._id,
10
+ adapterKey: provider.adapterKey,
11
+ });
12
+ return [];
13
+ }
5
14
  const adapter = await WarehousingDirector.actions(provider, params, { modules: this });
6
15
  return adapter.isActive() ? [provider] : [];
7
16
  }))).flat();
package/package.json CHANGED
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "name": "@unchainedshop/core",
3
3
  "description": "Core orchestration package for the Unchained Engine with business services and directors",
4
- "version": "5.0.0-alpha.7",
4
+ "version": "5.0.0-alpha.9",
5
+ "files": [
6
+ "lib"
7
+ ],
5
8
  "main": "lib/core-index.js",
6
9
  "types": "lib/core-index.d.ts",
7
10
  "type": "module",
@@ -35,27 +38,27 @@
35
38
  },
36
39
  "homepage": "https://github.com/unchainedshop/unchained#readme",
37
40
  "dependencies": {
38
- "@unchainedshop/core-assortments": "^5.0.0-alpha.7",
39
- "@unchainedshop/core-bookmarks": "^5.0.0-alpha.7",
40
- "@unchainedshop/core-countries": "^5.0.0-alpha.7",
41
- "@unchainedshop/core-currencies": "^5.0.0-alpha.7",
42
- "@unchainedshop/core-delivery": "^5.0.0-alpha.7",
43
- "@unchainedshop/core-enrollments": "^5.0.0-alpha.7",
44
- "@unchainedshop/core-events": "^5.0.0-alpha.7",
45
- "@unchainedshop/core-files": "^5.0.0-alpha.7",
46
- "@unchainedshop/core-filters": "^5.0.0-alpha.7",
47
- "@unchainedshop/core-languages": "^5.0.0-alpha.7",
48
- "@unchainedshop/core-orders": "^5.0.0-alpha.7",
49
- "@unchainedshop/core-payment": "^5.0.0-alpha.7",
50
- "@unchainedshop/core-products": "^5.0.0-alpha.7",
51
- "@unchainedshop/core-quotations": "^5.0.0-alpha.7",
52
- "@unchainedshop/core-users": "^5.0.0-alpha.7",
53
- "@unchainedshop/core-warehousing": "^5.0.0-alpha.7",
54
- "@unchainedshop/core-worker": "^5.0.0-alpha.7",
55
- "@unchainedshop/events": "^5.0.0-alpha.7",
56
- "@unchainedshop/logger": "^5.0.0-alpha.7",
57
- "@unchainedshop/mongodb": "^5.0.0-alpha.7",
58
- "@unchainedshop/utils": "^5.0.0-alpha.7",
41
+ "@unchainedshop/core-assortments": "^5.0.0-alpha.9",
42
+ "@unchainedshop/core-bookmarks": "^5.0.0-alpha.9",
43
+ "@unchainedshop/core-countries": "^5.0.0-alpha.9",
44
+ "@unchainedshop/core-currencies": "^5.0.0-alpha.9",
45
+ "@unchainedshop/core-delivery": "^5.0.0-alpha.9",
46
+ "@unchainedshop/core-enrollments": "^5.0.0-alpha.9",
47
+ "@unchainedshop/core-events": "^5.0.0-alpha.9",
48
+ "@unchainedshop/core-files": "^5.0.0-alpha.9",
49
+ "@unchainedshop/core-filters": "^5.0.0-alpha.9",
50
+ "@unchainedshop/core-languages": "^5.0.0-alpha.9",
51
+ "@unchainedshop/core-orders": "^5.0.0-alpha.9",
52
+ "@unchainedshop/core-payment": "^5.0.0-alpha.9",
53
+ "@unchainedshop/core-products": "^5.0.0-alpha.9",
54
+ "@unchainedshop/core-quotations": "^5.0.0-alpha.9",
55
+ "@unchainedshop/core-users": "^5.0.0-alpha.9",
56
+ "@unchainedshop/core-warehousing": "^5.0.0-alpha.9",
57
+ "@unchainedshop/core-worker": "^5.0.0-alpha.9",
58
+ "@unchainedshop/events": "^5.0.0-alpha.9",
59
+ "@unchainedshop/logger": "^5.0.0-alpha.9",
60
+ "@unchainedshop/mongodb": "^5.0.0-alpha.9",
61
+ "@unchainedshop/utils": "^5.0.0-alpha.9",
59
62
  "minipass-json-stream": "^1.0.2",
60
63
  "zod": "^4.2.0"
61
64
  },