@unchainedshop/core 4.6.1 → 4.7.2

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 (171) hide show
  1. package/lib/core-index.d.ts +3 -0
  2. package/lib/core-index.js +6 -2
  3. package/lib/directors/BaseDiscountDirector.js +6 -6
  4. package/lib/directors/BasePricingDirector.js +1 -1
  5. package/lib/directors/DeliveryAdapter.js +1 -0
  6. package/lib/directors/DeliveryDirector.js +11 -2
  7. package/lib/directors/DeliveryPricingAdapter.d.ts +2 -1
  8. package/lib/directors/DeliveryPricingAdapter.js +2 -1
  9. package/lib/directors/DeliveryPricingDirector.d.ts +1 -1
  10. package/lib/directors/DeliveryPricingDirector.js +12 -2
  11. package/lib/directors/DeliveryPricingSheet.d.ts +1 -1
  12. package/lib/directors/DeliveryPricingSheet.js +1 -1
  13. package/lib/directors/EnrollmentAdapter.js +1 -0
  14. package/lib/directors/EnrollmentDirector.js +11 -1
  15. package/lib/directors/FileDirector.d.ts +10 -0
  16. package/lib/directors/FileDirector.js +25 -0
  17. package/lib/directors/FilterAdapter.js +1 -0
  18. package/lib/directors/FilterDirector.js +11 -1
  19. package/lib/directors/OrderDiscountAdapter.d.ts +3 -2
  20. package/lib/directors/OrderDiscountAdapter.js +5 -2
  21. package/lib/directors/OrderDiscountDirector.d.ts +15 -1
  22. package/lib/directors/OrderDiscountDirector.js +14 -1
  23. package/lib/directors/OrderPricingAdapter.d.ts +2 -1
  24. package/lib/directors/OrderPricingAdapter.js +3 -1
  25. package/lib/directors/OrderPricingDirector.d.ts +4 -1
  26. package/lib/directors/OrderPricingDirector.js +12 -1
  27. package/lib/directors/OrderPricingSheet.d.ts +1 -1
  28. package/lib/directors/OrderPricingSheet.js +1 -1
  29. package/lib/directors/PaymentAdapter.js +1 -0
  30. package/lib/directors/PaymentDirector.js +11 -2
  31. package/lib/directors/PaymentPricingAdapter.d.ts +2 -1
  32. package/lib/directors/PaymentPricingAdapter.js +2 -1
  33. package/lib/directors/PaymentPricingDirector.d.ts +2 -1
  34. package/lib/directors/PaymentPricingDirector.js +11 -1
  35. package/lib/directors/PaymentPricingSheet.d.ts +2 -1
  36. package/lib/directors/PaymentPricingSheet.js +2 -1
  37. package/lib/directors/ProductDiscountAdapter.d.ts +3 -2
  38. package/lib/directors/ProductDiscountAdapter.js +5 -2
  39. package/lib/directors/ProductDiscountDirector.d.ts +16 -2
  40. package/lib/directors/ProductDiscountDirector.js +15 -2
  41. package/lib/directors/ProductPricingAdapter.d.ts +2 -1
  42. package/lib/directors/ProductPricingAdapter.js +3 -1
  43. package/lib/directors/ProductPricingDirector.d.ts +3 -1
  44. package/lib/directors/ProductPricingDirector.js +12 -1
  45. package/lib/directors/ProductPricingSheet.d.ts +1 -1
  46. package/lib/directors/ProductPricingSheet.js +1 -1
  47. package/lib/directors/QuotationAdapter.js +1 -0
  48. package/lib/directors/QuotationDirector.js +11 -2
  49. package/lib/directors/WarehousingAdapter.js +1 -0
  50. package/lib/directors/WarehousingDirector.d.ts +1 -1
  51. package/lib/directors/WarehousingDirector.js +12 -2
  52. package/lib/directors/WorkerAdapter.js +1 -0
  53. package/lib/directors/WorkerDirector.d.ts +1 -1
  54. package/lib/directors/WorkerDirector.js +10 -17
  55. package/lib/directors/index.d.ts +2 -0
  56. package/lib/directors/index.js +2 -0
  57. package/lib/errors/common.d.ts +568 -0
  58. package/lib/errors/common.js +789 -0
  59. package/lib/errors/index.d.ts +1 -0
  60. package/lib/errors/index.js +1 -0
  61. package/lib/factory/registerAssortmentSearchFilter.d.ts +2 -1
  62. package/lib/factory/registerAssortmentSearchFilter.js +12 -3
  63. package/lib/factory/registerInvoicePayment.d.ts +2 -2
  64. package/lib/factory/registerInvoicePayment.js +12 -3
  65. package/lib/factory/registerPhysicalWarehousing.d.ts +2 -2
  66. package/lib/factory/registerPhysicalWarehousing.js +12 -3
  67. package/lib/factory/registerPickUpDelivery.d.ts +2 -2
  68. package/lib/factory/registerPickUpDelivery.js +12 -3
  69. package/lib/factory/registerProductDiscoverabilityFilter.d.ts +2 -1
  70. package/lib/factory/registerProductDiscoverabilityFilter.js +12 -3
  71. package/lib/factory/registerProductSearchFilter.d.ts +2 -1
  72. package/lib/factory/registerProductSearchFilter.js +12 -3
  73. package/lib/factory/registerShippingDelivery.d.ts +2 -2
  74. package/lib/factory/registerShippingDelivery.js +12 -3
  75. package/lib/factory/registerVirtualWarehousing.d.ts +2 -2
  76. package/lib/factory/registerVirtualWarehousing.js +12 -3
  77. package/lib/factory/registerWorker.d.ts +2 -1
  78. package/lib/factory/registerWorker.js +12 -3
  79. package/lib/plugins/PluginRegistry.d.ts +42 -0
  80. package/lib/plugins/PluginRegistry.js +113 -0
  81. package/lib/services/addCartDiscount.d.ts +10 -0
  82. package/lib/services/addCartDiscount.js +27 -0
  83. package/lib/services/addCartItem.d.ts +15 -0
  84. package/lib/services/addCartItem.js +41 -0
  85. package/lib/services/addCartQuotation.d.ts +16 -0
  86. package/lib/services/addCartQuotation.js +52 -0
  87. package/lib/services/addEmail.d.ts +7 -0
  88. package/lib/services/addEmail.js +17 -0
  89. package/lib/services/addProductAssignment.d.ts +3 -0
  90. package/lib/services/addProductAssignment.js +63 -0
  91. package/lib/services/authenticateWithPassword.d.ts +15 -0
  92. package/lib/services/authenticateWithPassword.js +34 -0
  93. package/lib/services/changePassword.d.ts +10 -0
  94. package/lib/services/changePassword.js +19 -0
  95. package/lib/services/countOrdersWithFilters.d.ts +3 -0
  96. package/lib/services/countOrdersWithFilters.js +25 -0
  97. package/lib/services/createAssortment.d.ts +7 -0
  98. package/lib/services/createAssortment.js +10 -0
  99. package/lib/services/createBookmark.d.ts +8 -0
  100. package/lib/services/createBookmark.js +21 -0
  101. package/lib/services/createDeliveryProvider.d.ts +6 -0
  102. package/lib/services/createDeliveryProvider.js +19 -0
  103. package/lib/services/createDownloadStream.js +1 -1
  104. package/lib/services/createEnrollment.d.ts +17 -0
  105. package/lib/services/createEnrollment.js +33 -0
  106. package/lib/services/createFileDownloadURL.js +2 -1
  107. package/lib/services/createProduct.d.ts +7 -0
  108. package/lib/services/createProduct.js +8 -0
  109. package/lib/services/createProductBundleItem.d.ts +5 -0
  110. package/lib/services/createProductBundleItem.js +25 -0
  111. package/lib/services/createProductReview.d.ts +8 -0
  112. package/lib/services/createProductReview.js +12 -0
  113. package/lib/services/createSignedURL.js +2 -1
  114. package/lib/services/deliverOrder.d.ts +5 -0
  115. package/lib/services/deliverOrder.js +26 -0
  116. package/lib/services/findActiveWorkTypes.d.ts +2 -0
  117. package/lib/services/findActiveWorkTypes.js +6 -0
  118. package/lib/services/findDeliveryInterfaces.d.ts +7 -0
  119. package/lib/services/findDeliveryInterfaces.js +13 -0
  120. package/lib/services/findOrdersWithFilters.d.ts +9 -0
  121. package/lib/services/findOrdersWithFilters.js +25 -0
  122. package/lib/services/findPaymentInterfaces.d.ts +7 -0
  123. package/lib/services/findPaymentInterfaces.js +13 -0
  124. package/lib/services/findWarehousingInterfaces.d.ts +7 -0
  125. package/lib/services/findWarehousingInterfaces.js +13 -0
  126. package/lib/services/getDeliveryDiscounts.d.ts +8 -0
  127. package/lib/services/getDeliveryDiscounts.js +14 -0
  128. package/lib/services/getPaymentDiscounts.d.ts +8 -0
  129. package/lib/services/getPaymentDiscounts.js +14 -0
  130. package/lib/services/getShopInfo.d.ts +25 -0
  131. package/lib/services/getShopInfo.js +47 -0
  132. package/lib/services/impersonateUser.d.ts +8 -0
  133. package/lib/services/impersonateUser.js +20 -0
  134. package/lib/services/linkFileService.js +1 -1
  135. package/lib/services/loginAsGuest.d.ts +10 -0
  136. package/lib/services/loginAsGuest.js +19 -0
  137. package/lib/services/obfuscateWorkerData.d.ts +4 -0
  138. package/lib/services/obfuscateWorkerData.js +4 -0
  139. package/lib/services/orderPricingAccessors.d.ts +18 -0
  140. package/lib/services/orderPricingAccessors.js +29 -0
  141. package/lib/services/payOrder.d.ts +5 -0
  142. package/lib/services/payOrder.js +25 -0
  143. package/lib/services/registerUser.d.ts +14 -0
  144. package/lib/services/registerUser.js +44 -0
  145. package/lib/services/removeBookmark.d.ts +6 -0
  146. package/lib/services/removeBookmark.js +10 -0
  147. package/lib/services/removeCartItem.d.ts +6 -0
  148. package/lib/services/removeCartItem.js +19 -0
  149. package/lib/services/removeFiles.js +1 -1
  150. package/lib/services/resetPasswordWithMigration.d.ts +14 -0
  151. package/lib/services/resetPasswordWithMigration.js +31 -0
  152. package/lib/services/resolveWorkType.d.ts +1 -0
  153. package/lib/services/resolveWorkType.js +7 -0
  154. package/lib/services/searchProductsWithAssortment.d.ts +19 -0
  155. package/lib/services/searchProductsWithAssortment.js +17 -0
  156. package/lib/services/toggleBookmark.d.ts +8 -0
  157. package/lib/services/toggleBookmark.js +33 -0
  158. package/lib/services/updateCart.d.ts +15 -0
  159. package/lib/services/updateCart.js +27 -0
  160. package/lib/services/updateCartItem.d.ts +11 -0
  161. package/lib/services/updateCartItem.js +37 -0
  162. package/lib/services/updateEnrollment.d.ts +13 -0
  163. package/lib/services/updateEnrollment.js +36 -0
  164. package/lib/services/uploadFileFromStream.js +2 -1
  165. package/lib/services/uploadFileFromURL.js +2 -1
  166. package/lib/services/verifyEmailWithMigration.d.ts +15 -0
  167. package/lib/services/verifyEmailWithMigration.js +23 -0
  168. package/lib/utils/getFileAdapter.d.ts +1 -0
  169. package/lib/utils/getFileAdapter.js +7 -0
  170. package/lib/utils/schedule.js +164 -28
  171. package/package.json +1 -1
