@unchainedshop/plugins 1.2.2 → 1.2.6

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 (286) hide show
  1. package/lib/delivery/pick-mup.d.ts +1 -0
  2. package/lib/delivery/pick-mup.js +98 -0
  3. package/lib/delivery/pick-mup.js.map +1 -0
  4. package/lib/delivery/post.d.ts +1 -0
  5. package/lib/delivery/post.js +23 -0
  6. package/lib/delivery/post.js.map +1 -0
  7. package/lib/delivery/send-message.d.ts +1 -0
  8. package/lib/delivery/send-message.js +41 -0
  9. package/lib/delivery/send-message.js.map +1 -0
  10. package/lib/delivery/stores.d.ts +1 -0
  11. package/lib/delivery/stores.js +39 -0
  12. package/lib/delivery/stores.js.map +1 -0
  13. package/lib/enrollments/licensed.d.ts +1 -0
  14. package/lib/enrollments/licensed.js +40 -0
  15. package/lib/enrollments/licensed.js.map +1 -0
  16. package/lib/events/node-event-emitter.d.ts +1 -0
  17. package/lib/events/node-event-emitter.js +16 -0
  18. package/lib/events/node-event-emitter.js.map +1 -0
  19. package/lib/events/redis.d.ts +1 -0
  20. package/lib/events/redis.js +24 -0
  21. package/lib/events/redis.js.map +1 -0
  22. package/lib/files/gridfs/gridfs-adapter.d.ts +2 -0
  23. package/lib/files/gridfs/gridfs-adapter.js +106 -0
  24. package/lib/files/gridfs/gridfs-adapter.js.map +1 -0
  25. package/lib/files/gridfs/gridfs-webhook.d.ts +2 -0
  26. package/lib/files/gridfs/gridfs-webhook.js +55 -0
  27. package/lib/files/gridfs/gridfs-webhook.js.map +1 -0
  28. package/lib/files/gridfs/index.d.ts +8 -0
  29. package/lib/files/gridfs/index.js +21 -0
  30. package/lib/files/gridfs/index.js.map +1 -0
  31. package/lib/files/gridfs/promisePipe.d.ts +2 -0
  32. package/lib/files/gridfs/promisePipe.js +21 -0
  33. package/lib/files/gridfs/promisePipe.js.map +1 -0
  34. package/lib/files/gridfs/sign.d.ts +2 -0
  35. package/lib/files/gridfs/sign.js +12 -0
  36. package/lib/files/gridfs/sign.js.map +1 -0
  37. package/lib/files/minio/minio-adapter.d.ts +4 -0
  38. package/lib/files/minio/minio-adapter.js +165 -0
  39. package/lib/files/minio/minio-adapter.js.map +1 -0
  40. package/lib/files/minio/minio-webhook.d.ts +2 -0
  41. package/lib/files/minio/minio-webhook.js +47 -0
  42. package/lib/files/minio/minio-webhook.js.map +1 -0
  43. package/lib/filters/local-search.d.ts +3 -0
  44. package/lib/filters/local-search.js +84 -0
  45. package/lib/filters/local-search.js.map +1 -0
  46. package/lib/filters/strict-equal.d.ts +1 -0
  47. package/lib/filters/strict-equal.js +25 -0
  48. package/lib/filters/strict-equal.js.map +1 -0
  49. package/lib/payment/apple-iap/adapter.d.ts +2 -0
  50. package/lib/payment/apple-iap/adapter.js +286 -0
  51. package/lib/payment/apple-iap/adapter.js.map +1 -0
  52. package/lib/payment/apple-iap/db/AppleTransactionsCollection.d.ts +7 -0
  53. package/lib/payment/apple-iap/db/AppleTransactionsCollection.js +5 -0
  54. package/lib/payment/apple-iap/db/AppleTransactionsCollection.js.map +1 -0
  55. package/lib/payment/apple-iap/index.d.ts +3 -0
  56. package/lib/payment/apple-iap/index.js +4 -0
  57. package/lib/payment/apple-iap/index.js.map +1 -0
  58. package/lib/payment/apple-iap/module/configureAppleTransactionsModule.d.ts +9 -0
  59. package/lib/payment/apple-iap/module/configureAppleTransactionsModule.js +18 -0
  60. package/lib/payment/apple-iap/module/configureAppleTransactionsModule.js.map +1 -0
  61. package/lib/payment/bity/adapter.d.ts +2 -0
  62. package/lib/payment/bity/adapter.js +318 -0
  63. package/lib/payment/bity/adapter.js.map +1 -0
  64. package/lib/payment/bity/db/BityCredentialsCollection.d.ts +11 -0
  65. package/lib/payment/bity/db/BityCredentialsCollection.js +5 -0
  66. package/lib/payment/bity/db/BityCredentialsCollection.js.map +1 -0
  67. package/lib/payment/bity/index.d.ts +3 -0
  68. package/lib/payment/bity/index.js +4 -0
  69. package/lib/payment/bity/index.js.map +1 -0
  70. package/lib/payment/bity/module/configureBityModule.d.ts +11 -0
  71. package/lib/payment/bity/module/configureBityModule.js +33 -0
  72. package/lib/payment/bity/module/configureBityModule.js.map +1 -0
  73. package/lib/payment/braintree.d.ts +1 -0
  74. package/lib/payment/braintree.js +129 -0
  75. package/lib/payment/braintree.js.map +1 -0
  76. package/lib/payment/cryptopay.d.ts +2 -0
  77. package/lib/payment/cryptopay.js +161 -0
  78. package/lib/payment/cryptopay.js.map +1 -0
  79. package/lib/payment/datatrans-v2/api/authorize.d.ts +2 -0
  80. package/lib/payment/datatrans-v2/api/authorize.js +12 -0
  81. package/lib/payment/datatrans-v2/api/authorize.js.map +1 -0
  82. package/lib/payment/datatrans-v2/api/authorizeAuthenticated.d.ts +2 -0
  83. package/lib/payment/datatrans-v2/api/authorizeAuthenticated.js +11 -0
  84. package/lib/payment/datatrans-v2/api/authorizeAuthenticated.js.map +1 -0
  85. package/lib/payment/datatrans-v2/api/cancel.d.ts +2 -0
  86. package/lib/payment/datatrans-v2/api/cancel.js +10 -0
  87. package/lib/payment/datatrans-v2/api/cancel.js.map +1 -0
  88. package/lib/payment/datatrans-v2/api/index.d.ts +19 -0
  89. package/lib/payment/datatrans-v2/api/index.js +24 -0
  90. package/lib/payment/datatrans-v2/api/index.js.map +1 -0
  91. package/lib/payment/datatrans-v2/api/init.d.ts +2 -0
  92. package/lib/payment/datatrans-v2/api/init.js +31 -0
  93. package/lib/payment/datatrans-v2/api/init.js.map +1 -0
  94. package/lib/payment/datatrans-v2/api/makeFetcher.d.ts +2 -0
  95. package/lib/payment/datatrans-v2/api/makeFetcher.js +41 -0
  96. package/lib/payment/datatrans-v2/api/makeFetcher.js.map +1 -0
  97. package/lib/payment/datatrans-v2/api/secureFields.d.ts +2 -0
  98. package/lib/payment/datatrans-v2/api/secureFields.js +14 -0
  99. package/lib/payment/datatrans-v2/api/secureFields.js.map +1 -0
  100. package/lib/payment/datatrans-v2/api/settle.d.ts +2 -0
  101. package/lib/payment/datatrans-v2/api/settle.js +10 -0
  102. package/lib/payment/datatrans-v2/api/settle.js.map +1 -0
  103. package/lib/payment/datatrans-v2/api/status.d.ts +2 -0
  104. package/lib/payment/datatrans-v2/api/status.js +7 -0
  105. package/lib/payment/datatrans-v2/api/status.js.map +1 -0
  106. package/lib/payment/datatrans-v2/api/validate.d.ts +2 -0
  107. package/lib/payment/datatrans-v2/api/validate.js +10 -0
  108. package/lib/payment/datatrans-v2/api/validate.js.map +1 -0
  109. package/lib/payment/datatrans-v2/generateSignature.d.ts +10 -0
  110. package/lib/payment/datatrans-v2/generateSignature.js +19 -0
  111. package/lib/payment/datatrans-v2/generateSignature.js.map +1 -0
  112. package/lib/payment/datatrans-v2/getPaths.d.ts +9 -0
  113. package/lib/payment/datatrans-v2/getPaths.js +9 -0
  114. package/lib/payment/datatrans-v2/getPaths.js.map +1 -0
  115. package/lib/payment/datatrans-v2/index.d.ts +2 -0
  116. package/lib/payment/datatrans-v2/index.js +385 -0
  117. package/lib/payment/datatrans-v2/index.js.map +1 -0
  118. package/lib/payment/datatrans-v2/middleware.d.ts +2 -0
  119. package/lib/payment/datatrans-v2/middleware.js +113 -0
  120. package/lib/payment/datatrans-v2/middleware.js.map +1 -0
  121. package/lib/payment/datatrans-v2/parseRegistrationData.d.ts +11 -0
  122. package/lib/payment/datatrans-v2/parseRegistrationData.js +26 -0
  123. package/lib/payment/datatrans-v2/parseRegistrationData.js.map +1 -0
  124. package/lib/payment/datatrans-v2/roundedAmountFromOrder.d.ts +7 -0
  125. package/lib/payment/datatrans-v2/roundedAmountFromOrder.js +10 -0
  126. package/lib/payment/datatrans-v2/roundedAmountFromOrder.js.map +1 -0
  127. package/lib/payment/datatrans-v2/splitProperties.d.ts +8 -0
  128. package/lib/payment/datatrans-v2/splitProperties.js +58 -0
  129. package/lib/payment/datatrans-v2/splitProperties.js.map +1 -0
  130. package/lib/payment/invoice-prepaid.d.ts +1 -0
  131. package/lib/payment/invoice-prepaid.js +30 -0
  132. package/lib/payment/invoice-prepaid.js.map +1 -0
  133. package/lib/payment/invoice.d.ts +1 -0
  134. package/lib/payment/invoice.js +27 -0
  135. package/lib/payment/invoice.js.map +1 -0
  136. package/lib/payment/paypal-checkout.d.ts +1 -0
  137. package/lib/payment/paypal-checkout.js +82 -0
  138. package/lib/payment/paypal-checkout.js.map +1 -0
  139. package/lib/payment/postfinance-checkout/api.d.ts +11 -0
  140. package/lib/payment/postfinance-checkout/api.js +109 -0
  141. package/lib/payment/postfinance-checkout/api.js.map +1 -0
  142. package/lib/payment/postfinance-checkout/index.d.ts +2 -0
  143. package/lib/payment/postfinance-checkout/index.js +187 -0
  144. package/lib/payment/postfinance-checkout/index.js.map +1 -0
  145. package/lib/payment/postfinance-checkout/middleware.d.ts +2 -0
  146. package/lib/payment/postfinance-checkout/middleware.js +44 -0
  147. package/lib/payment/postfinance-checkout/middleware.js.map +1 -0
  148. package/lib/payment/postfinance-checkout/types.d.ts +23 -0
  149. package/lib/payment/postfinance-checkout/types.js +12 -0
  150. package/lib/payment/postfinance-checkout/types.js.map +1 -0
  151. package/lib/payment/postfinance-checkout/utils.d.ts +4 -0
  152. package/lib/payment/postfinance-checkout/utils.js +20 -0
  153. package/lib/payment/postfinance-checkout/utils.js.map +1 -0
  154. package/lib/payment/stripe.d.ts +2 -0
  155. package/lib/payment/stripe.js +217 -0
  156. package/lib/payment/stripe.js.map +1 -0
  157. package/lib/payment/worldline-saferpay/index.d.ts +1 -0
  158. package/lib/payment/worldline-saferpay/index.js +112 -0
  159. package/lib/payment/worldline-saferpay/index.js.map +1 -0
  160. package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayClient.d.ts +14 -0
  161. package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayClient.js +29 -0
  162. package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayClient.js.map +1 -0
  163. package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.d.ts +9 -0
  164. package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.js +28 -0
  165. package/lib/payment/worldline-saferpay/worldline-saferpay-client/api/SaferpayConnection.js.map +1 -0
  166. package/lib/payment/worldline-saferpay/worldline-saferpay-client/index.d.ts +4 -0
  167. package/lib/payment/worldline-saferpay/worldline-saferpay-client/index.js +2 -0
  168. package/lib/payment/worldline-saferpay/worldline-saferpay-client/index.js.map +1 -0
  169. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentMethods.d.ts +1 -0
  170. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentMethods.js +2 -0
  171. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentMethods.js.map +1 -0
  172. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentPageAssert.d.ts +73 -0
  173. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentPageAssert.js +2 -0
  174. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentPageAssert.js.map +1 -0
  175. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentPageInitialize.d.ts +53 -0
  176. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentPageInitialize.js +2 -0
  177. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/PaymentPageInitialize.js.map +1 -0
  178. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Request.d.ts +13 -0
  179. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Request.js +2 -0
  180. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Request.js.map +1 -0
  181. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Response.d.ts +9 -0
  182. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Response.js +2 -0
  183. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Response.js.map +1 -0
  184. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Transaction.d.ts +5 -0
  185. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Transaction.js +2 -0
  186. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/Transaction.js.map +1 -0
  187. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/TransactionCancel.d.ts +13 -0
  188. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/TransactionCancel.js +2 -0
  189. package/lib/payment/worldline-saferpay/worldline-saferpay-client/models/TransactionCancel.js.map +1 -0
  190. package/lib/pricing/delivery-swiss-tax.d.ts +15 -0
  191. package/lib/pricing/delivery-swiss-tax.js +98 -0
  192. package/lib/pricing/delivery-swiss-tax.js.map +1 -0
  193. package/lib/pricing/discount-100-off.d.ts +1 -0
  194. package/lib/pricing/discount-100-off.js +34 -0
  195. package/lib/pricing/discount-100-off.js.map +1 -0
  196. package/lib/pricing/discount-half-price-manual.d.ts +1 -0
  197. package/lib/pricing/discount-half-price-manual.js +34 -0
  198. package/lib/pricing/discount-half-price-manual.js.map +1 -0
  199. package/lib/pricing/discount-half-price.d.ts +1 -0
  200. package/lib/pricing/discount-half-price.js +37 -0
  201. package/lib/pricing/discount-half-price.js.map +1 -0
  202. package/lib/pricing/free-delivery.d.ts +2 -0
  203. package/lib/pricing/free-delivery.js +26 -0
  204. package/lib/pricing/free-delivery.js.map +1 -0
  205. package/lib/pricing/free-payment.d.ts +2 -0
  206. package/lib/pricing/free-payment.js +26 -0
  207. package/lib/pricing/free-payment.js.map +1 -0
  208. package/lib/pricing/order-delivery.d.ts +1 -0
  209. package/lib/pricing/order-delivery.js +33 -0
  210. package/lib/pricing/order-delivery.js.map +1 -0
  211. package/lib/pricing/order-discount.d.ts +1 -0
  212. package/lib/pricing/order-discount.js +110 -0
  213. package/lib/pricing/order-discount.js.map +1 -0
  214. package/lib/pricing/order-items-discount.d.ts +1 -0
  215. package/lib/pricing/order-items-discount.js +88 -0
  216. package/lib/pricing/order-items-discount.js.map +1 -0
  217. package/lib/pricing/order-items.d.ts +1 -0
  218. package/lib/pricing/order-items.js +44 -0
  219. package/lib/pricing/order-items.js.map +1 -0
  220. package/lib/pricing/order-payment.d.ts +1 -0
  221. package/lib/pricing/order-payment.js +33 -0
  222. package/lib/pricing/order-payment.js.map +1 -0
  223. package/lib/pricing/product-catalog-price.d.ts +1 -0
  224. package/lib/pricing/product-catalog-price.js +37 -0
  225. package/lib/pricing/product-catalog-price.js.map +1 -0
  226. package/lib/pricing/product-discount.d.ts +1 -0
  227. package/lib/pricing/product-discount.js +55 -0
  228. package/lib/pricing/product-discount.js.map +1 -0
  229. package/lib/pricing/product-price-ECB-interbank-exchange.d.ts +1 -0
  230. package/lib/pricing/product-price-ECB-interbank-exchange.js +90 -0
  231. package/lib/pricing/product-price-ECB-interbank-exchange.js.map +1 -0
  232. package/lib/pricing/product-price-coinbase-exchange.d.ts +1 -0
  233. package/lib/pricing/product-price-coinbase-exchange.js +60 -0
  234. package/lib/pricing/product-price-coinbase-exchange.js.map +1 -0
  235. package/lib/pricing/product-price-cryptopay.d.ts +2 -0
  236. package/lib/pricing/product-price-cryptopay.js +23 -0
  237. package/lib/pricing/product-price-cryptopay.js.map +1 -0
  238. package/lib/pricing/product-price-rateconversion.d.ts +1 -0
  239. package/lib/pricing/product-price-rateconversion.js +51 -0
  240. package/lib/pricing/product-price-rateconversion.js.map +1 -0
  241. package/lib/pricing/product-price-round.d.ts +11 -0
  242. package/lib/pricing/product-price-round.js +54 -0
  243. package/lib/pricing/product-price-round.js.map +1 -0
  244. package/lib/pricing/product-swiss-tax.d.ts +13 -0
  245. package/lib/pricing/product-swiss-tax.js +102 -0
  246. package/lib/pricing/product-swiss-tax.js.map +1 -0
  247. package/lib/pricing/utils/cache.d.ts +9 -0
  248. package/lib/pricing/utils/cache.js +28 -0
  249. package/lib/pricing/utils/cache.js.map +1 -0
  250. package/lib/quotations/manual.d.ts +1 -0
  251. package/lib/quotations/manual.js +21 -0
  252. package/lib/quotations/manual.js.map +1 -0
  253. package/lib/warehousing/google-sheets.d.ts +1 -0
  254. package/lib/warehousing/google-sheets.js +153 -0
  255. package/lib/warehousing/google-sheets.js.map +1 -0
  256. package/lib/warehousing/store.d.ts +1 -0
  257. package/lib/warehousing/store.js +33 -0
  258. package/lib/warehousing/store.js.map +1 -0
  259. package/lib/worker/BulkImportWorker.d.ts +2 -0
  260. package/lib/worker/BulkImportWorker.js +91 -0
  261. package/lib/worker/BulkImportWorker.js.map +1 -0
  262. package/lib/worker/GenerateOrderWorker.d.ts +1 -0
  263. package/lib/worker/GenerateOrderWorker.js +110 -0
  264. package/lib/worker/GenerateOrderWorker.js.map +1 -0
  265. package/lib/worker/MessageWorker.d.ts +10 -0
  266. package/lib/worker/MessageWorker.js +45 -0
  267. package/lib/worker/MessageWorker.js.map +1 -0
  268. package/lib/worker/ZombieKillerWorker.d.ts +7 -0
  269. package/lib/worker/ZombieKillerWorker.js +88 -0
  270. package/lib/worker/ZombieKillerWorker.js.map +1 -0
  271. package/lib/worker/email.d.ts +1 -0
  272. package/lib/worker/email.js +97 -0
  273. package/lib/worker/email.js.map +1 -0
  274. package/lib/worker/external.d.ts +2 -0
  275. package/lib/worker/external.js +13 -0
  276. package/lib/worker/external.js.map +1 -0
  277. package/lib/worker/heartbeat.d.ts +1 -0
  278. package/lib/worker/heartbeat.js +32 -0
  279. package/lib/worker/heartbeat.js.map +1 -0
  280. package/lib/worker/http-request.d.ts +8 -0
  281. package/lib/worker/http-request.js +61 -0
  282. package/lib/worker/http-request.js.map +1 -0
  283. package/lib/worker/sms.d.ts +1 -0
  284. package/lib/worker/sms.js +69 -0
  285. package/lib/worker/sms.js.map +1 -0
  286. package/package.json +3 -2
