@pvh-afl/core 1.0.0

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 (154) hide show
  1. package/README.md +97 -0
  2. package/dist/cache/cache.module.d.ts +3 -0
  3. package/dist/cache/cache.module.d.ts.map +1 -0
  4. package/dist/cache/cache.module.js +17 -0
  5. package/dist/cache/cache.module.js.map +1 -0
  6. package/dist/cache/cache.service.d.ts +38 -0
  7. package/dist/cache/cache.service.d.ts.map +1 -0
  8. package/dist/cache/cache.service.js +173 -0
  9. package/dist/cache/cache.service.js.map +1 -0
  10. package/dist/cache/index.d.ts +3 -0
  11. package/dist/cache/index.d.ts.map +1 -0
  12. package/dist/cache/index.js +6 -0
  13. package/dist/cache/index.js.map +1 -0
  14. package/dist/common/guards/tenant.guard.d.ts +8 -0
  15. package/dist/common/guards/tenant.guard.d.ts.map +1 -0
  16. package/dist/common/guards/tenant.guard.js +44 -0
  17. package/dist/common/guards/tenant.guard.js.map +1 -0
  18. package/dist/common/index.d.ts +3 -0
  19. package/dist/common/index.d.ts.map +1 -0
  20. package/dist/common/index.js +6 -0
  21. package/dist/common/index.js.map +1 -0
  22. package/dist/common/logger.d.ts +7 -0
  23. package/dist/common/logger.d.ts.map +1 -0
  24. package/dist/common/logger.js +28 -0
  25. package/dist/common/logger.js.map +1 -0
  26. package/dist/config/config.module.d.ts +3 -0
  27. package/dist/config/config.module.d.ts.map +1 -0
  28. package/dist/config/config.module.js +17 -0
  29. package/dist/config/config.module.js.map +1 -0
  30. package/dist/config/config.service.d.ts +55 -0
  31. package/dist/config/config.service.d.ts.map +1 -0
  32. package/dist/config/config.service.js +212 -0
  33. package/dist/config/config.service.js.map +1 -0
  34. package/dist/config/index.d.ts +3 -0
  35. package/dist/config/index.d.ts.map +1 -0
  36. package/dist/config/index.js +6 -0
  37. package/dist/config/index.js.map +1 -0
  38. package/dist/index.d.ts +12 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +21 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/integrations/base-integration.service.d.ts +59 -0
  43. package/dist/integrations/base-integration.service.d.ts.map +1 -0
  44. package/dist/integrations/base-integration.service.js +227 -0
  45. package/dist/integrations/base-integration.service.js.map +1 -0
  46. package/dist/integrations/commerce/commerce.types.d.ts +301 -0
  47. package/dist/integrations/commerce/commerce.types.d.ts.map +1 -0
  48. package/dist/integrations/commerce/commerce.types.js +9 -0
  49. package/dist/integrations/commerce/commerce.types.js.map +1 -0
  50. package/dist/integrations/commerce/index.d.ts +4 -0
  51. package/dist/integrations/commerce/index.d.ts.map +1 -0
  52. package/dist/integrations/commerce/index.js +7 -0
  53. package/dist/integrations/commerce/index.js.map +1 -0
  54. package/dist/integrations/commerce/shopify-admin.service.d.ts +35 -0
  55. package/dist/integrations/commerce/shopify-admin.service.d.ts.map +1 -0
  56. package/dist/integrations/commerce/shopify-admin.service.js +269 -0
  57. package/dist/integrations/commerce/shopify-admin.service.js.map +1 -0
  58. package/dist/integrations/commerce/shopify.service.d.ts +43 -0
  59. package/dist/integrations/commerce/shopify.service.d.ts.map +1 -0
  60. package/dist/integrations/commerce/shopify.service.js +735 -0
  61. package/dist/integrations/commerce/shopify.service.js.map +1 -0
  62. package/dist/integrations/index.d.ts +9 -0
  63. package/dist/integrations/index.d.ts.map +1 -0
  64. package/dist/integrations/index.js +18 -0
  65. package/dist/integrations/index.js.map +1 -0
  66. package/dist/integrations/integration.factory.d.ts +23 -0
  67. package/dist/integrations/integration.factory.d.ts.map +1 -0
  68. package/dist/integrations/integration.factory.js +119 -0
  69. package/dist/integrations/integration.factory.js.map +1 -0
  70. package/dist/integrations/integration.types.d.ts +80 -0
  71. package/dist/integrations/integration.types.d.ts.map +1 -0
  72. package/dist/integrations/integration.types.js +9 -0
  73. package/dist/integrations/integration.types.js.map +1 -0
  74. package/dist/integrations/integrations.module.d.ts +3 -0
  75. package/dist/integrations/integrations.module.d.ts.map +1 -0
  76. package/dist/integrations/integrations.module.js +46 -0
  77. package/dist/integrations/integrations.module.js.map +1 -0
  78. package/dist/integrations/loyalty/capillary-auth.service.d.ts +30 -0
  79. package/dist/integrations/loyalty/capillary-auth.service.d.ts.map +1 -0
  80. package/dist/integrations/loyalty/capillary-auth.service.js +112 -0
  81. package/dist/integrations/loyalty/capillary-auth.service.js.map +1 -0
  82. package/dist/integrations/loyalty/capillary-coupon.service.d.ts +24 -0
  83. package/dist/integrations/loyalty/capillary-coupon.service.d.ts.map +1 -0
  84. package/dist/integrations/loyalty/capillary-coupon.service.js +383 -0
  85. package/dist/integrations/loyalty/capillary-coupon.service.js.map +1 -0
  86. package/dist/integrations/loyalty/capillary.types.d.ts +218 -0
  87. package/dist/integrations/loyalty/capillary.types.d.ts.map +1 -0
  88. package/dist/integrations/loyalty/capillary.types.js +21 -0
  89. package/dist/integrations/loyalty/capillary.types.js.map +1 -0
  90. package/dist/integrations/loyalty/index.d.ts +4 -0
  91. package/dist/integrations/loyalty/index.d.ts.map +1 -0
  92. package/dist/integrations/loyalty/index.js +7 -0
  93. package/dist/integrations/loyalty/index.js.map +1 -0
  94. package/dist/integrations/oms/index.d.ts +4 -0
  95. package/dist/integrations/oms/index.d.ts.map +1 -0
  96. package/dist/integrations/oms/index.js +7 -0
  97. package/dist/integrations/oms/index.js.map +1 -0
  98. package/dist/integrations/oms/omuni-auth.service.d.ts +29 -0
  99. package/dist/integrations/oms/omuni-auth.service.d.ts.map +1 -0
  100. package/dist/integrations/oms/omuni-auth.service.js +164 -0
  101. package/dist/integrations/oms/omuni-auth.service.js.map +1 -0
  102. package/dist/integrations/oms/omuni.service.d.ts +17 -0
  103. package/dist/integrations/oms/omuni.service.d.ts.map +1 -0
  104. package/dist/integrations/oms/omuni.service.js +128 -0
  105. package/dist/integrations/oms/omuni.service.js.map +1 -0
  106. package/dist/integrations/oms/omuni.types.d.ts +65 -0
  107. package/dist/integrations/oms/omuni.types.d.ts.map +1 -0
  108. package/dist/integrations/oms/omuni.types.js +3 -0
  109. package/dist/integrations/oms/omuni.types.js.map +1 -0
  110. package/dist/integrations/shopify-theme/index.d.ts +3 -0
  111. package/dist/integrations/shopify-theme/index.d.ts.map +1 -0
  112. package/dist/integrations/shopify-theme/index.js +6 -0
  113. package/dist/integrations/shopify-theme/index.js.map +1 -0
  114. package/dist/integrations/shopify-theme/shopify-theme.module.d.ts +3 -0
  115. package/dist/integrations/shopify-theme/shopify-theme.module.d.ts.map +1 -0
  116. package/dist/integrations/shopify-theme/shopify-theme.module.js +16 -0
  117. package/dist/integrations/shopify-theme/shopify-theme.module.js.map +1 -0
  118. package/dist/integrations/shopify-theme/shopify-theme.service.d.ts +35 -0
  119. package/dist/integrations/shopify-theme/shopify-theme.service.d.ts.map +1 -0
  120. package/dist/integrations/shopify-theme/shopify-theme.service.js +155 -0
  121. package/dist/integrations/shopify-theme/shopify-theme.service.js.map +1 -0
  122. package/dist/queue/index.d.ts +3 -0
  123. package/dist/queue/index.d.ts.map +1 -0
  124. package/dist/queue/index.js +8 -0
  125. package/dist/queue/index.js.map +1 -0
  126. package/dist/queue/queue.module.d.ts +3 -0
  127. package/dist/queue/queue.module.d.ts.map +1 -0
  128. package/dist/queue/queue.module.js +17 -0
  129. package/dist/queue/queue.module.js.map +1 -0
  130. package/dist/queue/queue.service.d.ts +20 -0
  131. package/dist/queue/queue.service.d.ts.map +1 -0
  132. package/dist/queue/queue.service.js +119 -0
  133. package/dist/queue/queue.service.js.map +1 -0
  134. package/dist/theme/header-content.service.d.ts +142 -0
  135. package/dist/theme/header-content.service.d.ts.map +1 -0
  136. package/dist/theme/header-content.service.js +626 -0
  137. package/dist/theme/header-content.service.js.map +1 -0
  138. package/dist/theme/index.d.ts +5 -0
  139. package/dist/theme/index.d.ts.map +1 -0
  140. package/dist/theme/index.js +17 -0
  141. package/dist/theme/index.js.map +1 -0
  142. package/dist/theme/theme-content.interfaces.d.ts +79 -0
  143. package/dist/theme/theme-content.interfaces.d.ts.map +1 -0
  144. package/dist/theme/theme-content.interfaces.js +14 -0
  145. package/dist/theme/theme-content.interfaces.js.map +1 -0
  146. package/dist/theme/theme-content.service.d.ts +125 -0
  147. package/dist/theme/theme-content.service.d.ts.map +1 -0
  148. package/dist/theme/theme-content.service.js +738 -0
  149. package/dist/theme/theme-content.service.js.map +1 -0
  150. package/dist/theme/theme.module.d.ts +46 -0
  151. package/dist/theme/theme.module.d.ts.map +1 -0
  152. package/dist/theme/theme.module.js +76 -0
  153. package/dist/theme/theme.module.js.map +1 -0
  154. package/package.json +62 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Commerce Integration Types