@@ -0,0 +1,52 @@
1
+ import { QuotationStatus } from '@unchainedshop/core-quotations';
2
+ import { QuotationDirector } from "../directors/QuotationDirector.js";
3
+ import { updateCalculationService } from "./updateCalculation.js";
4
+ import { findOrInitCartService } from "./findOrInitCart.js";
5
+ import { OrderNotFoundError, OrderWrongStatusError, OrderQuantityTooLowError, ProductNotFoundError, QuotationNotFoundError, QuotationWrongStatusError, QuotationItemConfigurationError, } from "../errors/index.js";
6
+ export async function addCartQuotationService(params) {
7
+ const { orderId, quotationId, quantity, configuration, user, countryCode, context } = params;
8
+ if (quantity < 1) {
9
+ throw new OrderQuantityTooLowError({ quantity });
10
+ }
11
+ const quotation = await this.quotations.findQuotation({ quotationId });
12
+ if (!quotation) {
13
+ throw new QuotationNotFoundError({ quotationId });
14
+ }
15
+ if (quotation.status !== QuotationStatus.PROPOSED) {
16
+ throw new QuotationWrongStatusError({ status: quotation.status });
17
+ }
18
+ const order = await findOrInitCartService.bind(this)({
19
+ orderId,
20
+ user,
21
+ countryCode,
22
+ });
23
+ if (!order) {
24
+ throw new OrderNotFoundError({ orderId: orderId || null });
25
+ }
26
+ if (!this.orders.isCart(order)) {
27
+ throw new OrderWrongStatusError({ status: order.status });
28
+ }
29
+ if (!(await this.products.productExists({ productId: quotation.productId }))) {
30
+ throw new ProductNotFoundError({ productId: quotation.productId });
31
+ }
32
+ const director = await QuotationDirector.actions({ quotation }, context);
33
+ const quotationConfiguration = await director.transformItemConfiguration({
34
+ quantity,
35
+ configuration,
36
+ });
37
+ if (!quotationConfiguration) {
38
+ throw new QuotationItemConfigurationError({ configuration });
39
+ }
40
+ const updatedOrderPosition = await this.orders.positions.addProductItem({
41
+ quantity: quotationConfiguration.quantity || 1,
42
+ configuration: quotationConfiguration.configuration,
43
+ quotationId,
44
+ productId: quotation.productId,
45
+ originalProductId: quotation.productId,
46
+ orderId: order._id,
47
+ });
48
+ await updateCalculationService.bind(this)(order._id);
49
+ return (await this.orders.positions.findOrderPosition({
50
+ itemId: updatedOrderPosition._id,
51
+ }));
52
+ }
@@ -0,0 +1,7 @@
1
+ import type { User } from '@unchainedshop/core-users';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface AddEmailParams {
4
+ userId: string;
5
+ email: string;
6
+ }
7
+ export declare function addEmailService(this: Modules, params: AddEmailParams): Promise<User>;
@@ -0,0 +1,17 @@
1
+ import { UserNotFoundError, EmailAlreadyExistsError } from "../errors/index.js";
2
+ export async function addEmailService(params) {
3
+ const { userId, email } = params;
4
+ if (!(await this.users.userExists({ userId }))) {
5
+ throw new UserNotFoundError({ userId });
6
+ }
7
+ try {
8
+ await this.users.addEmail(userId, email);
9
+ }
10
+ catch (e) {
11
+ if (e.cause === 'EMAIL_INVALID') {
12
+ throw new EmailAlreadyExistsError({ email });
13
+ }
14
+ throw e;
15
+ }
16
+ return (await this.users.findUserById(userId));
17
+ }
@@ -0,0 +1,3 @@
1
+ import { type Product, type ProductConfiguration } from '@unchainedshop/core-products';
2
+ import type { Modules } from '../modules.ts';
3
+ export declare function addProductAssignmentService(this: Modules, proxyId: string, productId: string, vectors: ProductConfiguration[]): Promise<Product | null>;
@@ -0,0 +1,63 @@
1
+ import { ProductType, } from '@unchainedshop/core-products';
2
+ import { ProductNotFoundError, ProductWrongTypeError, ProductVariationInfinityLoopError, ProductVariationVectorInvalidError, ProductVariationVectorAlreadySetError, } from "../errors/index.js";
3
+ const extractVariationMatrix = (variations = []) => {
4
+ const cartesianProduct = (arrays) => {
5
+ return arrays.reduce((acc, array) => acc.flatMap((item) => array.map((value) => [...item, value])), [
6
+ [],
7
+ ]);
8
+ };
9
+ const keys = variations.map((item) => item.key);
10
+ const options = variations.map((item) => item.options);
11
+ const combinations = cartesianProduct(options);
12
+ return combinations.map((combination) => combination.reduce((acc, value, index) => {
13
+ acc[keys[index]] = value;
14
+ return acc;
15
+ }, {}));
16
+ };
17
+ const combinationExists = (matrix, combination) => {
18
+ return matrix.some((variation) => {
19
+ return (Object.keys(variation).length === Object.keys(combination).length &&
20
+ Object.entries(combination).every(([key, value]) => variation[key] === value));
21
+ });
22
+ };
23
+ export async function addProductAssignmentService(proxyId, productId, vectors) {
24
+ if (!(await this.products.productExists({ productId }))) {
25
+ throw new ProductNotFoundError({ productId });
26
+ }
27
+ const proxyProduct = await this.products.findProduct({ productId: proxyId });
28
+ if (!proxyProduct) {
29
+ throw new ProductNotFoundError({ productId: proxyId });
30
+ }
31
+ if (productId === proxyId) {
32
+ throw new ProductVariationInfinityLoopError({ productId });
33
+ }
34
+ if (proxyProduct.type !== ProductType.CONFIGURABLE_PRODUCT) {
35
+ throw new ProductWrongTypeError({
36
+ proxyId,
37
+ received: proxyProduct.type,
38
+ required: ProductType.CONFIGURABLE_PRODUCT,
39
+ });
40
+ }
41
+ const variations = await this.products.variations.findProductVariations({
42
+ productId: proxyId,
43
+ });
44
+ const variationMatrix = extractVariationMatrix(variations);
45
+ const normalizedVectors = vectors?.reduce((prev, { key, value }) => {
46
+ return {
47
+ ...prev,
48
+ [key]: value,
49
+ };
50
+ }, {});
51
+ if (!combinationExists(variationMatrix, normalizedVectors)) {
52
+ throw new ProductVariationVectorInvalidError({ proxyId, vectors });
53
+ }
54
+ const added = await this.products.assignments.addProxyAssignment({
55
+ productId,
56
+ proxyId,
57
+ vectors,
58
+ });
59
+ if (!added) {
60
+ throw new ProductVariationVectorAlreadySetError({ proxyId, vectors });
61
+ }
62
+ return this.products.findProduct({ productId: proxyId });
63
+ }
@@ -0,0 +1,15 @@
1
+ import type { User } from '@unchainedshop/core-users';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface AuthenticateWithPasswordParams {
4
+ username?: string;
5
+ email?: string;
6
+ password: string;
7
+ }
8
+ export interface HttpContext {
9
+ remoteAddress?: string;
10
+ remotePort?: number;
11
+ userAgent?: string;
12
+ locale?: string;
13
+ countryCode: string;
14
+ }
15
+ export declare function authenticateWithPasswordService(this: Modules, params: AuthenticateWithPasswordParams, httpContext: HttpContext, currentUserId?: string): Promise<User>;
@@ -0,0 +1,34 @@
1
+ import { migrateUserDataService } from "./migrateUserData.js";
2
+ import { nextUserCartService } from "./nextUserCart.js";
3
+ import { UsernameOrEmailRequiredError, InvalidCredentialsError } from "../errors/index.js";
4
+ export async function authenticateWithPasswordService(params, httpContext, currentUserId) {
5
+ const { username, email, password } = params;
6
+ if (!username && !email) {
7
+ throw new UsernameOrEmailRequiredError();
8
+ }
9
+ let user = username
10
+ ? await this.users.findUserByUsername(username)
11
+ : await this.users.findUserByEmail(email);
12
+ if (!user) {
13
+ throw new InvalidCredentialsError({ username, email });
14
+ }
15
+ const verified = user.services?.password && (await this.users.verifyPassword(user.services.password, password));
16
+ if (!verified) {
17
+ throw new InvalidCredentialsError({ username, email });
18
+ }
19
+ if (user.guest) {
20
+ await this.users.updateGuest(user, false);
21
+ }
22
+ user = (await this.users.updateHeartbeat(user._id, {
23
+ remoteAddress: httpContext.remoteAddress,
24
+ remotePort: httpContext.remotePort,
25
+ userAgent: httpContext.userAgent,
26
+ locale: httpContext.locale,
27
+ countryCode: httpContext.countryCode,
28
+ }));
29
+ if (currentUserId) {
30
+ await migrateUserDataService.bind(this)(currentUserId, user._id);
31
+ }
32
+ await nextUserCartService.bind(this)({ user, countryCode: httpContext.countryCode });
33
+ return user;
34
+ }
@@ -0,0 +1,10 @@
1
+ import type { Modules } from '../modules.ts';
2
+ export interface ChangePasswordParams {
3
+ userId: string;
4
+ oldPassword: string;
5
+ newPassword: string;
6
+ }
7
+ export interface ChangePasswordResult {
8
+ success: boolean;
9
+ }
10
+ export declare function changePasswordService(this: Modules, params: ChangePasswordParams): Promise<ChangePasswordResult>;
@@ -0,0 +1,19 @@
1
+ import { InvalidCredentialsError, PasswordInvalidError } from "../errors/index.js";
2
+ export async function changePasswordService(params) {
3
+ const { userId, oldPassword, newPassword } = params;
4
+ const user = await this.users.findUserById(userId);
5
+ const isValidCurrentPassword = user?.services?.password && (await this.users.verifyPassword(user.services.password, oldPassword));
6
+ if (!isValidCurrentPassword) {
7
+ throw new InvalidCredentialsError();
8
+ }
9
+ try {
10
+ await this.users.setPassword(user._id, newPassword);
11
+ return { success: true };
12
+ }
13
+ catch (e) {
14
+ if (e.cause === 'PASSWORD_INVALID') {
15
+ throw new PasswordInvalidError({ userId });
16
+ }
17
+ throw e;
18
+ }
19
+ }
@@ -0,0 +1,3 @@
1
+ import type { OrderQuery } from '@unchainedshop/core-orders';
2
+ import type { Modules } from '../modules.ts';
3
+ export declare function countOrdersWithFiltersService(this: Modules, params: OrderQuery): Promise<number>;
@@ -0,0 +1,25 @@
1
+ export async function countOrdersWithFiltersService(params) {
2
+ const { paymentProviderIds, deliveryProviderIds, ...restParams } = params;
3
+ if (!paymentProviderIds?.length && !deliveryProviderIds?.length) {
4
+ return this.orders.count(restParams);
5
+ }
6
+ const [orderPayments, orderDeliveries] = await Promise.all([
7
+ paymentProviderIds?.length
8
+ ? this.orders.payments.findOrderPaymentsByProviderIds({ paymentProviderIds })
9
+ : [],
10
+ deliveryProviderIds?.length
11
+ ? this.orders.deliveries.findDeliveryByProvidersId({ deliveryProviderIds })
12
+ : [],
13
+ ]);
14
+ if ((paymentProviderIds?.length && !orderPayments.length) ||
15
+ (deliveryProviderIds?.length && !orderDeliveries.length)) {
16
+ return 0;
17
+ }
18
+ const paymentIds = orderPayments.map((p) => p._id);
19
+ const deliveryIds = orderDeliveries.map((d) => d._id);
20
+ return this.orders.count({
21
+ ...restParams,
22
+ paymentIds,
23
+ deliveryIds,
24
+ });
25
+ }
@@ -0,0 +1,7 @@
1
+ import type { Assortment, AssortmentText } from '@unchainedshop/core-assortments';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface CreateAssortmentParams {
4
+ assortment: Partial<Assortment>;
5
+ texts?: AssortmentText[];
6
+ }
7
+ export declare function createAssortmentService(this: Modules, params: CreateAssortmentParams): Promise<Assortment>;
@@ -0,0 +1,10 @@
1
+ export async function createAssortmentService(params) {
2
+ const { assortment: assortmentData, texts } = params;
3
+ const assortment = await this.assortments.create({
4
+ ...assortmentData,
5
+ });
6
+ if (texts) {
7
+ await this.assortments.texts.updateTexts(assortment._id, texts);
8
+ }
9
+ return assortment;
10
+ }
@@ -0,0 +1,8 @@
1
+ import type { Bookmark } from '@unchainedshop/core-bookmarks';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface CreateBookmarkParams {
4
+ productId: string;
5
+ userId: string;
6
+ meta?: any;
7
+ }
8
+ export declare function createBookmarkService(this: Modules, params: CreateBookmarkParams): Promise<Bookmark>;
@@ -0,0 +1,21 @@
1
+ import { ProductNotFoundError, BookmarkAlreadyExistsError } from "../errors/index.js";
2
+ export async function createBookmarkService(params) {
3
+ const { productId, userId, meta } = params;
4
+ if (!(await this.products.productExists({ productId }))) {
5
+ throw new ProductNotFoundError({ productId });
6
+ }
7
+ const [existingBookmark] = await this.bookmarks.findBookmarks({
8
+ productId,
9
+ userId,
10
+ meta,
11
+ });
12
+ if (existingBookmark) {
13
+ throw new BookmarkAlreadyExistsError({ bookmarkId: existingBookmark._id });
14
+ }
15
+ const bookmarkId = await this.bookmarks.create({
16
+ userId,
17
+ productId,
18
+ meta,
19
+ });
20
+ return (await this.bookmarks.findBookmarkById(bookmarkId));
21
+ }
@@ -0,0 +1,6 @@
1
+ import type { DeliveryProvider } from '@unchainedshop/core-delivery';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface CreateDeliveryProviderParams {
4
+ deliveryProvider: Pick<DeliveryProvider, 'type' | 'adapterKey'>;
5
+ }
6
+ export declare function createDeliveryProviderService(this: Modules, params: CreateDeliveryProviderParams): Promise<DeliveryProvider | null>;
@@ -0,0 +1,19 @@
1
+ import { DeliveryDirector } from "../directors/DeliveryDirector.js";
2
+ import { ProviderConfigurationInvalidError } from "../errors/index.js";
3
+ export async function createDeliveryProviderService(params) {
4
+ const { deliveryProvider } = params;
5
+ const Adapter = DeliveryDirector.getAdapter(deliveryProvider.adapterKey);
6
+ if (!Adapter)
7
+ return null;
8
+ const provider = await this.delivery.create({
9
+ configuration: Adapter.initialConfiguration,
10
+ ...deliveryProvider,
11
+ });
12
+ if (!provider) {
13
+ throw new ProviderConfigurationInvalidError({
14
+ adapterKey: deliveryProvider.adapterKey,
15
+ type: deliveryProvider.type,
16
+ });
17
+ }
18
+ return provider;
19
+ }
@@ -1,4 +1,4 @@
1
- import { getFileAdapter } from '@unchainedshop/core-files';
1
+ import { getFileAdapter } from "../utils/getFileAdapter.js";
2
2
  export async function createDownloadStreamService({ fileId, }) {
3
3
  const fileAdapter = getFileAdapter();
4
4
  const file = await this.files.findFile({ fileId });
@@ -0,0 +1,17 @@
1
+ import type { Enrollment, EnrollmentPlan } from '@unchainedshop/core-enrollments';
2
+ import type { Address, Contact } from '@unchainedshop/core-users';
3
+ import type { Modules } from '../modules.ts';
4
+ export interface CreateEnrollmentParams {
5
+ productId: string;
6
+ quantity?: number;
7
+ configuration?: EnrollmentPlan['configuration'];
8
+ billingAddress?: Address;
9
+ contact?: Contact;
10
+ payment?: Enrollment['payment'];
11
+ delivery?: Enrollment['delivery'];
12
+ meta?: any;
13
+ countryCode: string;
14
+ currencyCode: string;
15
+ userId: string;
16
+ }
17
+ export declare function createEnrollmentService(this: Modules, params: CreateEnrollmentParams): Promise<Enrollment>;
@@ -0,0 +1,33 @@
1
+ import { ProductStatus, ProductType } from '@unchainedshop/core-products';
2
+ import { initializeEnrollmentService } from "./initializeEnrollment.js";
3
+ import { ProductNotFoundError, ProductWrongStatusError, ProductWrongTypeError, } from "../errors/index.js";
4
+ export async function createEnrollmentService(params) {
5
+ const { productId, quantity, configuration, billingAddress, contact, payment, delivery, meta, countryCode, currencyCode, userId, } = params;
6
+ const product = await this.products.findProduct({ productId });
7
+ if (!product) {
8
+ throw new ProductNotFoundError({ productId });
9
+ }
10
+ if (product.status !== ProductStatus.ACTIVE) {
11
+ throw new ProductWrongStatusError({ status: product.status });
12
+ }
13
+ if (product.type !== ProductType.PLAN_PRODUCT) {
14
+ throw new ProductWrongTypeError({ type: product.type });
15
+ }
16
+ const enrollment = await this.enrollments.create({
17
+ billingAddress: billingAddress,
18
+ configuration: configuration ?? null,
19
+ contact: contact,
20
+ countryCode,
21
+ currencyCode,
22
+ delivery: delivery,
23
+ meta,
24
+ payment,
25
+ productId,
26
+ quantity: quantity ?? 1,
27
+ userId,
28
+ });
29
+ return initializeEnrollmentService.bind(this)(enrollment, {
30
+ orderIdForFirstPeriod: enrollment.orderIdForFirstPeriod,
31
+ reason: 'new_enrollment',
32
+ });
33
+ }
@@ -1,4 +1,5 @@
1
- import { getFileAdapter } from '@unchainedshop/core-files';
1
+ import {} from '@unchainedshop/core-files';
2
+ import { getFileAdapter } from "../utils/getFileAdapter.js";
2
3
  export async function createFileDownloadURLService({ file, expires, params = {}, }) {
3
4
  if (!file)
4
5
  return null;
@@ -0,0 +1,7 @@
1
+ import type { Product, ProductText } from '@unchainedshop/core-products';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface CreateProductParams {
4
+ product: Partial<Product>;
5
+ texts?: ProductText[];
6
+ }
7
+ export declare function createProductService(this: Modules, params: CreateProductParams): Promise<Product>;
@@ -0,0 +1,8 @@
1
+ export async function createProductService(params) {
2
+ const { product: productData, texts } = params;
3
+ const newProduct = await this.products.create(productData);
4
+ if (texts) {
5
+ await this.products.texts.updateTexts(newProduct._id, texts);
6
+ }
7
+ return newProduct;
8
+ }
@@ -0,0 +1,5 @@
1
+ import { type Product, type ProductBundleItem } from '@unchainedshop/core-products';
2
+ import type { Modules } from '../modules.ts';
3
+ import { ProductNotFoundError, ProductWrongTypeError, CyclicProductBundlingNotSupportedError } from '../errors/index.ts';
4
+ export { ProductNotFoundError, ProductWrongTypeError, CyclicProductBundlingNotSupportedError };
5
+ export declare function createProductBundleItemService(this: Modules, productId: string, item: ProductBundleItem): Promise<Product | null>;
@@ -0,0 +1,25 @@
1
+ import { ProductType } from '@unchainedshop/core-products';
2
+ import { ProductNotFoundError, ProductWrongTypeError, CyclicProductBundlingNotSupportedError, } from "../errors/index.js";
3
+ export { ProductNotFoundError, ProductWrongTypeError, CyclicProductBundlingNotSupportedError };
4
+ export async function createProductBundleItemService(productId, item) {
5
+ const product = await this.products.findProduct({ productId });
6
+ if (!product) {
7
+ throw new ProductNotFoundError({ productId });
8
+ }
9
+ if (product.type !== ProductType.BUNDLE_PRODUCT) {
10
+ throw new ProductWrongTypeError({
11
+ productId,
12
+ received: product.type,
13
+ required: ProductType.BUNDLE_PRODUCT,
14
+ });
15
+ }
16
+ const itemProduct = await this.products.findProduct({ productId: item.productId });
17
+ if (!itemProduct) {
18
+ throw new ProductNotFoundError({ productId: item.productId });
19
+ }
20
+ if (itemProduct._id === product._id) {
21
+ throw new CyclicProductBundlingNotSupportedError({ productId: itemProduct._id });
22
+ }
23
+ await this.products.bundleItems.addBundleItem(productId, item);
24
+ return this.products.findProduct({ productId });
25
+ }
@@ -0,0 +1,8 @@
1
+ import type { ProductReview } from '@unchainedshop/core-products';
2
+ import type { Modules } from '../modules.ts';
3
+ export interface CreateProductReviewParams {
4
+ productId: string;
5
+ authorId: string;
6
+ productReview: Pick<ProductReview, 'title' | 'rating' | 'meta'>;
7
+ }
8
+ export declare function createProductReviewService(this: Modules, params: CreateProductReviewParams): Promise<ProductReview>;
@@ -0,0 +1,12 @@
1
+ import { ProductNotFoundError } from "../errors/index.js";
2
+ export async function createProductReviewService(params) {
3
+ const { productId, authorId, productReview } = params;
4
+ if (!(await this.products.productExists({ productId }))) {
5
+ throw new ProductNotFoundError({ productId });
6
+ }
7
+ return this.products.reviews.create({
8
+ ...productReview,
9
+ productId,
10
+ authorId,
11
+ });
12
+ }
@@ -1,4 +1,5 @@
1
- import { getFileFromFileData, getFileAdapter } from '@unchainedshop/core-files';
1
+ import { getFileFromFileData } from '@unchainedshop/core-files';
2
+ import { getFileAdapter } from "../utils/getFileAdapter.js";
2
3
  export async function createSignedURLService({ directoryName, fileName, meta }) {
3
4
  const fileUploadAdapter = getFileAdapter();
4
5
  const preparedFileData = await fileUploadAdapter.createSignedURL(directoryName, fileName, {
@@ -0,0 +1,5 @@
1
+ import { type Order } from '@unchainedshop/core-orders';
2
+ import type { Modules } from '../modules.ts';
3
+ import { OrderDeliveryNotFoundError, OrderWrongDeliveryStatusError } from '../errors/index.ts';
4
+ export { OrderDeliveryNotFoundError, OrderWrongDeliveryStatusError };
5
+ export declare function deliverOrderService(this: Modules, orderId: string): Promise<Order>;
@@ -0,0 +1,26 @@
1
+ import { OrderDeliveryStatus } from '@unchainedshop/core-orders';
2
+ import { processOrderService } from "./processOrder.js";
3
+ import { OrderNotFoundError, OrderWrongStatusError, OrderDeliveryNotFoundError, OrderWrongDeliveryStatusError, } from "../errors/index.js";
4
+ export { OrderDeliveryNotFoundError, OrderWrongDeliveryStatusError };
5
+ export async function deliverOrderService(orderId) {
6
+ const order = await this.orders.findOrder({ orderId });
7
+ if (!order) {
8
+ throw new OrderNotFoundError({ orderId });
9
+ }
10
+ if (this.orders.isCart(order)) {
11
+ throw new OrderWrongStatusError({ status: order.status });
12
+ }
13
+ const orderDelivery = order.deliveryId &&
14
+ (await this.orders.deliveries.findDelivery({
15
+ orderDeliveryId: order.deliveryId,
16
+ }));
17
+ if (!orderDelivery) {
18
+ throw new OrderDeliveryNotFoundError({ orderDeliveryId: order.deliveryId });
19
+ }
20
+ if (this.orders.deliveries.normalizedStatus(orderDelivery) !== OrderDeliveryStatus.OPEN &&
21
+ order.confirmed) {
22
+ throw new OrderWrongDeliveryStatusError({ status: orderDelivery.status });
23
+ }
24
+ await this.orders.deliveries.markAsDelivered(orderDelivery);
25
+ return processOrderService.bind(this)(order, {});
26
+ }
@@ -0,0 +1,2 @@
1
+ import type { Modules } from '../modules.ts';
2
+ export declare function findActiveWorkTypesService(this: Modules): Promise<string[]>;
@@ -0,0 +1,6 @@
1
+ import { WorkerDirector } from "../directors/index.js";
2
+ export async function findActiveWorkTypesService() {
3
+ const typeList = await this.worker.activeWorkTypes();
4
+ const pluginTypes = WorkerDirector.getActivePluginTypes();
5
+ return typeList.filter((type) => pluginTypes.includes(type));
6
+ }
@@ -0,0 +1,7 @@
1
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
2
+ export interface DeliveryInterface {
3
+ _id: string;
4
+ label: string;
5
+ version: string;
6
+ }
7
+ export declare function findDeliveryInterfacesService(type?: DeliveryProviderType): Promise<DeliveryInterface[]>;
@@ -0,0 +1,13 @@
1
+ import { DeliveryProviderType } from '@unchainedshop/core-delivery';
2
+ import { DeliveryDirector } from "../directors/index.js";
3
+ export async function findDeliveryInterfacesService(type) {
4
+ const allAdapters = await DeliveryDirector.getAdapters();
5
+ const filteredAdapters = type
6
+ ? allAdapters.filter((Adapter) => Adapter.typeSupported(type))
7
+ : allAdapters;
8
+ return filteredAdapters.map((Adapter) => ({
9
+ _id: Adapter.key,
10
+ label: Adapter.label,
11
+ version: Adapter.version,
12
+ }));
13
+ }
@@ -0,0 +1,9 @@
1
+ import type { Order, OrderQuery } from '@unchainedshop/core-orders';
2
+ import type { SortOption } from '@unchainedshop/utils';
3
+ import type { Modules } from '../modules.ts';
4
+ export interface FindOrdersWithFiltersParams extends OrderQuery {
5
+ limit?: number;
6
+ offset?: number;
7
+ sort?: SortOption[];
8
+ }
9
+ export declare function findOrdersWithFiltersService(this: Modules, params: FindOrdersWithFiltersParams): Promise<Order[]>;
@@ -0,0 +1,25 @@
1
+ export async function findOrdersWithFiltersService(params) {
2
+ const { paymentProviderIds, deliveryProviderIds, ...restParams } = params;
3
+ if (!paymentProviderIds?.length && !deliveryProviderIds?.length) {
4
+ return this.orders.findOrders(restParams);
5
+ }
6
+ const [orderPayments, orderDeliveries] = await Promise.all([
7
+ paymentProviderIds?.length
8
+ ? this.orders.payments.findOrderPaymentsByProviderIds({ paymentProviderIds })
9
+ : [],
10
+ deliveryProviderIds?.length
11
+ ? this.orders.deliveries.findDeliveryByProvidersId({ deliveryProviderIds })
12
+ : [],
13
+ ]);
14
+ if ((paymentProviderIds?.length && !orderPayments.length) ||
15
+ (deliveryProviderIds?.length && !orderDeliveries.length)) {
16
+ return [];
17
+ }
18
+ const paymentIds = orderPayments.map((p) => p._id);
19
+ const deliveryIds = orderDeliveries.map((d) => d._id);
20
+ return this.orders.findOrders({
21
+ ...restParams,
22
+ paymentIds,
23
+ deliveryIds,
24
+ });
25
+ }
@@ -0,0 +1,7 @@
1
+ import { PaymentProviderType } from '@unchainedshop/core-payment';
2
+ export interface PaymentInterface {
3
+ _id: string;
4
+ label: string;
5
+ version: string;
6
+ }
7
+ export declare function findPaymentInterfacesService(type?: PaymentProviderType): Promise<PaymentInterface[]>;
@@ -0,0 +1,13 @@
1
+ import { PaymentProviderType } from '@unchainedshop/core-payment';
2
+ import { PaymentDirector } from "../directors/index.js";
3
+ export async function findPaymentInterfacesService(type) {
4
+ const allAdapters = await PaymentDirector.getAdapters();
5
+ const filteredAdapters = type
6
+ ? allAdapters.filter((Adapter) => Adapter.typeSupported(type))
7
+ : allAdapters;
8
+ return filteredAdapters.map((Adapter) => ({
9
+ _id: Adapter.key,
10
+ label: Adapter.label,
11
+ version: Adapter.version,
12
+ }));
13
+ }
@@ -0,0 +1,7 @@
1
+ import { WarehousingProviderType } from '@unchainedshop/core-warehousing';
2
+ export interface WarehousingInterface {
3
+ _id: string;
4
+ label: string;
5
+ version: string;
6
+ }
7
+ export declare function findWarehousingInterfacesService(type?: WarehousingProviderType): Promise<WarehousingInterface[]>;