@@ -0,0 +1,165 @@
1
+ import { FileAdapter, FileDirector, buildHashedFilename } from '@unchainedshop/file-upload';
2
+ import https from 'https';
3
+ import http from 'http';
4
+ import { log, LogLevel } from '@unchainedshop/logger';
5
+ import mimeType from 'mime-types';
6
+ import Minio from 'minio';
7
+ import { Readable } from 'stream';
8
+ import { URL } from 'url';
9
+ const { MINIO_ACCESS_KEY, MINIO_REGION, MINIO_SECRET_KEY, MINIO_ENDPOINT, MINIO_BUCKET_NAME, NODE_ENV, AMAZON_S3_SESSION_TOKEN, } = process.env;
10
+ const PUT_URL_EXPIRY = 24 * 60 * 60;
11
+ let client;
12
+ export async function connectToMinio(credentialsProvider) {
13
+ if (!MINIO_ENDPOINT || !MINIO_BUCKET_NAME) {
14
+ log('Please configure Minio/S3 by providing MINIO_ENDPOINT & MINIO_BUCKET_NAME to use upload features', { level: LogLevel.Error });
15
+ return null;
16
+ }
17
+ try {
18
+ const resolvedUrl = new URL(MINIO_ENDPOINT);
19
+ const minioClient = new Minio.Client({
20
+ endPoint: resolvedUrl.hostname,
21
+ useSSL: resolvedUrl.protocol === 'https:',
22
+ port: parseInt(resolvedUrl.port, 10) || undefined,
23
+ region: MINIO_REGION,
24
+ sessionToken: AMAZON_S3_SESSION_TOKEN,
25
+ accessKey: MINIO_ACCESS_KEY,
26
+ secretKey: MINIO_SECRET_KEY,
27
+ });
28
+ if (NODE_ENV === 'development')
29
+ minioClient?.traceOn(process.stdout);
30
+ if (credentialsProvider) {
31
+ await minioClient.setCredentialsProvider(credentialsProvider);
32
+ }
33
+ client = minioClient;
34
+ }
35
+ catch (error) {
36
+ log(`Exception while creating Minio client: ${error.message}`, {
37
+ level: LogLevel.Error,
38
+ });
39
+ }
40
+ return null;
41
+ }
42
+ const generateMinioUrl = (directoryName, hashedFilename) => {
43
+ return `${MINIO_ENDPOINT}/${MINIO_BUCKET_NAME}/${directoryName}/${hashedFilename}`;
44
+ };
45
+ const getMimeType = (extension) => {
46
+ return mimeType.lookup(extension);
47
+ };
48
+ connectToMinio().then((c) => {
49
+ client = c;
50
+ });
51
+ const createDownloadStream = (fileUrl, headers) => {
52
+ const { href, protocol } = new URL(fileUrl);
53
+ return new Promise((resolve, reject) => {
54
+ try {
55
+ if (protocol === 'http:') {
56
+ http.get(href, { headers }, resolve);
57
+ }
58
+ else {
59
+ https.get(href, { headers }, resolve);
60
+ }
61
+ }
62
+ catch (e) {
63
+ reject(e);
64
+ }
65
+ });
66
+ };
67
+ const getObjectStats = async (fileName) => {
68
+ if (!client)
69
+ throw new Error('Minio not connected, check env variables');
70
+ return client.statObject(MINIO_BUCKET_NAME, fileName);
71
+ };
72
+ const bufferToStream = (buffer) => {
73
+ const stream = new Readable();
74
+ stream.push(buffer);
75
+ stream.push(null);
76
+ return stream;
77
+ };
78
+ const getExpiryDate = () => new Date(new Date().getTime() + PUT_URL_EXPIRY);
79
+ export const MinioAdapter = {
80
+ key: 'shop.unchained.file-upload-plugin.minio',
81
+ label: 'Uploads files into an S3 bucket using minio',
82
+ version: '1.0',
83
+ ...FileAdapter,
84
+ async createSignedURL(directoryName, fileName) {
85
+ if (!client)
86
+ throw new Error('Minio not connected, check env variables');
87
+ const expiryDate = getExpiryDate();
88
+ const _id = buildHashedFilename(directoryName, fileName, expiryDate);
89
+ const url = await client.presignedPutObject(MINIO_BUCKET_NAME, `${directoryName}/${_id}`, PUT_URL_EXPIRY);
90
+ return {
91
+ _id,
92
+ directoryName,
93
+ expiryDate,
94
+ fileName,
95
+ type: getMimeType(fileName),
96
+ putURL: url,
97
+ url: generateMinioUrl(directoryName, _id),
98
+ };
99
+ },
100
+ async removeFiles(files) {
101
+ if (!client)
102
+ throw new Error('Minio not connected, check env variables');
103
+ const fileIds = files.map(({ path, _id }) => {
104
+ return `${path}/${_id}`;
105
+ });
106
+ await client.removeObjects(MINIO_BUCKET_NAME, fileIds);
107
+ },
108
+ async uploadFileFromStream(directoryName, rawFile) {
109
+ if (!client)
110
+ throw new Error('Minio not connected, check env variables');
111
+ let stream;
112
+ let fileName;
113
+ if (rawFile instanceof Promise) {
114
+ const { filename: fname, createReadStream } = await rawFile;
115
+ fileName = fname;
116
+ stream = createReadStream();
117
+ }
118
+ else {
119
+ fileName = rawFile.filename;
120
+ stream = bufferToStream(Buffer.from(rawFile.buffer, 'base64'));
121
+ }
122
+ const _id = buildHashedFilename(directoryName, fileName, new Date());
123
+ const type = rawFile?.mimetype || getMimeType(fileName);
124
+ const metaData = {
125
+ 'Content-Type': type,
126
+ };
127
+ await client.putObject(MINIO_BUCKET_NAME, `${directoryName}/${_id}`, stream, undefined, metaData);
128
+ const { size } = await getObjectStats(`${directoryName}/${_id}`);
129
+ return {
130
+ _id,
131
+ directoryName,
132
+ expiryDate: null,
133
+ fileName,
134
+ size,
135
+ type,
136
+ url: generateMinioUrl(directoryName, _id),
137
+ };
138
+ },
139
+ async uploadFileFromURL(directoryName, { fileLink, fileName: fname, headers }) {
140
+ if (!client)
141
+ throw new Error('Minio not connected, check env variables');
142
+ const { href } = new URL(fileLink);
143
+ const fileName = fname || href.split('/').pop();
144
+ const _id = buildHashedFilename(directoryName, fileName, new Date());
145
+ const stream = await createDownloadStream(fileLink, headers);
146
+ const type = stream?.headers?.['content-type'] || getMimeType(fileName);
147
+ const metaData = {
148
+ 'Content-Type': type,
149
+ };
150
+ await client.putObject(MINIO_BUCKET_NAME, `${directoryName}/${_id}`, stream, undefined, metaData);
151
+ const { size } = await getObjectStats(`${directoryName}/${_id}`);
152
+ return {
153
+ _id,
154
+ directoryName,
155
+ expiryDate: null,
156
+ fileName,
157
+ size,
158
+ type,
159
+ url: generateMinioUrl(directoryName, _id),
160
+ };
161
+ },
162
+ };
163
+ FileDirector.registerAdapter(MinioAdapter);
164
+ export default MinioAdapter;
165
+ //# sourceMappingURL=minio-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minio-adapter.js","sourceRoot":"","sources":["../../../src/files/minio/minio-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare function _default(app: any): void;
2
+ export default _default;
@@ -0,0 +1,47 @@
1
+ import { useMiddlewareWithCurrentContext } from '@unchainedshop/api';
2
+ import { log, LogLevel } from '@unchainedshop/logger';
3
+ import bodyParser from 'body-parser';
4
+ const { MINIO_WEBHOOK_AUTH_TOKEN } = process.env;
5
+ const isAuthorized = ({ authorization = '' }) => {
6
+ const [type, token] = authorization.split(' ');
7
+ return type === 'Bearer' && token === MINIO_WEBHOOK_AUTH_TOKEN;
8
+ };
9
+ export default (app) => {
10
+ useMiddlewareWithCurrentContext(app, '/minio/', bodyParser.json({
11
+ strict: false,
12
+ }));
13
+ useMiddlewareWithCurrentContext(app, '/minio/', async (req, res) => {
14
+ try {
15
+ if (req.method === 'POST' && req.body) {
16
+ const { headers } = req;
17
+ const { Records = [], EventName } = req.body;
18
+ if (EventName === 's3:ObjectCreated:Put' && isAuthorized(headers)) {
19
+ const [{ s3 }] = Records;
20
+ const { object } = s3;
21
+ const { size, contentType: type } = object;
22
+ const [fileId] = object.key.split('.');
23
+ const { services } = req.unchainedContext;
24
+ await services.files.linkFile({ fileId, type, size }, req.unchainedContext);
25
+ res.writeHead(200);
26
+ res.end();
27
+ return;
28
+ }
29
+ }
30
+ res.writeHead(404);
31
+ res.end();
32
+ return;
33
+ }
34
+ catch (e) {
35
+ log(e.message, { level: LogLevel.Error });
36
+ res.writeHead(503);
37
+ res.end(JSON.stringify(e));
38
+ }
39
+ });
40
+ };
41
+ /*
42
+
43
+ curl -X PUT -T /Users/pozylon/Desktop/Bildschirmfoto\ 2022-02-17\ um\ 16.47.22.png http://localhost:4010/gridfs/3e0cd78ac07f0028890ce36c391057dd0c5fb46f4c147fb73e54bd8a7ffee389/user-avatars/avatar.png?e=1645883865878&s=e7466b30039593e5790e23cab92878e0144289c3710344a55b78c9a916e2f78c
44
+ curl -X PUT -T /Users/pozylon/Desktop/Bildschirmfoto\ 2022-02-17\ um\ 16.47.22.png https://minio.dev.shared.ucc.dev/unchained-test-bucket/user-avatars/9aedd551499b2850e9483b07cd4c8cff7ad1d710f49933c183861bf40183bc5a?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=unchained-test%2F20220225%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220225T140957Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=22807026db1210370170cd5cf49bfbb9e86010425c9d1834a56e049faf39b368
45
+
46
+ */
47
+ //# sourceMappingURL=minio-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minio-webhook.js","sourceRoot":"","sources":["../../../src/files/minio/minio-webhook.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAEjD,MAAM,YAAY,GAAG,CAAC,EAAE,aAAa,GAAG,EAAE,EAAE,EAAE,EAAE;IAC9C,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,wBAAwB,CAAC;AACjE,CAAC,CAAC;AAEF,eAAe,CAAC,GAAG,EAAE,EAAE;IACrB,+BAA+B,CAC7B,GAAG,EACH,SAAS,EACT,UAAU,CAAC,IAAI,CAAC;QACd,MAAM,EAAE,KAAK;KACd,CAAC,CACH,CAAC;IAEF,+BAA+B,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjE,IAAI;YACF,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE;gBACrC,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;gBACxB,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;gBAC7C,IAAI,SAAS,KAAK,sBAAsB,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE;oBACjE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC;oBACzB,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;oBACtB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACvC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,gBAAgB,CAAC;oBAC1C,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC5E,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;iBACR;aACF;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;SACR;QAAC,OAAO,CAAC,EAAE;YACV,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5B;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;EAKE"}
@@ -0,0 +1,3 @@
1
+ import { IFilterAdapter } from '@unchainedshop/types/filters';
2
+ declare const LocalSearch: IFilterAdapter;
3
+ export default LocalSearch;
@@ -0,0 +1,84 @@
1
+ import { FilterDirector, FilterAdapter } from '@unchainedshop/core-filters';
2
+ const { AMAZON_DOCUMENTDB_COMPAT_MODE } = process.env;
3
+ const LocalSearch = {
4
+ ...FilterAdapter,
5
+ key: 'shop.unchained.filters.local-search',
6
+ label: 'Simple Fulltext search with MongoDB',
7
+ version: '0.1',
8
+ orderIndex: 1,
9
+ actions: (params) => {
10
+ return {
11
+ ...FilterAdapter.actions(params),
12
+ searchProducts: async ({ productIds }) => {
13
+ // Search Products
14
+ const { queryString } = params.searchQuery;
15
+ if (!queryString)
16
+ return productIds;
17
+ const selector = AMAZON_DOCUMENTDB_COMPAT_MODE
18
+ ? {
19
+ $or: [
20
+ { title: { $regex: `${queryString}`, $options: 'im' } },
21
+ { subtitle: { $regex: `${queryString}`, $options: 'im' } },
22
+ { vendor: { $regex: `${queryString}`, $options: 'im' } },
23
+ { brand: { $regex: `${queryString}`, $options: 'im' } },
24
+ { description: { $regex: `${queryString}`, $options: 'im' } },
25
+ { labels: { $regex: `${queryString}`, $options: 'im' } },
26
+ ],
27
+ }
28
+ : {
29
+ $text: { $search: queryString },
30
+ };
31
+ if (productIds) {
32
+ selector.productId = { $in: [...new Set(productIds)] };
33
+ }
34
+ const products = await params.modules.products.texts.findTexts(selector, {
35
+ projection: {
36
+ productId: 1,
37
+ },
38
+ });
39
+ return products.map(({ productId }) => productId);
40
+ },
41
+ // eslint-disable-next-line
42
+ searchAssortments: async ({ assortmentIds }) => {
43
+ const { queryString } = params.searchQuery;
44
+ if (!queryString) {
45
+ return assortmentIds;
46
+ }
47
+ const selector = {
48
+ $text: { $search: queryString },
49
+ };
50
+ if (assortmentIds) {
51
+ selector.assortmentId = { $in: assortmentIds };
52
+ }
53
+ const assortments = await params.modules.assortments.texts.findTexts(selector, {
54
+ projection: {
55
+ assortmentId: 1,
56
+ },
57
+ });
58
+ return assortments.map(({ assortmentId }) => assortmentId);
59
+ },
60
+ async transformFilterSelector(last) {
61
+ const { query = {} } = params.searchQuery;
62
+ const { queryString, filterIds, includeInactive } = query;
63
+ if (queryString && !filterIds) {
64
+ // Global search without assortment scope:
65
+ // Return all filters
66
+ const selector = { ...last };
67
+ if (selector?.key) {
68
+ // Do not restrict to keys
69
+ delete selector.key;
70
+ }
71
+ if (!includeInactive) {
72
+ // Include only active filters
73
+ selector.isActive = true;
74
+ }
75
+ return selector;
76
+ }
77
+ return last;
78
+ },
79
+ };
80
+ },
81
+ };
82
+ export default LocalSearch;
83
+ FilterDirector.registerAdapter(LocalSearch);
84
+ //# sourceMappingURL=local-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-search.js","sourceRoot":"","sources":["../../src/filters/local-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { FilterDirector, FilterAdapter } from '@unchainedshop/core-filters';
2
+ const StrictQualFilter = {
3
+ ...FilterAdapter,
4
+ key: 'shop.unchained.filters.strict-qual',
5
+ label: 'Simple Strict Equal DB Filter',
6
+ version: '0.1',
7
+ orderIndex: 0,
8
+ actions: (params) => {
9
+ return {
10
+ ...FilterAdapter.actions(params),
11
+ transformProductSelector: async (lastSelector, options) => {
12
+ const { key, value } = options || {};
13
+ if (key) {
14
+ return {
15
+ ...lastSelector,
16
+ [key]: value !== undefined ? value : { $exists: true },
17
+ };
18
+ }
19
+ return lastSelector;
20
+ },
21
+ };
22
+ },
23
+ };
24
+ FilterDirector.registerAdapter(StrictQualFilter);
25
+ //# sourceMappingURL=strict-equal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-equal.js","sourceRoot":"","sources":["../../src/filters/strict-equal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5E,MAAM,gBAAgB,GAAmB;IACvC,GAAG,aAAa;IAEhB,GAAG,EAAE,oCAAoC;IACzC,KAAK,EAAE,+BAA+B;IACtC,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,CAAC;IAEb,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;QAClB,OAAO;YACL,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAEhC,wBAAwB,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE;gBACxD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;gBAErC,IAAI,GAAG,EAAE;oBACP,OAAO;wBACL,GAAG,YAAY;wBACf,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;qBACvD,CAAC;iBACH;gBACD,OAAO,YAAY,CAAC;YACtB,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,cAAc,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: (app: any) => void;
2
+ export default _default;
@@ -0,0 +1,286 @@
1
+ import bodyParser from 'body-parser';
2
+ import fetch from 'isomorphic-unfetch';
3
+ import { useMiddlewareWithCurrentContext } from '@unchainedshop/api';
4
+ import { EnrollmentStatus } from '@unchainedshop/core-enrollments';
5
+ import { PaymentAdapter, PaymentDirector, PaymentError } from '@unchainedshop/core-payment';
6
+ import { createLogger } from '@unchainedshop/logger';
7
+ const logger = createLogger('unchained:core-payment:iap');
8
+ const { APPLE_IAP_SHARED_SECRET, APPLE_IAP_ENVIRONMENT = 'sandbox', APPLE_IAP_WEBHOOK_PATH = '/payment/apple-iap', } = process.env;
9
+ // https://developer.apple.com/documentation/storekit/in-app_purchase/validating_receipts_with_the_app_store
10
+ const environments = {
11
+ sandbox: 'https://sandbox.itunes.apple.com/verifyReceipt',
12
+ production: 'https://buy.itunes.apple.com/verifyReceipt',
13
+ };
14
+ const verifyReceipt = async ({ receiptData, password }) => {
15
+ const payload = {
16
+ 'receipt-data': receiptData,
17
+ };
18
+ if (password) {
19
+ payload.password = password;
20
+ }
21
+ const result = await fetch(environments[APPLE_IAP_ENVIRONMENT], {
22
+ body: JSON.stringify(payload),
23
+ method: 'POST',
24
+ headers: {
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ });
28
+ return result.json();
29
+ };
30
+ const AppleNotificationTypes = {
31
+ INITIAL_BUY: 'INITIAL_BUY',
32
+ DID_RECOVER: 'DID_RECOVER',
33
+ DID_CHANGE_RENEWAL_STATUS: 'DID_CHANGE_RENEWAL_STATUS',
34
+ DID_FAIL_TO_RENEW: 'DID_FAIL_TO_RENEW',
35
+ DID_CHANGE_RENEWAL_PREF: 'DID_CHANGE_RENEWAL_PREF',
36
+ };
37
+ const fixPeriods = async ({ transactionId, enrollmentId, orderId, transactions }, requestContext) => {
38
+ const relevantTransactions = transactions.filter(
39
+ // eslint-disable-next-line
40
+ ({ original_transaction_id }) => {
41
+ return original_transaction_id === transactionId; // eslint-disable-line
42
+ });
43
+ const adjustedEnrollmentPeriods = relevantTransactions
44
+ .map((transaction) => {
45
+ return {
46
+ isTrial: transaction.is_trial_period === 'true',
47
+ start: new Date(parseInt(transaction.purchase_date_ms, 10)),
48
+ end: new Date(parseInt(transaction.expires_date_ms, 10)),
49
+ orderId: transaction.transaction_id === transactionId ? orderId : null,
50
+ };
51
+ })
52
+ .sort((left, right) => {
53
+ return left.end.getTime() - right.end.getTime();
54
+ });
55
+ await requestContext.modules.enrollments.removeEnrollmentPeriodByOrderId(enrollmentId, orderId, requestContext.userId);
56
+ return Promise.all(adjustedEnrollmentPeriods.map((period) => requestContext.modules.enrollments.addEnrollmentPeriod(enrollmentId, period, requestContext.userId)));
57
+ };
58
+ export default (app) => {
59
+ useMiddlewareWithCurrentContext(app, APPLE_IAP_WEBHOOK_PATH, bodyParser.json({
60
+ strict: false,
61
+ }));
62
+ useMiddlewareWithCurrentContext(app, APPLE_IAP_WEBHOOK_PATH, async (req, res) => {
63
+ if (req.method === 'POST') {
64
+ try {
65
+ const resolvedContext = req.unchainedContext;
66
+ const { modules, services } = resolvedContext;
67
+ const responseBody = req.body || {};
68
+ if (responseBody.password !== APPLE_IAP_SHARED_SECRET) {
69
+ throw new Error('shared secret not valid');
70
+ }
71
+ const transactions = responseBody?.unified_receipt?.latest_receipt_info; // eslint-disable-line
72
+ const latestTransaction = transactions[0];
73
+ if (responseBody.notification_type === AppleNotificationTypes.INITIAL_BUY) {
74
+ // Find the cart to checkout
75
+ const orderPayment = await modules.orders.payments.findOrderPaymentByContextData({
76
+ context: {
77
+ 'meta.transactionIdentifier': latestTransaction.transaction_id,
78
+ },
79
+ });
80
+ if (!orderPayment)
81
+ throw new Error('Could not find any matching order payment');
82
+ const order = await modules.orders.findOrder({
83
+ orderId: orderPayment.orderId,
84
+ });
85
+ if (modules.orders.isCart(order)) {
86
+ // checkout if is cart, else just ignore because the cart is already checked out
87
+ // through submission of the receipt with GraphQL
88
+ const checkedOut = await modules.orders.checkout(order._id, {
89
+ paymentContext: {
90
+ receiptData: responseBody?.unified_receipt?.latest_receipt, // eslint-disable-line
91
+ },
92
+ }, resolvedContext);
93
+ const orderId = checkedOut._id;
94
+ const enrollment = await modules.enrollments.findEnrollment({
95
+ orderId,
96
+ });
97
+ await fixPeriods({
98
+ transactionId: latestTransaction.original_transaction_id,
99
+ transactions,
100
+ enrollmentId: enrollment._id,
101
+ orderId,
102
+ }, resolvedContext);
103
+ logger.info(`Apple IAP Webhook: Confirmed checkout for order ${checkedOut.orderNumber}`, {
104
+ orderId: checkedOut._id,
105
+ });
106
+ }
107
+ }
108
+ else {
109
+ // Just store payment credentials, use the enrollments paymentProvider reference and
110
+ // let the job do the rest
111
+ const originalOrderPayment = await modules.orders.payments.findOrderPaymentByContextData({
112
+ context: {
113
+ 'meta.transactionIdentifier': latestTransaction.original_transaction_id,
114
+ },
115
+ });
116
+ if (!originalOrderPayment)
117
+ throw new Error('Could not find any matching order payment');
118
+ const originalOrder = await modules.orders.findOrder({
119
+ orderId: originalOrderPayment.orderId,
120
+ });
121
+ const enrollment = await modules.enrollments.findEnrollment({
122
+ orderId: originalOrder._id,
123
+ });
124
+ await services.payment.registerPaymentCredentials(enrollment.payment.paymentProviderId, {
125
+ transactionContext: {
126
+ receiptData: responseBody?.unified_receipt?.latest_receipt, // eslint-disable-line
127
+ },
128
+ }, resolvedContext);
129
+ await fixPeriods({
130
+ transactionId: latestTransaction.original_transaction_id,
131
+ transactions,
132
+ enrollmentId: enrollment._id,
133
+ orderId: originalOrder._id,
134
+ }, resolvedContext);
135
+ logger.info(`Apple IAP Webhook: Processed notification for ${latestTransaction.original_transaction_id} and type ${responseBody.notification_type}`);
136
+ if (responseBody.notification_type === AppleNotificationTypes.DID_RECOVER) {
137
+ if (enrollment.status !== EnrollmentStatus.TERMINATED &&
138
+ responseBody.auto_renew_status === 'false') {
139
+ await modules.enrollments.terminateEnrollment(enrollment, {}, resolvedContext);
140
+ }
141
+ }
142
+ if (responseBody.notification_type === AppleNotificationTypes.DID_CHANGE_RENEWAL_STATUS) {
143
+ if (enrollment.status !== EnrollmentStatus.TERMINATED &&
144
+ responseBody.auto_renew_status === 'false') {
145
+ await modules.enrollments.terminateEnrollment(enrollment, {}, resolvedContext);
146
+ }
147
+ }
148
+ logger.info(`Apple IAP Webhook: Updated enrollment from Apple`);
149
+ }
150
+ res.writeHead(200);
151
+ res.end();
152
+ return;
153
+ }
154
+ catch (e) {
155
+ logger.warn(`Apple IAP Webhook: ${e.message}`, e);
156
+ res.writeHead(503);
157
+ res.end(JSON.stringify(e));
158
+ return;
159
+ }
160
+ }
161
+ res.writeHead(404);
162
+ res.end();
163
+ });
164
+ };
165
+ const AppleIAP = {
166
+ ...PaymentAdapter,
167
+ key: 'shop.unchained.apple-iap',
168
+ label: 'Apple In-App-Purchase',
169
+ version: '1.0',
170
+ initialConfiguration: [],
171
+ typeSupported: (type) => {
172
+ return type === 'GENERIC';
173
+ },
174
+ actions: (params) => {
175
+ const { modules, userId } = params.context;
176
+ const adapterActions = {
177
+ ...PaymentAdapter.actions(params),
178
+ configurationError() {
179
+ // eslint-disable-line
180
+ if (!APPLE_IAP_SHARED_SECRET) {
181
+ return PaymentError.INCOMPLETE_CONFIGURATION;
182
+ }
183
+ return null;
184
+ },
185
+ isActive() {
186
+ if (adapterActions.configurationError() === null)
187
+ return true;
188
+ return false;
189
+ },
190
+ // eslint-disable-next-line
191
+ isPayLaterAllowed() {
192
+ return false;
193
+ },
194
+ // eslint-disable-next-line
195
+ async sign() {
196
+ throw new Error('Apple IAP does not support payment signing');
197
+ },
198
+ // eslint-disable-next-line
199
+ async validate() {
200
+ // once registered receipt transactions are valid by default!
201
+ return true;
202
+ },
203
+ // eslint-disable-next-line
204
+ async register(transactionContext) {
205
+ const { receiptData } = transactionContext;
206
+ const response = await verifyReceipt({
207
+ receiptData,
208
+ password: APPLE_IAP_SHARED_SECRET,
209
+ });
210
+ const { status, latest_receipt_info: latestReceiptInfo } = response; // eslint-disable-line
211
+ if (status === 0) {
212
+ logger.info('Apple IAP Plugin: Receipt validated and updated for the user', {
213
+ level: 'verbose',
214
+ });
215
+ const latestTransaction = latestReceiptInfo[latestReceiptInfo.length - 1]; // eslint-disable-line
216
+ return {
217
+ token: latestTransaction.web_order_line_item_id,
218
+ latestReceiptInfo,
219
+ };
220
+ }
221
+ logger.warn('Apple IAP Plugin: Receipt invalid', {
222
+ level: 'warn',
223
+ status: response.status,
224
+ });
225
+ return null;
226
+ },
227
+ // eslint-disable-next-line
228
+ async charge(transactionContext) {
229
+ const { order } = params.paymentContext;
230
+ const { meta, paymentCredentials, receiptData } = transactionContext || {};
231
+ const { transactionIdentifier } = meta || {};
232
+ const appleTransactions = params.context.modules
233
+ .appleTransactions;
234
+ if (!transactionIdentifier) {
235
+ throw new Error('Apple IAP Plugin: You have to set the transaction id on the order payment');
236
+ }
237
+ const receiptResponse = receiptData &&
238
+ (await verifyReceipt({
239
+ receiptData,
240
+ password: APPLE_IAP_SHARED_SECRET,
241
+ }));
242
+ if (receiptResponse && receiptResponse.status !== 0) {
243
+ throw new Error('Apple IAP Plugin: Receipt invalid');
244
+ }
245
+ const transactions = receiptResponse?.latest_receipt_info || // eslint-disable-line
246
+ paymentCredentials?.meta?.latestReceiptInfo;
247
+ const matchedTransaction = transactions?.find((transaction) => transaction?.transaction_id === transactionIdentifier);
248
+ if (!matchedTransaction) {
249
+ throw new Error(`Apple IAP Plugin: Cannot match transaction with identifier ${transactionIdentifier}`);
250
+ }
251
+ const orderPositions = await modules.orders.positions.findOrderPositions({
252
+ orderId: order._id,
253
+ });
254
+ const items = Object.entries(orderPositions.reduce((acc, item) => {
255
+ return {
256
+ ...acc,
257
+ [item.productId]: (acc[item.productId] || 0) + item.quantity,
258
+ };
259
+ }, {}));
260
+ if (items.length !== 1) {
261
+ throw new Error('Apple IAP Plugin: You can only checkout 1 unique product at once');
262
+ }
263
+ const [[productId, quantity]] = items;
264
+ const isMatchesTransaction = parseInt(matchedTransaction.quantity, 10) === quantity &&
265
+ matchedTransaction.product_id === productId; // eslint-disable-line
266
+ if (!isMatchesTransaction)
267
+ throw new Error('Apple IAP Plugin: Product in order does not match transaction');
268
+ const alreadyProcessedTransaction = await appleTransactions.findTransactionById(transactionIdentifier);
269
+ if (alreadyProcessedTransaction)
270
+ throw new Error('Apple IAP Plugin: Transaction already processed');
271
+ // All good
272
+ await appleTransactions.createTransaction({
273
+ _id: transactionIdentifier,
274
+ matchedTransaction,
275
+ orderId: order._id,
276
+ }, userId);
277
+ return {
278
+ transactionIdentifier,
279
+ };
280
+ },
281
+ };
282
+ return adapterActions;
283
+ },
284
+ };
285
+ PaymentDirector.registerAdapter(AppleIAP);
286
+ //# sourceMappingURL=adapter.js.map