3
+ *
4
+ * Defines the interface for commerce platforms (Shopify, BigCommerce, etc.)
5
+ * All commerce providers must implement ICommerceService.
6
+ */
7
+ import { IntegrationResponse } from '../integration.types';
8
+ export interface CommerceImage {
9
+ url: string;
10
+ altText: string | null;
11
+ width: number;
12
+ height: number;
13
+ }
14
+ export interface CommerceMoney {
15
+ amount: string;
16
+ currencyCode: string;
17
+ }
18
+ export interface CommercePriceRange {
19
+ minVariantPrice: CommerceMoney;
20
+ maxVariantPrice: CommerceMoney;
21
+ }
22
+ export interface CommercePageInfo {
23
+ hasNextPage: boolean;
24
+ hasPreviousPage: boolean;
25
+ startCursor: string | null;
26
+ endCursor: string | null;
27
+ }
28
+ export interface CommerceConnection<T> {
29
+ edges: Array<{
30
+ node: T;
31
+ cursor: string;
32
+ }>;
33
+ pageInfo: CommercePageInfo;
34
+ }
35
+ export interface CommerceProductOption {
36
+ id: string;
37
+ name: string;
38
+ values: string[];
39
+ }
40
+ export interface CommerceProductVariant {
41
+ id: string;
42
+ title: string;
43
+ availableForSale: boolean;
44
+ price: CommerceMoney;
45
+ compareAtPrice: CommerceMoney | null;
46
+ selectedOptions: Array<{
47
+ name: string;
48
+ value: string;
49
+ }>;
50
+ image: CommerceImage | null;
51
+ }
52
+ export interface CommerceProduct {
53
+ id: string;
54
+ handle: string;
55
+ title: string;
56
+ description: string;
57
+ descriptionHtml: string;
58
+ images: {
59
+ edges: Array<{
60
+ node: CommerceImage;
61
+ }>;
62
+ };
63
+ options: CommerceProductOption[];
64
+ variants: {
65
+ edges: Array<{
66
+ node: CommerceProductVariant;
67
+ }>;
68
+ };
69
+ priceRange: CommercePriceRange;
70
+ featuredImage: CommerceImage | null;
71
+ tags: string[];
72
+ vendor: string;
73
+ productType: string;
74
+ }
75
+ export interface CommerceProductRef {
76
+ handle: string;
77
+ }
78
+ export interface CommerceCollection {
79
+ id: string;
80
+ handle: string;
81
+ title: string;
82
+ description: string;
83
+ image: CommerceImage | null;
84
+ productRefs?: {
85
+ edges: Array<{
86
+ node: CommerceProductRef;
87
+ }>;
88
+ };
89
+ }
90
+ export interface CommercePage {
91
+ id: string;
92
+ handle: string;
93
+ title: string;
94
+ body: string;
95
+ bodySummary: string;
96
+ }
97
+ export interface CommerceMenuItem {
98
+ id: string;
99
+ title: string;
100
+ url: string;
101
+ items: CommerceMenuItem[];
102
+ }
103
+ export interface CommerceMenu {
104
+ id: string;
105
+ handle: string;
106
+ title: string;
107
+ items: CommerceMenuItem[];
108
+ }
109
+ export interface CommerceCartLine {
110
+ id: string;
111
+ quantity: number;
112
+ merchandise: {
113
+ id: string;
114
+ title: string;
115
+ selectedOptions: Array<{
116
+ name: string;
117
+ value: string;
118
+ }>;
119
+ product: {
120
+ id: string;
121
+ title: string;
122
+ handle: string;
123
+ options: Array<{
124
+ id: string;
125
+ name: string;
126
+ values: string[];
127
+ }>;
128
+ };
129
+ image: CommerceImage | null;
130
+ price: CommerceMoney;
131
+ };
132
+ cost: {
133
+ totalAmount: CommerceMoney;
134
+ };
135
+ discountAllocations?: CommerceDiscountAllocation[];
136
+ }
137
+ export interface CommerceCart {
138
+ id: string;
139
+ checkoutUrl: string;
140
+ totalQuantity: number;
141
+ lines: {
142
+ edges: Array<{
143
+ node: CommerceCartLine;
144
+ }>;
145
+ };
146
+ cost: {
147
+ subtotalAmount: CommerceMoney;
148
+ totalAmount: CommerceMoney;
149
+ totalTaxAmount: CommerceMoney | null;
150
+ };
151
+ discountCodes: CommerceDiscountCode[];
152
+ discountAllocations: CommerceDiscountAllocation[];
153
+ buyerIdentity: CommerceBuyerIdentity | null;
154
+ note: string | null;
155
+ attributes: CommerceCartAttribute[];
156
+ appliedGiftCards: CommerceAppliedGiftCard[];
157
+ deliveryGroups: {
158
+ edges: Array<{
159
+ node: CommerceDeliveryGroup;
160
+ }>;
161
+ };
162
+ }
163
+ export interface ProductsParams {
164
+ first?: number;
165
+ after?: string;
166
+ }
167
+ export interface CollectionsParams {
168
+ first?: number;
169
+ }
170
+ export interface CartLineInput {
171
+ merchandiseId: string;
172
+ quantity: number;
173
+ }
174
+ export interface CartLineUpdateInput {
175
+ id: string;
176
+ quantity: number;
177
+ }
178
+ export interface CommerceDiscountCode {
179
+ code: string;
180
+ applicable: boolean;
181
+ }
182
+ export interface CommerceDiscountAllocation {
183
+ discountedAmount: CommerceMoney;
184
+ title?: string;
185
+ code?: string;
186
+ }
187
+ export interface CommerceCartAttribute {
188
+ key: string;
189
+ value: string | null;
190
+ }
191
+ export interface CartAttributeInput {
192
+ key: string;
193
+ value: string;
194
+ }
195
+ export interface CommerceAppliedGiftCard {
196
+ id: string;
197
+ lastCharacters: string;
198
+ amountUsed: CommerceMoney;
199
+ balance: CommerceMoney;
200
+ }
201
+ export interface CommerceDeliveryOption {
202
+ code: string | null;
203
+ deliveryMethodType: string;
204
+ description: string | null;
205
+ estimatedCost: CommerceMoney;
206
+ handle: string;
207
+ title: string;
208
+ }
209
+ export interface CommerceDeliveryGroup {
210
+ id: string;
211
+ deliveryAddress: CommerceMailingAddress | null;
212
+ deliveryOptions: CommerceDeliveryOption[];
213
+ selectedDeliveryOption: CommerceDeliveryOption | null;
214
+ }
215
+ export interface CommerceMailingAddress {
216
+ address1: string | null;
217
+ address2: string | null;
218
+ city: string | null;
219
+ company: string | null;
220
+ country: string | null;
221
+ countryCodeV2: string | null;
222
+ firstName: string | null;
223
+ lastName: string | null;
224
+ phone: string | null;
225
+ province: string | null;
226
+ provinceCode: string | null;
227
+ zip: string | null;
228
+ }
229
+ export interface CommerceCustomer {
230
+ id: string;
231
+ email: string | null;
232
+ firstName: string | null;
233
+ lastName: string | null;
234
+ phone: string | null;
235
+ displayName: string;
236
+ }
237
+ export interface CommerceDeliveryAddressPreference extends CommerceMailingAddress {
238
+ __typename?: string;
239
+ }
240
+ export interface CommerceBuyerIdentity {
241
+ email: string | null;
242
+ phone: string | null;
243
+ customer: CommerceCustomer | null;
244
+ countryCode: string | null;
245
+ deliveryAddressPreferences: CommerceDeliveryAddressPreference[];
246
+ }
247
+ export interface CartBuyerIdentityInput {
248
+ email?: string;
249
+ phone?: string;
250
+ countryCode?: string;
251
+ customerAccessToken?: string;
252
+ deliveryAddressPreferences?: Array<{
253
+ deliveryAddress: {
254
+ address1?: string;
255
+ address2?: string;
256
+ city?: string;
257
+ company?: string;
258
+ country?: string;
259
+ firstName?: string;
260
+ lastName?: string;
261
+ phone?: string;
262
+ province?: string;
263
+ zip?: string;
264
+ };
265
+ }>;
266
+ }
267
+ export interface CommerceProductRecommendation {
268
+ id: string;
269
+ handle: string;
270
+ title: string;
271
+ vendor: string;
272
+ productType: string;
273
+ featuredImage: CommerceImage | null;
274
+ priceRange: CommercePriceRange;
275
+ }
276
+ /**
277
+ * Commerce Service Interface
278
+ *
279
+ * All commerce providers (Shopify, BigCommerce, etc.) must implement this interface.
280
+ */
281
+ export interface ICommerceService {
282
+ getProducts(params?: ProductsParams): Promise<IntegrationResponse<CommerceConnection<CommerceProduct>>>;
283
+ getProductById(id: string): Promise<IntegrationResponse<CommerceProduct | null>>;
284
+ getProductByHandle(handle: string): Promise<IntegrationResponse<CommerceProduct | null>>;
285
+ getProductRecommendations(productId: string, count?: number): Promise<IntegrationResponse<CommerceProductRecommendation[]>>;
286
+ getCollections(params?: CollectionsParams): Promise<IntegrationResponse<CommerceConnection<CommerceCollection>>>;
287
+ getCollectionByHandle(handle: string, productsFirst?: number): Promise<IntegrationResponse<CommerceCollection | null>>;
288
+ getMenu(handle: string): Promise<IntegrationResponse<CommerceMenu | null>>;
289
+ getPage(handle: string): Promise<IntegrationResponse<CommercePage | null>>;
290
+ createCart(): Promise<IntegrationResponse<CommerceCart>>;
291
+ getCart(cartId: string): Promise<IntegrationResponse<CommerceCart | null>>;
292
+ addToCart(cartId: string, lines: CartLineInput[]): Promise<IntegrationResponse<CommerceCart>>;
293
+ updateCartLines(cartId: string, lines: CartLineUpdateInput[]): Promise<IntegrationResponse<CommerceCart>>;
294
+ removeCartLines(cartId: string, lineIds: string[]): Promise<IntegrationResponse<CommerceCart>>;
295
+ updateCartDiscountCodes(cartId: string, discountCodes: string[]): Promise<IntegrationResponse<CommerceCart>>;
296
+ updateCartBuyerIdentity(cartId: string, buyerIdentity: CartBuyerIdentityInput): Promise<IntegrationResponse<CommerceCart>>;
297
+ updateCartNote(cartId: string, note: string): Promise<IntegrationResponse<CommerceCart>>;
298
+ updateCartAttributes(cartId: string, attributes: CartAttributeInput[]): Promise<IntegrationResponse<CommerceCart>>;
299
+ updateCartGiftCardCodes(cartId: string, giftCardCodes: string[]): Promise<IntegrationResponse<CommerceCart>>;
300
+ }
301
+ //# sourceMappingURL=commerce.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commerce.types.d.ts","sourceRoot":"","sources":["../../../src/integrations/commerce/commerce.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Commerce Integration Types
4
+ *
5
+ * Defines the interface for commerce platforms (Shopify, BigCommerce, etc.)
6
+ * All commerce providers must implement ICommerceService.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=commerce.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commerce.types.js","sourceRoot":"","sources":["../../../src/integrations/commerce/commerce.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,4 @@
1
+ export * from './commerce.types';
2
+ export * from './shopify.service';
3
+ export * from './shopify-admin.service';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/commerce/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./commerce.types"), exports);
5
+ tslib_1.__exportStar(require("./shopify.service"), exports);
6
+ tslib_1.__exportStar(require("./shopify-admin.service"), exports);
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/commerce/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC;AACjC,4DAAkC;AAClC,kEAAwC"}
@@ -0,0 +1,35 @@
1
+ import { ConfigService } from '../../config/config.service';
2
+ import { CouponValidationResult } from '../loyalty/capillary.types';
3
+ /**
4
+ * Shopify Admin API Service
5
+ *
6
+ * Handles Shopify Admin API operations for discount code management.
7
+ * Uses REST Admin API for price rules and discount codes.
8
+ */
9
+ export declare class ShopifyAdminService {
10
+ private readonly configService;
11
+ private readonly API_VERSION;
12
+ private readonly COUPON_PREFIX;
13
+ constructor(configService: ConfigService);
14
+ /**
15
+ * Create a Shopify discount code from a validated Capillary coupon.
16
+ */
17
+ createDiscountFromCapillaryCoupon(brand: string, capillaryValidation: CouponValidationResult, shopifyCustomerId: string): Promise<ShopifyDiscountResult>;
18
+ private createPriceRule;
19
+ private createDiscountCode;
20
+ private getDiscountCodeByCode;
21
+ private findPriceRuleByTitle;
22
+ private findDiscountCodeByCode;
23
+ private getAdminConfig;
24
+ getWebhookSecret(brand: string): string;
25
+ private getHeaders;
26
+ }
27
+ export interface ShopifyDiscountResult {
28
+ success: boolean;
29
+ discountCode: string;
30
+ priceRuleId?: string;
31
+ discountCodeId?: string;
32
+ alreadyExists?: boolean;
33
+ error?: string;
34
+ }
35
+ //# sourceMappingURL=shopify-admin.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shopify-admin.service.d.ts","sourceRoot":"","sources":["../../../src/integrations/commerce/shopify-admin.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;;;GAKG;AACH,qBACa,mBAAmB;IAIlB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAEX,aAAa,EAAE,aAAa;IAEzD;;OAEG;IACG,iCAAiC,CACrC,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,sBAAsB,EAC3C,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,qBAAqB,CAAC;YA0EnB,eAAe;YA4Df,kBAAkB;YAmDlB,qBAAqB;YAiCrB,oBAAoB;YA2BpB,sBAAsB;IA4BpC,OAAO,CAAC,cAAc;IAetB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKvC,OAAO,CAAC,UAAU;CAMnB;AAuBD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShopifyAdminService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const config_service_1 = require("../../config/config.service");
7
+ const logger_1 = require("../../common/logger");
8
+ /**
9
+ * Shopify Admin API Service
10
+ *
11
+ * Handles Shopify Admin API operations for discount code management.
12
+ * Uses REST Admin API for price rules and discount codes.
13
+ */
14
+ let ShopifyAdminService = class ShopifyAdminService {
15
+ configService;
16
+ API_VERSION = '2024-01';
17
+ COUPON_PREFIX = 'CAP_';
18
+ constructor(configService) {
19
+ this.configService = configService;
20
+ }
21
+ /**
22
+ * Create a Shopify discount code from a validated Capillary coupon.
23
+ */
24
+ async createDiscountFromCapillaryCoupon(brand, capillaryValidation, shopifyCustomerId) {
25
+ const config = this.getAdminConfig(brand);
26
+ const originalCode = capillaryValidation.couponCode.startsWith(this.COUPON_PREFIX)
27
+ ? capillaryValidation.couponCode
28
+ : this.COUPON_PREFIX + capillaryValidation.couponCode;
29
+ const shopifyCode = `${originalCode}_${shopifyCustomerId}`;
30
+ const existing = await this.getDiscountCodeByCode(brand, shopifyCode);
31
+ if (existing) {
32
+ logger_1.logger.info('Shopify discount code already exists', { brand, shopifyCode });
33
+ return {
34
+ success: true,
35
+ discountCode: shopifyCode,
36
+ priceRuleId: existing.priceRuleId,
37
+ discountCodeId: existing.discountCodeId,
38
+ alreadyExists: true,
39
+ };
40
+ }
41
+ const isValidShopifyGid = shopifyCustomerId.startsWith('gid://shopify/Customer/');
42
+ const priceRuleConfig = {
43
+ title: shopifyCode,
44
+ valueType: capillaryValidation.discountType === 'PERC' ? 'percentage' : 'fixed_amount',
45
+ value: capillaryValidation.discountType === 'PERC'
46
+ ? -capillaryValidation.discountValue
47
+ : -capillaryValidation.discountValue,
48
+ usageLimit: 1,
49
+ startsAt: new Date().toISOString(),
50
+ endsAt: capillaryValidation.validTill,
51
+ allocationMethod: 'across',
52
+ targetType: 'line_item',
53
+ targetSelection: 'all',
54
+ customerSelection: isValidShopifyGid ? 'prerequisite' : 'all',
55
+ ...(isValidShopifyGid && { prerequisiteCustomerIds: [shopifyCustomerId] }),
56
+ };
57
+ const priceRule = await this.createPriceRule(brand, priceRuleConfig);
58
+ if (!priceRule.success) {
59
+ return {
60
+ success: false,
61
+ discountCode: shopifyCode,
62
+ error: priceRule.error,
63
+ };
64
+ }
65
+ const discountCode = await this.createDiscountCode(brand, priceRule.priceRuleId, shopifyCode);
66
+ if (!discountCode.success) {
67
+ return {
68
+ success: false,
69
+ discountCode: shopifyCode,
70
+ priceRuleId: priceRule.priceRuleId,
71
+ error: discountCode.error,
72
+ };
73
+ }
74
+ logger_1.logger.info('Shopify discount code created', {
75
+ brand,
76
+ shopifyCode,
77
+ priceRuleId: priceRule.priceRuleId,
78
+ discountCodeId: discountCode.discountCodeId,
79
+ });
80
+ return {
81
+ success: true,
82
+ discountCode: shopifyCode,
83
+ priceRuleId: priceRule.priceRuleId,
84
+ discountCodeId: discountCode.discountCodeId,
85
+ };
86
+ }
87
+ async createPriceRule(brand, params) {
88
+ const config = this.getAdminConfig(brand);
89
+ const url = `${config.baseUrl}/price_rules.json`;
90
+ const body = {
91
+ price_rule: {
92
+ title: params.title,
93
+ target_type: params.targetType,
94
+ target_selection: params.targetSelection,
95
+ allocation_method: params.allocationMethod,
96
+ value_type: params.valueType,
97
+ value: params.value.toString(),
98
+ customer_selection: params.customerSelection,
99
+ prerequisite_customer_ids: params.prerequisiteCustomerIds,
100
+ usage_limit: params.usageLimit,
101
+ starts_at: params.startsAt,
102
+ ends_at: params.endsAt,
103
+ },
104
+ };
105
+ try {
106
+ const response = await fetch(url, {
107
+ method: 'POST',
108
+ headers: this.getHeaders(config),
109
+ body: JSON.stringify(body),
110
+ });
111
+ if (!response.ok) {
112
+ const errorData = (await response.json());
113
+ const errorMsg = errorData.errors
114
+ ? JSON.stringify(errorData.errors)
115
+ : `HTTP ${response.status}`;
116
+ if (response.status === 422 && errorMsg.includes('title')) {
117
+ logger_1.logger.warn('Price rule naming collision, looking up existing', { brand, title: params.title });
118
+ const existing = await this.findPriceRuleByTitle(brand, params.title);
119
+ if (existing) {
120
+ return { success: true, priceRuleId: existing };
121
+ }
122
+ }
123
+ logger_1.logger.error('Failed to create Shopify price rule', { brand, error: errorMsg });
124
+ return { success: false, error: errorMsg };
125
+ }
126
+ const data = (await response.json());
127
+ return {
128
+ success: true,
129
+ priceRuleId: data.price_rule.id.toString(),
130
+ };
131
+ }
132
+ catch (error) {
133
+ const errorMsg = error instanceof Error ? error.message : 'Unknown error';
134
+ logger_1.logger.error('Shopify price rule creation failed', { brand, error: errorMsg });
135
+ return { success: false, error: errorMsg };
136
+ }
137
+ }
138
+ async createDiscountCode(brand, priceRuleId, code) {
139
+ const config = this.getAdminConfig(brand);
140
+ const url = `${config.baseUrl}/price_rules/${priceRuleId}/discount_codes.json`;
141
+ const body = {
142
+ discount_code: {
143
+ code,
144
+ },
145
+ };
146
+ try {
147
+ const response = await fetch(url, {
148
+ method: 'POST',
149
+ headers: this.getHeaders(config),
150
+ body: JSON.stringify(body),
151
+ });
152
+ if (!response.ok) {
153
+ const errorData = (await response.json());
154
+ const errorMsg = errorData.errors
155
+ ? JSON.stringify(errorData.errors)
156
+ : `HTTP ${response.status}`;
157
+ if (response.status === 422 && errorMsg.includes('code')) {
158
+ logger_1.logger.warn('Discount code already exists', { brand, code, priceRuleId });
159
+ const existing = await this.findDiscountCodeByCode(brand, priceRuleId, code);
160
+ if (existing) {
161
+ return { success: true, discountCodeId: existing };
162
+ }
163
+ }
164
+ logger_1.logger.error('Failed to create Shopify discount code', { brand, error: errorMsg });
165
+ return { success: false, error: errorMsg };
166
+ }
167
+ const data = (await response.json());
168
+ return {
169
+ success: true,
170
+ discountCodeId: data.discount_code.id.toString(),
171
+ };
172
+ }
173
+ catch (error) {
174
+ const errorMsg = error instanceof Error ? error.message : 'Unknown error';
175
+ logger_1.logger.error('Shopify discount code creation failed', { brand, error: errorMsg });
176
+ return { success: false, error: errorMsg };
177
+ }
178
+ }
179
+ async getDiscountCodeByCode(brand, code) {
180
+ const config = this.getAdminConfig(brand);
181
+ const url = `${config.baseUrl}/discount_codes/lookup.json?code=${encodeURIComponent(code)}`;
182
+ try {
183
+ const response = await fetch(url, {
184
+ method: 'GET',
185
+ headers: this.getHeaders(config),
186
+ });
187
+ if (!response.ok) {
188
+ return null;
189
+ }
190
+ const data = (await response.json());
191
+ if (data.discount_code) {
192
+ return {
193
+ priceRuleId: data.discount_code.price_rule_id.toString(),
194
+ discountCodeId: data.discount_code.id.toString(),
195
+ };
196
+ }
197
+ return null;
198
+ }
199
+ catch {
200
+ return null;
201
+ }
202
+ }
203
+ async findPriceRuleByTitle(brand, title) {
204
+ const config = this.getAdminConfig(brand);
205
+ const url = `${config.baseUrl}/price_rules.json?limit=250`;
206
+ try {
207
+ const response = await fetch(url, {
208
+ method: 'GET',
209
+ headers: this.getHeaders(config),
210
+ });
211
+ if (!response.ok) {
212
+ return null;
213
+ }
214
+ const data = (await response.json());
215
+ const rule = data.price_rules?.find((r) => r.title === title);
216
+ return rule ? rule.id.toString() : null;
217
+ }
218
+ catch {
219
+ return null;
220
+ }
221
+ }
222
+ async findDiscountCodeByCode(brand, priceRuleId, code) {
223
+ const config = this.getAdminConfig(brand);
224
+ const url = `${config.baseUrl}/price_rules/${priceRuleId}/discount_codes.json`;
225
+ try {
226
+ const response = await fetch(url, {
227
+ method: 'GET',
228
+ headers: this.getHeaders(config),
229
+ });
230
+ if (!response.ok) {
231
+ return null;
232
+ }
233
+ const data = (await response.json());
234
+ const dc = data.discount_codes?.find((d) => d.code === code);
235
+ return dc ? dc.id.toString() : null;
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ }
241
+ getAdminConfig(brand) {
242
+ const brandConfig = this.configService.getBrand(brand);
243
+ const adminConfig = brandConfig?.integrations?.commerceAdmin;
244
+ if (!adminConfig) {
245
+ throw new Error(`Shopify Admin API not configured for brand: ${brand}`);
246
+ }
247
+ return {
248
+ baseUrl: `${adminConfig.baseUrl}`,
249
+ apiKey: adminConfig.apiKey,
250
+ webhookSecret: adminConfig.options?.webhookSecret,
251
+ };
252
+ }
253
+ getWebhookSecret(brand) {
254
+ const config = this.getAdminConfig(brand);
255
+ return config.webhookSecret;
256
+ }
257
+ getHeaders(config) {
258
+ return {
259
+ 'Content-Type': 'application/json',
260
+ 'X-Shopify-Access-Token': config.apiKey,
261
+ };
262
+ }
263
+ };
264
+ exports.ShopifyAdminService = ShopifyAdminService;
265
+ exports.ShopifyAdminService = ShopifyAdminService = tslib_1.__decorate([
266
+ (0, common_1.Injectable)(),
267
+ tslib_1.__metadata("design:paramtypes", [config_service_1.ConfigService])
268
+ ], ShopifyAdminService);
269
+ //# sourceMappingURL=shopify-admin.service.js.map