@mohasinac/appkit 2.6.3 → 2.6.5

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 (615) hide show
  1. package/dist/_internal/server/features/account/data.js +2 -2
  2. package/dist/_internal/server/features/bundles/data.d.ts +26 -6
  3. package/dist/_internal/server/features/bundles/data.js +41 -6
  4. package/dist/_internal/server/features/bundles/index.d.ts +3 -2
  5. package/dist/_internal/server/features/bundles/index.js +4 -2
  6. package/dist/_internal/server/features/bundles/metadata.d.ts +20 -0
  7. package/dist/_internal/server/features/bundles/metadata.js +46 -0
  8. package/dist/_internal/server/features/bundles/og.d.ts +38 -0
  9. package/dist/_internal/server/features/bundles/og.js +122 -0
  10. package/dist/_internal/server/features/checkout/actions.js +192 -133
  11. package/dist/_internal/server/features/checkout/bundle-expansion.d.ts +57 -0
  12. package/dist/_internal/server/features/checkout/bundle-expansion.js +70 -0
  13. package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +5 -15
  14. package/dist/_internal/server/features/checkout/prize-bundle-gates.js +5 -21
  15. package/dist/_internal/server/features/media/contextGuards.js +15 -1
  16. package/dist/_internal/server/features/payouts/actions.d.ts +19 -0
  17. package/dist/_internal/server/features/payouts/actions.js +38 -0
  18. package/dist/_internal/server/features/products/data.js +1 -2
  19. package/dist/_internal/server/features/raffle/actions.d.ts +11 -0
  20. package/dist/_internal/server/features/raffle/actions.js +31 -0
  21. package/dist/_internal/server/features/refunds/actions.d.ts +31 -0
  22. package/dist/_internal/server/features/refunds/actions.js +77 -0
  23. package/dist/_internal/server/jobs/core/adminAnalytics.d.ts +28 -0
  24. package/dist/_internal/server/jobs/core/adminAnalytics.js +98 -0
  25. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +19 -0
  26. package/dist/_internal/server/jobs/core/assignSpinPrize.js +81 -0
  27. package/dist/_internal/server/jobs/core/auctionSettlement.d.ts +2 -0
  28. package/dist/_internal/server/jobs/core/auctionSettlement.js +70 -0
  29. package/dist/_internal/server/jobs/core/autoPayoutEligibility.d.ts +2 -0
  30. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +109 -0
  31. package/dist/_internal/server/jobs/core/bundleStockSync.d.ts +10 -0
  32. package/dist/_internal/server/jobs/core/bundleStockSync.js +71 -0
  33. package/dist/_internal/server/jobs/core/cartPrune.d.ts +2 -0
  34. package/dist/_internal/server/jobs/core/cartPrune.js +13 -0
  35. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.d.ts +2 -0
  36. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +45 -0
  37. package/dist/_internal/server/jobs/core/countersReconcile.d.ts +2 -0
  38. package/dist/_internal/server/jobs/core/countersReconcile.js +107 -0
  39. package/dist/_internal/server/jobs/core/couponExpiry.d.ts +2 -0
  40. package/dist/_internal/server/jobs/core/couponExpiry.js +13 -0
  41. package/dist/_internal/server/jobs/core/dailyDataCleanup.d.ts +2 -0
  42. package/dist/_internal/server/jobs/core/dailyDataCleanup.js +20 -0
  43. package/dist/_internal/server/jobs/core/index.d.ts +44 -0
  44. package/dist/_internal/server/jobs/core/index.js +47 -0
  45. package/dist/_internal/server/jobs/core/listingProcessor.d.ts +30 -0
  46. package/dist/_internal/server/jobs/core/listingProcessor.js +138 -0
  47. package/dist/_internal/server/jobs/core/mediaTmpCleanup.d.ts +14 -0
  48. package/dist/_internal/server/jobs/core/mediaTmpCleanup.js +68 -0
  49. package/dist/_internal/server/jobs/core/notificationPrune.d.ts +2 -0
  50. package/dist/_internal/server/jobs/core/notificationPrune.js +13 -0
  51. package/dist/_internal/server/jobs/core/offerExpiry.d.ts +2 -0
  52. package/dist/_internal/server/jobs/core/offerExpiry.js +50 -0
  53. package/dist/_internal/server/jobs/core/onBidPlaced.d.ts +15 -0
  54. package/dist/_internal/server/jobs/core/onBidPlaced.js +59 -0
  55. package/dist/_internal/server/jobs/core/onCategoryWrite.d.ts +14 -0
  56. package/dist/_internal/server/jobs/core/onCategoryWrite.js +134 -0
  57. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +18 -0
  58. package/dist/_internal/server/jobs/core/onOrderCreate.js +78 -0
  59. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +19 -0
  60. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +139 -0
  61. package/dist/_internal/server/jobs/core/onProductStockChange.d.ts +23 -0
  62. package/dist/_internal/server/jobs/core/onProductStockChange.js +130 -0
  63. package/dist/_internal/server/jobs/core/onProductWrite.d.ts +12 -0
  64. package/dist/_internal/server/jobs/core/onProductWrite.js +94 -0
  65. package/dist/_internal/server/jobs/core/onReviewWrite.d.ts +7 -0
  66. package/dist/_internal/server/jobs/core/onReviewWrite.js +49 -0
  67. package/dist/_internal/server/jobs/core/onStoreWrite.d.ts +12 -0
  68. package/dist/_internal/server/jobs/core/onStoreWrite.js +7 -0
  69. package/dist/_internal/server/jobs/core/payoutBatch.d.ts +8 -0
  70. package/dist/_internal/server/jobs/core/payoutBatch.js +102 -0
  71. package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +2 -0
  72. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +27 -0
  73. package/dist/_internal/server/jobs/core/positionsReconcile.d.ts +7 -0
  74. package/dist/_internal/server/jobs/core/positionsReconcile.js +87 -0
  75. package/dist/_internal/server/jobs/core/prizeRevealClose.d.ts +2 -0
  76. package/dist/_internal/server/jobs/core/prizeRevealClose.js +22 -0
  77. package/dist/_internal/server/jobs/core/prizeRevealExpiry.d.ts +2 -0
  78. package/dist/_internal/server/jobs/core/prizeRevealExpiry.js +50 -0
  79. package/dist/_internal/server/jobs/core/prizeRevealOpen.d.ts +2 -0
  80. package/dist/_internal/server/jobs/core/prizeRevealOpen.js +56 -0
  81. package/dist/_internal/server/jobs/core/prizeRevealReminder.d.ts +2 -0
  82. package/dist/_internal/server/jobs/core/prizeRevealReminder.js +38 -0
  83. package/dist/_internal/server/jobs/core/productStatsSync.d.ts +8 -0
  84. package/dist/_internal/server/jobs/core/productStatsSync.js +36 -0
  85. package/dist/_internal/server/jobs/core/promotions.d.ts +12 -0
  86. package/dist/_internal/server/jobs/core/promotions.js +43 -0
  87. package/dist/_internal/server/jobs/core/storeAnalytics.d.ts +30 -0
  88. package/dist/_internal/server/jobs/core/storeAnalytics.js +109 -0
  89. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +19 -0
  90. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +86 -0
  91. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.d.ts +6 -0
  92. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +85 -0
  93. package/dist/_internal/server/jobs/handlers/adminAnalytics.d.ts +2 -26
  94. package/dist/_internal/server/jobs/handlers/adminAnalytics.js +2 -98
  95. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +1 -22
  96. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +2 -86
  97. package/dist/_internal/server/jobs/handlers/auctionSettlement.js +2 -70
  98. package/dist/_internal/server/jobs/handlers/autoPayoutEligibility.js +2 -110
  99. package/dist/_internal/server/jobs/handlers/bundleStockSync.d.ts +0 -16
  100. package/dist/_internal/server/jobs/handlers/bundleStockSync.js +2 -80
  101. package/dist/_internal/server/jobs/handlers/cartPrune.js +2 -13
  102. package/dist/_internal/server/jobs/handlers/cleanupRtdbEvents.js +2 -45
  103. package/dist/_internal/server/jobs/handlers/countersReconcile.js +2 -109
  104. package/dist/_internal/server/jobs/handlers/couponExpiry.js +2 -13
  105. package/dist/_internal/server/jobs/handlers/dailyDataCleanup.js +2 -20
  106. package/dist/_internal/server/jobs/handlers/listingProcessor.d.ts +3 -28
  107. package/dist/_internal/server/jobs/handlers/listingProcessor.js +3 -138
  108. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.d.ts +0 -12
  109. package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.js +2 -69
  110. package/dist/_internal/server/jobs/handlers/notificationPrune.js +2 -13
  111. package/dist/_internal/server/jobs/handlers/offerExpiry.js +2 -50
  112. package/dist/_internal/server/jobs/handlers/onBidPlaced.d.ts +1 -10
  113. package/dist/_internal/server/jobs/handlers/onBidPlaced.js +2 -56
  114. package/dist/_internal/server/jobs/handlers/onCategoryWrite.d.ts +1 -8
  115. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +6 -134
  116. package/dist/_internal/server/jobs/handlers/onOrderCreate.d.ts +1 -12
  117. package/dist/_internal/server/jobs/handlers/onOrderCreate.js +2 -76
  118. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.d.ts +1 -12
  119. package/dist/_internal/server/jobs/handlers/onOrderStatusChange.js +2 -139
  120. package/dist/_internal/server/jobs/handlers/onProductStockChange.d.ts +0 -13
  121. package/dist/_internal/server/jobs/handlers/onProductStockChange.js +7 -134
  122. package/dist/_internal/server/jobs/handlers/onProductWrite.d.ts +1 -6
  123. package/dist/_internal/server/jobs/handlers/onProductWrite.js +6 -106
  124. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +2 -49
  125. package/dist/_internal/server/jobs/handlers/onStoreWrite.d.ts +1 -8
  126. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +7 -8
  127. package/dist/_internal/server/jobs/handlers/payoutBatch.d.ts +0 -9
  128. package/dist/_internal/server/jobs/handlers/payoutBatch.js +2 -104
  129. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.d.ts +0 -6
  130. package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.js +2 -33
  131. package/dist/_internal/server/jobs/handlers/positionsReconcile.d.ts +0 -5
  132. package/dist/_internal/server/jobs/handlers/positionsReconcile.js +2 -87
  133. package/dist/_internal/server/jobs/handlers/prizeRevealClose.d.ts +0 -7
  134. package/dist/_internal/server/jobs/handlers/prizeRevealClose.js +2 -29
  135. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.d.ts +0 -8
  136. package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.js +2 -58
  137. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.d.ts +0 -8
  138. package/dist/_internal/server/jobs/handlers/prizeRevealOpen.js +2 -65
  139. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.d.ts +0 -7
  140. package/dist/_internal/server/jobs/handlers/prizeRevealReminder.js +2 -45
  141. package/dist/_internal/server/jobs/handlers/productStatsSync.d.ts +0 -6
  142. package/dist/_internal/server/jobs/handlers/productStatsSync.js +2 -36
  143. package/dist/_internal/server/jobs/handlers/promotions.d.ts +2 -10
  144. package/dist/_internal/server/jobs/handlers/promotions.js +2 -43
  145. package/dist/_internal/server/jobs/handlers/storeAnalytics.d.ts +2 -28
  146. package/dist/_internal/server/jobs/handlers/storeAnalytics.js +2 -109
  147. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +1 -28
  148. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +2 -94
  149. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.d.ts +0 -6
  150. package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.js +2 -87
  151. package/dist/_internal/server/jobs/index.d.ts +1 -0
  152. package/dist/_internal/server/jobs/index.js +1 -0
  153. package/dist/_internal/server/jobs/runtime/adapters/firebase.js +21 -0
  154. package/dist/_internal/shared/actions/action-registry.d.ts +84 -0
  155. package/dist/_internal/shared/actions/action-registry.js +160 -0
  156. package/dist/_internal/shared/checkout/rules/_defaults.d.ts +3 -0
  157. package/dist/_internal/shared/checkout/rules/_defaults.js +22 -0
  158. package/dist/_internal/shared/checkout/rules/_limits.d.ts +19 -0
  159. package/dist/_internal/shared/checkout/rules/_limits.js +19 -0
  160. package/dist/_internal/shared/checkout/rules/_registry.d.ts +44 -0
  161. package/dist/_internal/shared/checkout/rules/_registry.js +87 -0
  162. package/dist/_internal/shared/checkout/rules/auction.rule.d.ts +2 -0
  163. package/dist/_internal/shared/checkout/rules/auction.rule.js +10 -0
  164. package/dist/_internal/shared/checkout/rules/bundle.rule.d.ts +11 -0
  165. package/dist/_internal/shared/checkout/rules/bundle.rule.js +6 -0
  166. package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -0
  167. package/dist/_internal/shared/checkout/rules/classified.rule.js +9 -0
  168. package/dist/_internal/shared/checkout/rules/digital-code.rule.d.ts +8 -0
  169. package/dist/_internal/shared/checkout/rules/digital-code.rule.js +6 -0
  170. package/dist/_internal/shared/checkout/rules/index.d.ts +12 -0
  171. package/dist/_internal/shared/checkout/rules/index.js +12 -0
  172. package/dist/_internal/shared/checkout/rules/live.rule.d.ts +10 -0
  173. package/dist/_internal/shared/checkout/rules/live.rule.js +6 -0
  174. package/dist/_internal/shared/checkout/rules/offer.rule.d.ts +2 -0
  175. package/dist/_internal/shared/checkout/rules/offer.rule.js +9 -0
  176. package/dist/_internal/shared/checkout/rules/preorder.rule.d.ts +2 -0
  177. package/dist/_internal/shared/checkout/rules/preorder.rule.js +28 -0
  178. package/dist/_internal/shared/checkout/rules/prize-draw.rule.d.ts +2 -0
  179. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +65 -0
  180. package/dist/_internal/shared/checkout/rules/standard.rule.d.ts +2 -0
  181. package/dist/_internal/shared/checkout/rules/standard.rule.js +5 -0
  182. package/dist/_internal/shared/checkout/rules/types.d.ts +125 -0
  183. package/dist/_internal/shared/checkout/rules/types.js +13 -0
  184. package/dist/_internal/shared/features/cart/schema.d.ts +6 -6
  185. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +123 -0
  186. package/dist/_internal/shared/features/categories/bundle-copy.js +134 -0
  187. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +318 -0
  188. package/dist/_internal/shared/features/categories/bundle-schemas.js +55 -0
  189. package/dist/_internal/shared/features/events/schema.d.ts +4 -4
  190. package/dist/_internal/shared/features/orders/refund-copy.d.ts +36 -0
  191. package/dist/_internal/shared/features/orders/refund-copy.js +40 -0
  192. package/dist/_internal/shared/features/orders/schema.d.ts +4 -4
  193. package/dist/_internal/shared/features/products/schema.d.ts +8 -8
  194. package/dist/_internal/shared/listing-types/_registry.d.ts +27 -0
  195. package/dist/_internal/shared/listing-types/_registry.js +8 -0
  196. package/dist/_internal/shared/listing-types/action-tracker.d.ts +41 -0
  197. package/dist/_internal/shared/listing-types/action-tracker.js +70 -0
  198. package/dist/_internal/shared/listing-types/capabilities.js +25 -0
  199. package/dist/_internal/shared/listing-types/cart-shipping.d.ts +37 -0
  200. package/dist/_internal/shared/listing-types/cart-shipping.js +46 -0
  201. package/dist/_internal/shared/listing-types/classified/config.d.ts +7 -0
  202. package/dist/_internal/shared/listing-types/classified/config.js +8 -0
  203. package/dist/_internal/shared/listing-types/classified/ctas.d.ts +1 -0
  204. package/dist/_internal/shared/listing-types/classified/ctas.js +3 -0
  205. package/dist/_internal/shared/listing-types/classified/og.d.ts +1 -0
  206. package/dist/_internal/shared/listing-types/classified/og.js +1 -0
  207. package/dist/_internal/shared/listing-types/classified/schema.d.ts +1 -0
  208. package/dist/_internal/shared/listing-types/classified/schema.js +1 -0
  209. package/dist/_internal/shared/listing-types/classified/seed-factory.d.ts +1 -0
  210. package/dist/_internal/shared/listing-types/classified/seed-factory.js +1 -0
  211. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +7 -0
  212. package/dist/_internal/shared/listing-types/digital-code/config.js +8 -0
  213. package/dist/_internal/shared/listing-types/digital-code/ctas.d.ts +1 -0
  214. package/dist/_internal/shared/listing-types/digital-code/ctas.js +3 -0
  215. package/dist/_internal/shared/listing-types/digital-code/og.d.ts +1 -0
  216. package/dist/_internal/shared/listing-types/digital-code/og.js +1 -0
  217. package/dist/_internal/shared/listing-types/digital-code/schema.d.ts +1 -0
  218. package/dist/_internal/shared/listing-types/digital-code/schema.js +1 -0
  219. package/dist/_internal/shared/listing-types/digital-code/seed-factory.d.ts +1 -0
  220. package/dist/_internal/shared/listing-types/digital-code/seed-factory.js +1 -0
  221. package/dist/_internal/shared/listing-types/feature-flags.d.ts +34 -0
  222. package/dist/_internal/shared/listing-types/feature-flags.js +45 -0
  223. package/dist/_internal/shared/listing-types/live/config.d.ts +7 -0
  224. package/dist/_internal/shared/listing-types/live/config.js +8 -0
  225. package/dist/_internal/shared/listing-types/live/ctas.d.ts +1 -0
  226. package/dist/_internal/shared/listing-types/live/ctas.js +3 -0
  227. package/dist/_internal/shared/listing-types/live/og.d.ts +1 -0
  228. package/dist/_internal/shared/listing-types/live/og.js +1 -0
  229. package/dist/_internal/shared/listing-types/live/schema.d.ts +1 -0
  230. package/dist/_internal/shared/listing-types/live/schema.js +1 -0
  231. package/dist/_internal/shared/listing-types/live/seed-factory.d.ts +1 -0
  232. package/dist/_internal/shared/listing-types/live/seed-factory.js +1 -0
  233. package/dist/_internal/shared/media/limits.js +8 -0
  234. package/dist/client.d.ts +10 -5
  235. package/dist/client.js +16 -3
  236. package/dist/configs/next.js +7 -0
  237. package/dist/constants/api-endpoints.d.ts +6 -0
  238. package/dist/constants/api-endpoints.js +4 -0
  239. package/dist/core/hooks/useSyncManager.js +13 -1
  240. package/dist/core/unit-of-work.d.ts +1 -1
  241. package/dist/core/unit-of-work.js +2 -2
  242. package/dist/features/account/actions/address-actions.d.ts +1 -1
  243. package/dist/features/account/actions/address-actions.js +15 -7
  244. package/dist/features/account/schemas/firestore.d.ts +8 -43
  245. package/dist/features/account/schemas/firestore.js +8 -54
  246. package/dist/features/account/schemas/index.d.ts +6 -6
  247. package/dist/features/account/server.d.ts +1 -1
  248. package/dist/features/account/server.js +3 -1
  249. package/dist/features/addresses/index.d.ts +2 -0
  250. package/dist/features/addresses/index.js +2 -0
  251. package/dist/features/addresses/repository/addresses.repository.d.ts +29 -0
  252. package/dist/features/addresses/repository/addresses.repository.js +157 -0
  253. package/dist/features/addresses/schemas/firestore.d.ts +53 -0
  254. package/dist/features/addresses/schemas/firestore.js +68 -0
  255. package/dist/features/{bundles → addresses}/schemas/index.d.ts +0 -1
  256. package/dist/features/{bundles → addresses}/schemas/index.js +0 -1
  257. package/dist/features/addresses/server.d.ts +2 -0
  258. package/dist/features/addresses/server.js +2 -0
  259. package/dist/features/admin/components/AdminAllEventEntriesView.js +4 -3
  260. package/dist/features/admin/components/AdminBidsView.js +4 -3
  261. package/dist/features/admin/components/AdminBlogView.js +8 -3
  262. package/dist/features/admin/components/AdminBundleEditorView.d.ts +9 -0
  263. package/dist/features/admin/components/AdminBundleEditorView.js +209 -0
  264. package/dist/features/admin/components/AdminBundlesView.d.ts +9 -0
  265. package/dist/features/admin/components/AdminBundlesView.js +59 -0
  266. package/dist/features/admin/components/AdminCartsView.js +13 -3
  267. package/dist/features/admin/components/AdminContactView.js +4 -3
  268. package/dist/features/admin/components/AdminCouponsView.js +32 -13
  269. package/dist/features/admin/components/AdminNewsletterView.js +4 -3
  270. package/dist/features/admin/components/AdminOrdersView.js +15 -7
  271. package/dist/features/admin/components/AdminPayoutsView.js +4 -3
  272. package/dist/features/admin/components/AdminPrizeDrawsView.d.ts +4 -0
  273. package/dist/features/admin/components/AdminPrizeDrawsView.js +135 -0
  274. package/dist/features/admin/components/AdminProductsView.js +6 -5
  275. package/dist/features/admin/components/AdminReviewsView.js +5 -4
  276. package/dist/features/admin/components/AdminStoresView.js +4 -3
  277. package/dist/features/admin/components/AdminUsersView.js +15 -5
  278. package/dist/features/admin/components/AdminWishlistsView.js +10 -1
  279. package/dist/features/admin/components/DataTable.d.ts +5 -1
  280. package/dist/features/admin/components/DataTable.js +24 -20
  281. package/dist/features/admin/components/index.d.ts +6 -0
  282. package/dist/features/admin/components/index.js +5 -0
  283. package/dist/features/admin/constants/filter-tabs.d.ts +435 -0
  284. package/dist/features/admin/constants/filter-tabs.js +216 -0
  285. package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -0
  286. package/dist/features/admin/hooks/useAdminListingData.js +1 -0
  287. package/dist/features/admin/schemas/firestore.d.ts +15 -0
  288. package/dist/features/admin/schemas/firestore.js +18 -0
  289. package/dist/features/admin/types/product.types.d.ts +2 -2
  290. package/dist/features/auctions/components/AuctionCard.d.ts +4 -1
  291. package/dist/features/auctions/components/AuctionCard.js +5 -3
  292. package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
  293. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +2 -2
  294. package/dist/features/auctions/components/PlaceBidFormClient.js +12 -2
  295. package/dist/features/auctions/schemas/index.d.ts +2 -2
  296. package/dist/features/auth/index.d.ts +1 -0
  297. package/dist/features/auth/index.js +1 -0
  298. package/dist/features/auth/role-predicates.d.ts +16 -0
  299. package/dist/features/auth/role-predicates.js +15 -0
  300. package/dist/features/blog/components/BlogFeaturedCard.d.ts +4 -1
  301. package/dist/features/blog/components/BlogFeaturedCard.js +5 -3
  302. package/dist/features/cart/actions/cart-actions.d.ts +1 -0
  303. package/dist/features/cart/actions/cart-actions.js +16 -0
  304. package/dist/features/cart/components/CartView.d.ts +19 -1
  305. package/dist/features/cart/components/CartView.js +2 -2
  306. package/dist/features/cart/components/ShippingPicker.d.ts +13 -0
  307. package/dist/features/cart/components/ShippingPicker.js +48 -0
  308. package/dist/features/cart/components/index.d.ts +3 -1
  309. package/dist/features/cart/components/index.js +1 -0
  310. package/dist/features/cart/hooks/useCartCount.js +7 -1
  311. package/dist/features/cart/repository/cart.repository.d.ts +1 -0
  312. package/dist/features/cart/repository/cart.repository.js +35 -0
  313. package/dist/features/cart/schemas/firestore.d.ts +27 -2
  314. package/dist/features/categories/components/BundleAddToCartCta.d.ts +16 -0
  315. package/dist/features/categories/components/BundleAddToCartCta.js +54 -0
  316. package/dist/features/categories/components/BundleBuyNowCta.d.ts +8 -0
  317. package/dist/features/categories/components/BundleBuyNowCta.js +37 -0
  318. package/dist/features/categories/components/BundleDetailView.d.ts +22 -0
  319. package/dist/features/categories/components/BundleDetailView.js +31 -0
  320. package/dist/features/categories/components/BundleDynamicRuleEditor.d.ts +18 -0
  321. package/dist/features/categories/components/BundleDynamicRuleEditor.js +60 -0
  322. package/dist/features/categories/components/BundleItemsPicker.d.ts +26 -0
  323. package/dist/features/categories/components/BundleItemsPicker.js +135 -0
  324. package/dist/features/categories/components/BundlesListView.d.ts +13 -0
  325. package/dist/features/categories/components/BundlesListView.js +27 -0
  326. package/dist/features/categories/components/index.d.ts +12 -0
  327. package/dist/features/categories/components/index.js +9 -0
  328. package/dist/features/checkout/actions/checkout-actions.js +10 -3
  329. package/dist/features/events/components/AdminEventEditorView.js +108 -2
  330. package/dist/features/events/components/AdminEventsView.js +16 -4
  331. package/dist/features/events/components/EventCard.d.ts +4 -1
  332. package/dist/features/events/components/EventCard.js +7 -3
  333. package/dist/features/events/components/EventRaffleWinnerView.d.ts +21 -0
  334. package/dist/features/events/components/EventRaffleWinnerView.js +18 -0
  335. package/dist/features/events/components/SpinWheelView.d.ts +27 -0
  336. package/dist/features/events/components/SpinWheelView.js +64 -0
  337. package/dist/features/events/components/index.d.ts +4 -0
  338. package/dist/features/events/components/index.js +2 -0
  339. package/dist/features/events/schemas/firestore.d.ts +27 -1
  340. package/dist/features/events/schemas/firestore.js +7 -0
  341. package/dist/features/events/types/index.d.ts +27 -1
  342. package/dist/features/homepage/components/FeaturedBundlesSection.d.ts +16 -0
  343. package/dist/features/homepage/components/FeaturedBundlesSection.js +24 -0
  344. package/dist/features/homepage/components/MarketplaceHomepageView.js +4 -1
  345. package/dist/features/homepage/components/WhatsAppCommunitySection.js +2 -2
  346. package/dist/features/homepage/lib/section-renderer.d.ts +2 -0
  347. package/dist/features/homepage/lib/section-renderer.js +5 -5
  348. package/dist/features/layout/NavbarLayout.d.ts +3 -1
  349. package/dist/features/layout/NavbarLayout.js +32 -3
  350. package/dist/features/layout/TitleBarLayout.d.ts +6 -3
  351. package/dist/features/layout/TitleBarLayout.js +22 -7
  352. package/dist/features/media/upload/MediaUploadField.d.ts +15 -1
  353. package/dist/features/media/upload/MediaUploadField.js +22 -1
  354. package/dist/features/orders/components/MarketplaceOrderCard.js +4 -2
  355. package/dist/features/orders/components/OrderSiblingPayments.d.ts +8 -0
  356. package/dist/features/orders/components/OrderSiblingPayments.js +16 -0
  357. package/dist/features/orders/components/RefundHistoryTable.d.ts +6 -0
  358. package/dist/features/orders/components/RefundHistoryTable.js +23 -0
  359. package/dist/features/orders/components/RefundRequestView.d.ts +8 -0
  360. package/dist/features/orders/components/RefundRequestView.js +42 -0
  361. package/dist/features/orders/components/index.d.ts +6 -0
  362. package/dist/features/orders/components/index.js +3 -0
  363. package/dist/features/orders/index.d.ts +1 -0
  364. package/dist/features/orders/index.js +2 -0
  365. package/dist/features/orders/repository/orders.repository.d.ts +20 -1
  366. package/dist/features/orders/repository/orders.repository.js +30 -1
  367. package/dist/features/orders/schemas/firestore.d.ts +63 -13
  368. package/dist/features/orders/schemas/firestore.js +5 -5
  369. package/dist/features/orders/schemas/index.d.ts +4 -4
  370. package/dist/features/orders/types/index.d.ts +12 -2
  371. package/dist/features/orders/utils/bundle-grouping.d.ts +48 -0
  372. package/dist/features/orders/utils/bundle-grouping.js +54 -0
  373. package/dist/features/orders/utils/order-splitter.d.ts +9 -10
  374. package/dist/features/orders/utils/order-splitter.js +24 -30
  375. package/dist/features/payments/repository/payout.repository.d.ts +17 -1
  376. package/dist/features/payments/repository/payout.repository.js +47 -0
  377. package/dist/features/payments/schemas/firestore.d.ts +26 -0
  378. package/dist/features/pre-orders/components/PreorderCard.d.ts +4 -1
  379. package/dist/features/pre-orders/components/PreorderCard.js +8 -6
  380. package/dist/features/products/actions/product-actions.d.ts +1 -1
  381. package/dist/features/products/actions/product-actions.js +1 -1
  382. package/dist/features/products/components/CompareOverlay.d.ts +2 -2
  383. package/dist/features/products/components/CompareOverlay.js +4 -4
  384. package/dist/features/products/components/InteractiveProductCard.js +7 -12
  385. package/dist/features/products/components/NonRefundableConsentModal.d.ts +1 -1
  386. package/dist/features/products/components/NonRefundableConsentModal.js +0 -10
  387. package/dist/features/products/components/ProductGrid.js +28 -12
  388. package/dist/features/products/components/ShowGroupSection.js +3 -3
  389. package/dist/features/products/components/SublistingCarouselSection.js +2 -2
  390. package/dist/features/products/components/index.d.ts +0 -4
  391. package/dist/features/products/components/index.js +5 -2
  392. package/dist/features/products/index.d.ts +1 -1
  393. package/dist/features/products/index.js +3 -1
  394. package/dist/features/products/repository/products.repository.js +4 -0
  395. package/dist/features/products/schemas/catalog-product.d.ts +70 -0
  396. package/dist/features/products/schemas/catalog-product.js +50 -0
  397. package/dist/features/products/schemas/firestore.d.ts +110 -2
  398. package/dist/features/products/schemas/firestore.js +30 -0
  399. package/dist/features/products/schemas/index.d.ts +8 -8
  400. package/dist/features/products/types/index.d.ts +1 -1
  401. package/dist/features/products/utils/listing-type.d.ts +9 -0
  402. package/dist/features/products/utils/listing-type.js +4 -0
  403. package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
  404. package/dist/features/promotions/actions/coupon-actions.js +1 -1
  405. package/dist/features/promotions/components/CouponCard.d.ts +28 -10
  406. package/dist/features/promotions/components/CouponCard.js +116 -14
  407. package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
  408. package/dist/features/promotions/repository/coupons.repository.d.ts +1 -1
  409. package/dist/features/reviews/schemas/index.d.ts +2 -2
  410. package/dist/features/search/schemas/index.d.ts +2 -2
  411. package/dist/features/search/types/index.d.ts +2 -2
  412. package/dist/features/seller/components/SellerAuctionsView.js +4 -5
  413. package/dist/features/seller/components/SellerBidsView.js +5 -13
  414. package/dist/features/seller/components/SellerCouponsView.js +31 -67
  415. package/dist/features/seller/components/SellerOffersView.js +4 -5
  416. package/dist/features/seller/components/SellerOrdersView.js +4 -5
  417. package/dist/features/seller/components/SellerPayoutsView.js +4 -5
  418. package/dist/features/seller/components/SellerPreOrdersView.d.ts +4 -0
  419. package/dist/features/seller/components/SellerPreOrdersView.js +141 -0
  420. package/dist/features/seller/components/SellerPrizeDrawsView.d.ts +4 -0
  421. package/dist/features/seller/components/SellerPrizeDrawsView.js +138 -0
  422. package/dist/features/seller/components/SellerProductsView.js +4 -8
  423. package/dist/features/seller/components/index.d.ts +4 -0
  424. package/dist/features/seller/components/index.js +2 -0
  425. package/dist/features/seller/schemas/index.d.ts +2 -2
  426. package/dist/features/stores/actions/store-address-actions.d.ts +10 -6
  427. package/dist/features/stores/actions/store-address-actions.js +8 -7
  428. package/dist/features/stores/components/InteractiveStoreCard.js +3 -10
  429. package/dist/features/stores/components/StoreDetailLayoutView.js +20 -5
  430. package/dist/features/stores/schemas/firestore.d.ts +45 -38
  431. package/dist/features/stores/schemas/firestore.js +2 -49
  432. package/dist/features/stores/server.d.ts +0 -1
  433. package/dist/features/stores/server.js +2 -1
  434. package/dist/features/wishlist/hooks/useWishlistCount.d.ts +7 -9
  435. package/dist/features/wishlist/hooks/useWishlistCount.js +67 -86
  436. package/dist/features/wishlist/types/index.d.ts +1 -1
  437. package/dist/index.d.ts +56 -9
  438. package/dist/index.js +66 -11
  439. package/dist/next/routing/route-map.d.ts +6 -0
  440. package/dist/next/routing/route-map.js +4 -0
  441. package/dist/providers/db-firebase/admin.d.ts +6 -2
  442. package/dist/providers/db-firebase/admin.js +23 -0
  443. package/dist/repositories/index.d.ts +1 -2
  444. package/dist/repositories/index.js +5 -2
  445. package/dist/security/authorization.d.ts +2 -1
  446. package/dist/security/authorization.js +3 -2
  447. package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
  448. package/dist/seed/bids-seed-data.d.ts +2 -2
  449. package/dist/seed/bids-seed-data.js +77 -2
  450. package/dist/seed/cart-seed-data.d.ts +10 -10
  451. package/dist/seed/cart-seed-data.js +15 -15
  452. package/dist/seed/events-seed-data.js +77 -0
  453. package/dist/seed/manifest.js +16 -8
  454. package/dist/seed/orders-seed-data.js +41 -2
  455. package/dist/seed/payouts-seed-data.js +18 -2
  456. package/dist/seed/stores-seed-data.js +55 -0
  457. package/dist/server-entry.d.ts +1 -0
  458. package/dist/server-entry.js +2 -0
  459. package/dist/server.d.ts +4 -0
  460. package/dist/server.js +8 -0
  461. package/dist/tailwind-utilities.css +1 -1
  462. package/dist/ui/components/FilterChipGroup.d.ts +39 -0
  463. package/dist/ui/components/FilterChipGroup.js +15 -0
  464. package/dist/ui/components/HorizontalScroller.js +32 -7
  465. package/dist/ui/components/HorizontalScroller.style.css +6 -0
  466. package/dist/ui/components/SiteLogo.js +1 -1
  467. package/dist/ui/index.d.ts +2 -0
  468. package/dist/ui/index.js +2 -0
  469. package/dist/utils/id-generators.d.ts +11 -0
  470. package/dist/utils/id-generators.js +16 -0
  471. package/package.json +1 -1
  472. package/dist/_internal/shared/features/bundles/config.d.ts +0 -6
  473. package/dist/_internal/shared/features/bundles/config.js +0 -6
  474. package/dist/_internal/shared/schema-versions.d.ts +0 -76
  475. package/dist/_internal/shared/schema-versions.js +0 -82
  476. package/dist/features/account/migrations.d.ts +0 -2
  477. package/dist/features/account/migrations.js +0 -10
  478. package/dist/features/admin/migrations.d.ts +0 -2
  479. package/dist/features/admin/migrations.js +0 -10
  480. package/dist/features/auctions/migrations.d.ts +0 -2
  481. package/dist/features/auctions/migrations.js +0 -10
  482. package/dist/features/auth/migrations.d.ts +0 -2
  483. package/dist/features/auth/migrations.js +0 -10
  484. package/dist/features/blog/migrations.d.ts +0 -2
  485. package/dist/features/blog/migrations.js +0 -10
  486. package/dist/features/brands/actions/brand-actions.d.ts +0 -2
  487. package/dist/features/brands/actions/brand-actions.js +0 -5
  488. package/dist/features/brands/index.d.ts +0 -3
  489. package/dist/features/brands/index.js +0 -3
  490. package/dist/features/brands/migrations.d.ts +0 -2
  491. package/dist/features/brands/migrations.js +0 -10
  492. package/dist/features/brands/repository/brands.repository.d.ts +0 -13
  493. package/dist/features/brands/repository/brands.repository.js +0 -60
  494. package/dist/features/brands/schemas/index.d.ts +0 -33
  495. package/dist/features/brands/schemas/index.js +0 -15
  496. package/dist/features/brands/server.d.ts +0 -7
  497. package/dist/features/brands/server.js +0 -7
  498. package/dist/features/bundles/components/AdminBundleEditorView.d.ts +0 -8
  499. package/dist/features/bundles/components/AdminBundleEditorView.js +0 -7
  500. package/dist/features/bundles/components/BundleDetailPageView.d.ts +0 -9
  501. package/dist/features/bundles/components/BundleDetailPageView.js +0 -45
  502. package/dist/features/bundles/components/BundleForm.d.ts +0 -12
  503. package/dist/features/bundles/components/BundleForm.js +0 -126
  504. package/dist/features/bundles/components/BundleItemsPicker.d.ts +0 -9
  505. package/dist/features/bundles/components/BundleItemsPicker.js +0 -77
  506. package/dist/features/bundles/components/BundlesByCategoryListing.d.ts +0 -6
  507. package/dist/features/bundles/components/BundlesByCategoryListing.js +0 -50
  508. package/dist/features/bundles/components/BundlesListingView.d.ts +0 -17
  509. package/dist/features/bundles/components/BundlesListingView.js +0 -50
  510. package/dist/features/bundles/components/FeaturedBundlesSection.d.ts +0 -5
  511. package/dist/features/bundles/components/FeaturedBundlesSection.js +0 -55
  512. package/dist/features/bundles/components/SellerBundleCreateView.d.ts +0 -8
  513. package/dist/features/bundles/components/SellerBundleCreateView.js +0 -7
  514. package/dist/features/bundles/components/SellerBundleEditView.d.ts +0 -9
  515. package/dist/features/bundles/components/SellerBundleEditView.js +0 -7
  516. package/dist/features/bundles/components/index.d.ts +0 -18
  517. package/dist/features/bundles/components/index.js +0 -9
  518. package/dist/features/bundles/constants/index.d.ts +0 -32
  519. package/dist/features/bundles/constants/index.js +0 -35
  520. package/dist/features/bundles/index.d.ts +0 -2
  521. package/dist/features/bundles/index.js +0 -2
  522. package/dist/features/bundles/migrations.d.ts +0 -2
  523. package/dist/features/bundles/migrations.js +0 -10
  524. package/dist/features/bundles/repository/bundles.repository.d.ts +0 -36
  525. package/dist/features/bundles/repository/bundles.repository.js +0 -148
  526. package/dist/features/bundles/repository/index.d.ts +0 -1
  527. package/dist/features/bundles/repository/index.js +0 -1
  528. package/dist/features/bundles/schemas/firestore.d.ts +0 -88
  529. package/dist/features/bundles/schemas/firestore.js +0 -29
  530. package/dist/features/bundles/schemas/zod.d.ts +0 -377
  531. package/dist/features/bundles/schemas/zod.js +0 -71
  532. package/dist/features/cart/migrations.d.ts +0 -2
  533. package/dist/features/cart/migrations.js +0 -10
  534. package/dist/features/categories/migrations.d.ts +0 -2
  535. package/dist/features/categories/migrations.js +0 -10
  536. package/dist/features/events/migrations.d.ts +0 -2
  537. package/dist/features/events/migrations.js +0 -10
  538. package/dist/features/faq/migrations.d.ts +0 -2
  539. package/dist/features/faq/migrations.js +0 -10
  540. package/dist/features/grouped/migrations.d.ts +0 -2
  541. package/dist/features/grouped/migrations.js +0 -10
  542. package/dist/features/history/migrations.d.ts +0 -2
  543. package/dist/features/history/migrations.js +0 -10
  544. package/dist/features/messages/migrations.d.ts +0 -2
  545. package/dist/features/messages/migrations.js +0 -10
  546. package/dist/features/orders/migrations.d.ts +0 -2
  547. package/dist/features/orders/migrations.js +0 -10
  548. package/dist/features/payments/migrations.d.ts +0 -2
  549. package/dist/features/payments/migrations.js +0 -10
  550. package/dist/features/products/migrations.d.ts +0 -2
  551. package/dist/features/products/migrations.js +0 -10
  552. package/dist/features/products/repository/sublisting-categories.repository.d.ts +0 -16
  553. package/dist/features/products/repository/sublisting-categories.repository.js +0 -126
  554. package/dist/features/products/schemas/sublisting-categories.d.ts +0 -45
  555. package/dist/features/products/schemas/sublisting-categories.js +0 -16
  556. package/dist/features/promotions/migrations.d.ts +0 -2
  557. package/dist/features/promotions/migrations.js +0 -10
  558. package/dist/features/reviews/migrations.d.ts +0 -2
  559. package/dist/features/reviews/migrations.js +0 -10
  560. package/dist/features/scams/migrations.d.ts +0 -2
  561. package/dist/features/scams/migrations.js +0 -10
  562. package/dist/features/seller/migrations.d.ts +0 -2
  563. package/dist/features/seller/migrations.js +0 -10
  564. package/dist/features/stores/migrations.d.ts +0 -2
  565. package/dist/features/stores/migrations.js +0 -10
  566. package/dist/features/sublisting/migrations.d.ts +0 -2
  567. package/dist/features/sublisting/migrations.js +0 -10
  568. package/dist/features/sublisting/schemas/firestore.d.ts +0 -32
  569. package/dist/features/sublisting/schemas/firestore.js +0 -19
  570. package/dist/features/support/migrations.d.ts +0 -2
  571. package/dist/features/support/migrations.js +0 -10
  572. package/dist/features/wishlist/migrations.d.ts +0 -2
  573. package/dist/features/wishlist/migrations.js +0 -10
  574. package/dist/seed/_bundle-constants.d.ts +0 -14
  575. package/dist/seed/_bundle-constants.js +0 -14
  576. package/dist/seed/anime-figures-seed-data.d.ts +0 -8
  577. package/dist/seed/anime-figures-seed-data.js +0 -1033
  578. package/dist/seed/beyblade-seed-data.d.ts +0 -7
  579. package/dist/seed/beyblade-seed-data.js +0 -1129
  580. package/dist/seed/brands-seed-data.d.ts +0 -7
  581. package/dist/seed/brands-seed-data.js +0 -410
  582. package/dist/seed/bundles-seed-data.d.ts +0 -13
  583. package/dist/seed/bundles-seed-data.js +0 -229
  584. package/dist/seed/cosplay-accessories-seed-data.d.ts +0 -8
  585. package/dist/seed/cosplay-accessories-seed-data.js +0 -647
  586. package/dist/seed/hot-wheels-seed-data.d.ts +0 -7
  587. package/dist/seed/hot-wheels-seed-data.js +0 -1612
  588. package/dist/seed/letitrip-official-seed-data.d.ts +0 -8
  589. package/dist/seed/letitrip-official-seed-data.js +0 -399
  590. package/dist/seed/pokemon-carousel-slides-seed-data.d.ts +0 -8
  591. package/dist/seed/pokemon-carousel-slides-seed-data.js +0 -322
  592. package/dist/seed/pokemon-categories-seed-data.d.ts +0 -24
  593. package/dist/seed/pokemon-categories-seed-data.js +0 -547
  594. package/dist/seed/pokemon-coupons-seed-data.d.ts +0 -6
  595. package/dist/seed/pokemon-coupons-seed-data.js +0 -465
  596. package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +0 -7
  597. package/dist/seed/pokemon-homepage-sections-seed-data.js +0 -241
  598. package/dist/seed/pokemon-products-seed-data.d.ts +0 -9
  599. package/dist/seed/pokemon-products-seed-data.js +0 -1791
  600. package/dist/seed/pokemon-seed-bundle.d.ts +0 -47
  601. package/dist/seed/pokemon-seed-bundle.js +0 -71
  602. package/dist/seed/pokemon-stores-seed-data.d.ts +0 -6
  603. package/dist/seed/pokemon-stores-seed-data.js +0 -179
  604. package/dist/seed/pokemon-users-seed-data.d.ts +0 -6
  605. package/dist/seed/pokemon-users-seed-data.js +0 -521
  606. package/dist/seed/products-seed-data.d.ts +0 -6
  607. package/dist/seed/products-seed-data.js +0 -2530
  608. package/dist/seed/retro-gaming-seed-data.d.ts +0 -8
  609. package/dist/seed/retro-gaming-seed-data.js +0 -801
  610. package/dist/seed/server.d.ts +0 -2
  611. package/dist/seed/server.js +0 -7
  612. package/dist/seed/sublisting-categories-seed-data.d.ts +0 -7
  613. package/dist/seed/sublisting-categories-seed-data.js +0 -159
  614. package/dist/seed/transformers-seed-data.d.ts +0 -7
  615. package/dist/seed/transformers-seed-data.js +0 -530
@@ -1,108 +1,8 @@
1
- /**
2
- * Trigger handler: keep category metrics + store stats in sync when a
3
- * product document is written. Only published products count.
4
- */
5
- // SB-UNI-V — bundlesRepository deleted; bundle stock-sync moves to the
6
- // dedicated `onProductStockChange` Firebase Function handler.
7
- import { categoriesRepository, storeRepository, } from "../../../../repositories";
8
- import { ProductStatusValues } from "../../../../features/products/schemas/firestore";
9
- const UNAVAILABLE_PRODUCT_STATUSES = new Set([
10
- ProductStatusValues.SOLD,
11
- ProductStatusValues.OUT_OF_STOCK,
12
- ProductStatusValues.DISCONTINUED,
13
- ]);
14
- // SB-UNI-V — `syncBundlesOnUnavailableTransition` deleted. The
15
- // `onProductStockChange` Firebase Function (registered separately) now
16
- // observes product writes and recomputes each bundle category's
17
- // `bundleStockStatus` via `partOfBundleCategoryIds[]` on the product.
18
- // UNAVAILABLE_PRODUCT_STATUSES retained — referenced by the function.
19
- void UNAVAILABLE_PRODUCT_STATUSES;
20
- async function getParentIds(categoryId) {
21
- if (!categoryId)
22
- return [];
23
- return (await categoriesRepository.findById(categoryId))?.parentIds ?? [];
24
- }
1
+ import { handleProductWrite } from "../core/onProductWrite";
25
2
  export const onProductWriteHandler = async (event, ctx) => {
26
- const productId = event.params.productId;
27
- const before = event.before;
28
- const after = event.after;
29
- const beforeStatus = before?.status ?? null;
30
- const afterStatus = after?.status ?? null;
31
- const beforeCategory = before?.category ?? null;
32
- const afterCategory = after?.category ?? null;
33
- const beforeStoreId = (before?.storeId || before?.sellerId) ?? null;
34
- const afterStoreId = (after?.storeId || after?.sellerId) ?? null;
35
- // SB1-G — counters drive product-vs-auction split off the canonical
36
- // listingType discriminator. Anything not "auction" counts toward products.
37
- const isAuction = after?.listingType === "auction";
38
- const beforeIsAuction = before?.listingType === "auction";
39
- const wasPublished = beforeStatus === ProductStatusValues.PUBLISHED;
40
- const isPublished = afterStatus === ProductStatusValues.PUBLISHED;
41
- const isDelete = !after;
42
- try {
43
- if (isDelete && wasPublished && beforeCategory) {
44
- const parentIds = await getParentIds(beforeCategory);
45
- const batch = ctx.db.batch();
46
- categoriesRepository.updateMetricsInBatch(batch, beforeCategory, parentIds, beforeIsAuction ? 0 : -1, beforeIsAuction ? -1 : 0, productId);
47
- await batch.commit();
48
- if (beforeStoreId)
49
- await storeRepository.incrementTotalProducts(beforeStoreId, -1);
50
- ctx.logger.info("Decremented counters on hard-delete", {
51
- productId,
52
- category: beforeCategory,
53
- storeId: beforeStoreId,
54
- });
55
- }
56
- else if (!wasPublished && isPublished && afterCategory) {
57
- const parentIds = await getParentIds(afterCategory);
58
- const batch = ctx.db.batch();
59
- categoriesRepository.updateMetricsInBatch(batch, afterCategory, parentIds, isAuction ? 0 : 1, isAuction ? 1 : 0, productId);
60
- await batch.commit();
61
- if (afterStoreId)
62
- await storeRepository.incrementTotalProducts(afterStoreId, 1);
63
- ctx.logger.info("Incremented counters on publish", {
64
- productId,
65
- category: afterCategory,
66
- storeId: afterStoreId,
67
- });
68
- }
69
- else if (wasPublished && !isPublished && beforeCategory) {
70
- const parentIds = await getParentIds(beforeCategory);
71
- const batch = ctx.db.batch();
72
- categoriesRepository.updateMetricsInBatch(batch, beforeCategory, parentIds, beforeIsAuction ? 0 : -1, beforeIsAuction ? -1 : 0, productId);
73
- await batch.commit();
74
- if (beforeStoreId)
75
- await storeRepository.incrementTotalProducts(beforeStoreId, -1);
76
- ctx.logger.info("Decremented counters on unpublish", {
77
- productId,
78
- category: beforeCategory,
79
- storeId: beforeStoreId,
80
- });
81
- }
82
- else if (wasPublished &&
83
- isPublished &&
84
- beforeCategory &&
85
- afterCategory &&
86
- beforeCategory !== afterCategory) {
87
- const [beforeParents, afterParents] = await Promise.all([
88
- getParentIds(beforeCategory),
89
- getParentIds(afterCategory),
90
- ]);
91
- const batch = ctx.db.batch();
92
- categoriesRepository.updateMetricsInBatch(batch, beforeCategory, beforeParents, beforeIsAuction ? 0 : -1, beforeIsAuction ? -1 : 0, productId);
93
- categoriesRepository.updateMetricsInBatch(batch, afterCategory, afterParents, isAuction ? 0 : 1, isAuction ? 1 : 0, productId);
94
- await batch.commit();
95
- ctx.logger.info("Moved product between categories", {
96
- productId,
97
- from: beforeCategory,
98
- to: afterCategory,
99
- });
100
- }
101
- }
102
- catch (err) {
103
- ctx.logger.error("Counter update failed (non-fatal)", err, { productId });
104
- }
105
- // SB-UNI-V — bundle stock-sync moved to onProductStockChange Function.
106
- void before;
107
- void after;
3
+ await handleProductWrite({
4
+ productId: event.params.productId,
5
+ before: event.before,
6
+ after: event.after,
7
+ }, ctx);
108
8
  };
@@ -1,51 +1,4 @@
1
- import { reviewRepository, storeRepository } from "../../../../repositories";
2
- import { ReviewStatusValues } from "../../../../features/reviews/schemas/firestore";
3
- import { PRODUCT_COLLECTION } from "../../../../features/products/schemas/firestore";
1
+ import { handleReviewWrite } from "../core/onReviewWrite";
4
2
  export const onReviewWriteHandler = async (event, ctx) => {
5
- const reviewId = event.params.reviewId;
6
- const beforeData = event.before;
7
- const afterData = event.after;
8
- const beforeStatus = beforeData?.status ?? null;
9
- const afterStatus = afterData?.status ?? null;
10
- const wasApproved = beforeStatus === ReviewStatusValues.APPROVED;
11
- const isApproved = afterStatus === ReviewStatusValues.APPROVED;
12
- if (!wasApproved && !isApproved)
13
- return;
14
- const data = afterData ?? beforeData;
15
- if (!data)
16
- return;
17
- const productId = data.productId ?? null;
18
- const storeId = data.storeId ?? null;
19
- if (!productId) {
20
- ctx.logger.error("Review has no productId — skipping", null, { reviewId });
21
- return;
22
- }
23
- try {
24
- const { count, avgRating } = await reviewRepository.getApprovedRatingAggregate(productId);
25
- await ctx.db.collection(PRODUCT_COLLECTION).doc(productId).update({
26
- avgRating,
27
- reviewCount: count,
28
- updatedAt: new Date(),
29
- });
30
- ctx.logger.info("Updated product rating stats", {
31
- reviewId,
32
- productId,
33
- count,
34
- avgRating,
35
- });
36
- if (storeId) {
37
- const storeStats = await reviewRepository.getApprovedRatingAggregateByStore(storeId);
38
- await storeRepository.updateReviewStats(storeId, storeStats.count, storeStats.avgRating);
39
- ctx.logger.info("Updated store review stats", {
40
- reviewId,
41
- storeId,
42
- count: storeStats.count,
43
- avgRating: storeStats.avgRating,
44
- });
45
- }
46
- }
47
- catch (err) {
48
- ctx.logger.error("Failed to update rating stats", err, { reviewId, productId, storeId });
49
- throw err;
50
- }
3
+ await handleReviewWrite({ reviewId: event.params.reviewId, before: event.before, after: event.after }, ctx);
51
4
  };
@@ -1,10 +1,3 @@
1
- /**
2
- * Trigger handler: stores/{id} onWrite — currently a no-op. The previous
3
- * implementation synced an external search index that has since been removed.
4
- * The handler stays so the binding remains canonical and can be reactivated
5
- * without touching the consumer's functions/src/index.ts.
6
- */
7
1
  import type { FirestoreTriggerHandler } from "../runtime/types";
8
- type StoreDoc = Record<string, unknown>;
2
+ import { type StoreDoc } from "../core/onStoreWrite";
9
3
  export declare const onStoreWriteHandler: FirestoreTriggerHandler<StoreDoc, StoreDoc>;
10
- export {};
@@ -1,9 +1,8 @@
1
- /**
2
- * Trigger handler: stores/{id} onWrite currently a no-op. The previous
3
- * implementation synced an external search index that has since been removed.
4
- * The handler stays so the binding remains canonical and can be reactivated
5
- * without touching the consumer's functions/src/index.ts.
6
- */
7
- export const onStoreWriteHandler = async () => {
8
- // Intentionally empty — search provider removed; Firestore queries handle search now.
1
+ import { handleStoreWrite } from "../core/onStoreWrite";
2
+ export const onStoreWriteHandler = async (event, ctx) => {
3
+ await handleStoreWrite({
4
+ storeId: event.params.storeId,
5
+ before: event.before,
6
+ after: event.after,
7
+ }, ctx);
9
8
  };
@@ -1,11 +1,2 @@
1
- /**
2
- * Job handler: dispatch pending payouts via Razorpay Payouts API.
3
- *
4
- * Reads RAZORPAY_KEY_ID / RAZORPAY_KEY_SECRET / RAZORPAY_ACCOUNT_NUMBER from
5
- * env (via `ctx.env`). On 3rd consecutive failure the record is marked failed.
6
- *
7
- * Brand name in the narration is taken from `ctx.env("APP_BRAND_NAME")`
8
- * (default empty) so appkit stays consumer-agnostic.
9
- */
10
1
  import type { ScheduleHandler } from "../runtime/types";
11
2
  export declare const payoutBatchHandler: ScheduleHandler;
@@ -1,104 +1,2 @@
1
- /**
2
- * Job handler: dispatch pending payouts via Razorpay Payouts API.
3
- *
4
- * Reads RAZORPAY_KEY_ID / RAZORPAY_KEY_SECRET / RAZORPAY_ACCOUNT_NUMBER from
5
- * env (via `ctx.env`). On 3rd consecutive failure the record is marked failed.
6
- *
7
- * Brand name in the narration is taken from `ctx.env("APP_BRAND_NAME")`
8
- * (default empty) so appkit stays consumer-agnostic.
9
- */
10
- import { payoutRepository } from "../../../../repositories";
11
- const MAX_FAILURES = 3;
12
- async function dispatch(ctx, entry) {
13
- const { ref, data: payout } = entry;
14
- await payoutRepository.markProcessing(ref);
15
- try {
16
- const keyId = ctx.env("RAZORPAY_KEY_ID") ?? "";
17
- const keySecret = ctx.env("RAZORPAY_KEY_SECRET") ?? "";
18
- const accountNumber = ctx.env("RAZORPAY_ACCOUNT_NUMBER") ?? "";
19
- const apiBaseUrl = ctx.env("RAZORPAY_API_BASE_URL") ?? "https://api.razorpay.com/v1";
20
- const brandName = ctx.env("APP_BRAND_NAME") ?? "";
21
- if (!keyId || !keySecret || !accountNumber) {
22
- throw new Error("Razorpay credentials not configured");
23
- }
24
- const basicAuth = Buffer.from(`${keyId}:${keySecret}`).toString("base64");
25
- let fundAccount;
26
- if (payout.paymentMethod === "upi" && payout.upiId) {
27
- fundAccount = { account_type: "vpa", vpa: { address: payout.upiId } };
28
- }
29
- else if (payout.bankAccount) {
30
- fundAccount = {
31
- account_type: "bank_account",
32
- bank_account: {
33
- name: payout.bankAccount.accountHolderName,
34
- ifsc: payout.bankAccount.ifscCode,
35
- account_number: payout.bankAccount.accountNumberMasked,
36
- },
37
- };
38
- }
39
- else {
40
- throw new Error("Payout has no fund account configured");
41
- }
42
- const payload = {
43
- account_number: accountNumber,
44
- fund_account: {
45
- ...fundAccount,
46
- contact: { name: payout.sellerEmail, type: "vendor", email: payout.sellerEmail },
47
- },
48
- amount: Math.round(payout.amount * 100),
49
- currency: payout.currency.toUpperCase(),
50
- mode: payout.paymentMethod === "upi" ? "UPI" : "NEFT",
51
- purpose: "payout",
52
- reference_id: payout.id,
53
- narration: brandName
54
- ? `${brandName} payout for seller ${payout.storeId}`
55
- : `Payout for seller ${payout.storeId}`,
56
- };
57
- const response = await fetch(`${apiBaseUrl}/payouts`, {
58
- method: "POST",
59
- headers: {
60
- Authorization: `Basic ${basicAuth}`,
61
- "Content-Type": "application/json",
62
- "X-Payout-Idempotency": payout.id,
63
- },
64
- body: JSON.stringify(payload),
65
- });
66
- if (!response.ok) {
67
- const errBody = await response.text();
68
- throw new Error(`Razorpay ${response.status}: ${errBody}`);
69
- }
70
- const result = (await response.json());
71
- await payoutRepository.recordSuccess(ref, result.id, result.status);
72
- ctx.logger.info(`Payout ${payout.id} dispatched`, { razorpayId: result.id, razorpayStatus: result.status });
73
- }
74
- catch (error) {
75
- const failureCount = (payout.failureCount ?? 0) + 1;
76
- const isFinal = failureCount >= MAX_FAILURES;
77
- const reason = error instanceof Error ? error.message : String(error);
78
- await payoutRepository.recordFailure(ref, failureCount, reason, isFinal);
79
- if (isFinal) {
80
- ctx.logger.error(`Payout ${payout.id} permanently failed after ${MAX_FAILURES} attempts`, error, {
81
- sellerId: payout.storeId,
82
- });
83
- }
84
- else {
85
- ctx.logger.warn(`Payout ${payout.id} failed (attempt ${failureCount})`, { error: reason });
86
- }
87
- }
88
- }
89
- export const payoutBatchHandler = async (ctx) => {
90
- ctx.logger.info("Starting payout batch sweep");
91
- const pending = await payoutRepository.getPending();
92
- if (pending.length === 0) {
93
- ctx.logger.info("No pending payouts to process");
94
- return;
95
- }
96
- ctx.logger.info(`Dispatching ${pending.length} payout(s)`);
97
- const results = await Promise.allSettled(pending.map((entry) => dispatch(ctx, entry)));
98
- const failed = results.filter((r) => r.status === "rejected").length;
99
- ctx.logger.info("Payout batch complete", {
100
- total: pending.length,
101
- succeeded: pending.length - failed,
102
- failed,
103
- });
104
- };
1
+ import { runPayoutBatch } from "../core/payoutBatch";
2
+ export const payoutBatchHandler = runPayoutBatch;
@@ -1,8 +1,2 @@
1
- /**
2
- * Job handler: cancel pending orders that have not paid in time.
3
- *
4
- * Reads timeout-hours from `ctx.env("ORDER_TIMEOUT_HOURS")` (default 24).
5
- * Writes cancellation notifications atomically in the same Firestore batch.
6
- */
7
1
  import type { ScheduleHandler } from "../runtime/types";
8
2
  export declare const pendingOrderTimeoutHandler: ScheduleHandler;
@@ -1,33 +1,2 @@
1
- /**
2
- * Job handler: cancel pending orders that have not paid in time.
3
- *
4
- * Reads timeout-hours from `ctx.env("ORDER_TIMEOUT_HOURS")` (default 24).
5
- * Writes cancellation notifications atomically in the same Firestore batch.
6
- */
7
- import { notificationRepository, orderRepository } from "../../../../repositories";
8
- import { ORDER_MESSAGES } from "./messages";
9
- const DEFAULT_TIMEOUT_HOURS = 24;
10
- export const pendingOrderTimeoutHandler = async (ctx) => {
11
- const timeoutHours = Number(ctx.env("ORDER_TIMEOUT_HOURS") ?? DEFAULT_TIMEOUT_HOURS);
12
- ctx.logger.info(`Scanning orders unpaid > ${timeoutHours}h`);
13
- const timedOut = await orderRepository.getTimedOutPending(timeoutHours);
14
- if (timedOut.length === 0) {
15
- ctx.logger.info("No timed-out pending orders found");
16
- return;
17
- }
18
- const batch = ctx.db.batch();
19
- for (const entry of timedOut) {
20
- orderRepository.cancelInBatch(batch, entry.ref);
21
- notificationRepository.createInBatch(batch, {
22
- userId: entry.data.userId,
23
- type: "order_cancelled",
24
- priority: "normal",
25
- title: ORDER_MESSAGES.CANCELLED_TITLE,
26
- message: ORDER_MESSAGES.CANCELLED_TIMEOUT_MESSAGE(entry.data.productTitle, timeoutHours),
27
- relatedId: entry.data.id,
28
- relatedType: "order",
29
- });
30
- }
31
- await batch.commit();
32
- ctx.logger.info("Pending order timeout complete", { cancelled: timedOut.length });
33
- };
1
+ import { runPendingOrderTimeout } from "../core/pendingOrderTimeout";
2
+ export const pendingOrderTimeoutHandler = runPendingOrderTimeout;
@@ -1,7 +1,2 @@
1
- /**
2
- * Job handler: rebuild `position` + `subtreeSize` for every category via
3
- * DFS pre-order from the roots. Heals drift left by the trigger's
4
- * `positionDirty` flag and any failed real-time updates.
5
- */
6
1
  import type { ScheduleHandler } from "../runtime/types";
7
2
  export declare const positionsReconcileHandler: ScheduleHandler;
@@ -1,87 +1,2 @@
1
- /**
2
- * Job handler: rebuild `position` + `subtreeSize` for every category via
3
- * DFS pre-order from the roots. Heals drift left by the trigger's
4
- * `positionDirty` flag and any failed real-time updates.
5
- */
6
- import { BATCH_LIMIT } from "./messages";
7
- const CATEGORIES = "categories";
8
- function dfsAssign(nodeId, childMap, counter, result) {
9
- const position = counter;
10
- counter++;
11
- const children = (childMap.get(nodeId) ?? []).sort((a, b) => a.order - b.order);
12
- for (const child of children) {
13
- counter = dfsAssign(child.id, childMap, counter, result);
14
- }
15
- const subtreeSize = counter - position;
16
- result.set(nodeId, { position, subtreeSize });
17
- return counter;
18
- }
19
- export const positionsReconcileHandler = async (ctx) => {
20
- const snap = await ctx.db.collection(CATEGORIES).get();
21
- const nodes = snap.docs.map((doc) => {
22
- const d = doc.data();
23
- const parentIds = d.parentIds ?? [];
24
- return {
25
- id: doc.id,
26
- parentId: parentIds.length > 0 ? parentIds[parentIds.length - 1] : null,
27
- order: d.order ?? 0,
28
- position: d.position ?? 0,
29
- subtreeSize: d.subtreeSize ?? 1,
30
- positionDirty: d.positionDirty ?? false,
31
- };
32
- });
33
- if (nodes.length === 0) {
34
- ctx.logger.info("No categories — nothing to reconcile");
35
- return;
36
- }
37
- const childMap = new Map();
38
- const roots = [];
39
- for (const node of nodes) {
40
- if (node.parentId === null) {
41
- roots.push(node);
42
- }
43
- else {
44
- const siblings = childMap.get(node.parentId) ?? [];
45
- siblings.push(node);
46
- childMap.set(node.parentId, siblings);
47
- }
48
- }
49
- const computed = new Map();
50
- let counter = 1;
51
- for (const root of roots.sort((a, b) => a.order - b.order)) {
52
- counter = dfsAssign(root.id, childMap, counter, computed);
53
- }
54
- const orphans = nodes.filter((n) => !computed.has(n.id));
55
- for (const orphan of orphans) {
56
- counter = dfsAssign(orphan.id, childMap, counter, computed);
57
- }
58
- const nodeMap = new Map(nodes.map((n) => [n.id, n]));
59
- const toUpdate = [];
60
- for (const [id, { position, subtreeSize }] of computed) {
61
- const current = nodeMap.get(id);
62
- if (!current || current.position !== position || current.subtreeSize !== subtreeSize || current.positionDirty) {
63
- toUpdate.push({ id, position, subtreeSize });
64
- }
65
- }
66
- if (toUpdate.length === 0) {
67
- ctx.logger.info("Positions already correct", { scanned: nodes.length });
68
- return;
69
- }
70
- for (let i = 0; i < toUpdate.length; i += BATCH_LIMIT) {
71
- const batch = ctx.db.batch();
72
- for (const { id, position, subtreeSize } of toUpdate.slice(i, i + BATCH_LIMIT)) {
73
- batch.update(ctx.db.collection(CATEGORIES).doc(id), {
74
- position,
75
- subtreeSize,
76
- positionDirty: false,
77
- updatedAt: new Date(),
78
- });
79
- }
80
- await batch.commit();
81
- }
82
- ctx.logger.info("Positions reconciled", {
83
- scanned: nodes.length,
84
- updated: toUpdate.length,
85
- orphans: orphans.length,
86
- });
87
- };
1
+ import { runPositionsReconcile } from "../core/positionsReconcile";
2
+ export const positionsReconcileHandler = runPositionsReconcile;
@@ -1,9 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealClose — every 5 minutes.
3
- *
4
- * Flips `prizeRevealStatus` from "open" to "closed" on any prize-draw
5
- * product whose `prizeRevealWindowEnd` has passed. Pair function to
6
- * `prizeRevealOpen`. Orders past the deadline are handled by `prizeRevealExpiry`.
7
- */
8
1
  import type { ScheduleHandler } from "../runtime/types";
9
2
  export declare const prizeRevealCloseHandler: ScheduleHandler;
@@ -1,29 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealClose every 5 minutes.
3
- *
4
- * Flips `prizeRevealStatus` from "open" to "closed" on any prize-draw
5
- * product whose `prizeRevealWindowEnd` has passed. Pair function to
6
- * `prizeRevealOpen`. Orders past the deadline are handled by `prizeRevealExpiry`.
7
- */
8
- const PRODUCT_COLLECTION = "products";
9
- export const prizeRevealCloseHandler = async (ctx) => {
10
- ctx.logger.info("Prize reveal close sweep starting");
11
- const snap = await ctx.db
12
- .collection(PRODUCT_COLLECTION)
13
- .where("listingType", "==", "prize-draw")
14
- .where("prizeRevealStatus", "==", "open")
15
- .where("prizeRevealWindowEnd", "<=", ctx.now)
16
- .limit(100)
17
- .get();
18
- if (snap.empty) {
19
- ctx.logger.info("No prize draws to close");
20
- return;
21
- }
22
- const batch = ctx.db.batch();
23
- snap.docs.forEach((doc) => batch.update(doc.ref, {
24
- prizeRevealStatus: "closed",
25
- updatedAt: ctx.now,
26
- }));
27
- await batch.commit();
28
- ctx.logger.info("Closed prize draws", { count: snap.size });
29
- };
1
+ import { runPrizeRevealClose } from "../core/prizeRevealClose";
2
+ export const prizeRevealCloseHandler = runPrizeRevealClose;
@@ -1,10 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealExpiry — every 6 hours (SB8-B).
3
- *
4
- * Finds paid prize-draw orders where `prizeRevealDeadline < now` AND
5
- * `prizeWon` is unset. Marks them as REFUNDED + notifies the buyer. The
6
- * actual Razorpay refund is queued — this handler only flips the order
7
- * status so the buyer's allowance is freed up immediately.
8
- */
9
1
  import type { ScheduleHandler } from "../runtime/types";
10
2
  export declare const prizeRevealExpiryHandler: ScheduleHandler;
@@ -1,58 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealExpiry every 6 hours (SB8-B).
3
- *
4
- * Finds paid prize-draw orders where `prizeRevealDeadline < now` AND
5
- * `prizeWon` is unset. Marks them as REFUNDED + notifies the buyer. The
6
- * actual Razorpay refund is queued — this handler only flips the order
7
- * status so the buyer's allowance is freed up immediately.
8
- */
9
- import { notificationRepository } from "../../../../repositories";
10
- const ORDER_COLLECTION = "orders";
11
- export const prizeRevealExpiryHandler = async (ctx) => {
12
- ctx.logger.info("Prize reveal expiry sweep starting");
13
- const snap = await ctx.db
14
- .collection(ORDER_COLLECTION)
15
- .where("paymentStatus", "==", "paid")
16
- .where("status", "in", ["pending", "confirmed", "processing"])
17
- .where("prizeRevealDeadline", "<", ctx.now)
18
- .limit(200)
19
- .get();
20
- if (snap.empty) {
21
- ctx.logger.info("No prize-draw orders past deadline");
22
- return;
23
- }
24
- let refunded = 0;
25
- for (const doc of snap.docs) {
26
- const order = doc.data();
27
- if (order.prizeWon)
28
- continue; // already revealed
29
- if (!order.prizeDrawProductId)
30
- continue; // not a prize-draw order
31
- await doc.ref.update({
32
- status: "refunded",
33
- paymentStatus: "refunded",
34
- isNonRefundable: false,
35
- prizeRevealExpired: true,
36
- updatedAt: ctx.now,
37
- });
38
- if (order.userId) {
39
- try {
40
- await notificationRepository.create({
41
- userId: order.userId,
42
- type: "prize_reveal_expired",
43
- priority: "high",
44
- title: "Reveal deadline passed — refunded",
45
- message: `Your entry for "${order.productTitle ?? "the draw"}" expired without a reveal. We've refunded the order.`,
46
- relatedId: doc.id,
47
- relatedType: "order",
48
- actionUrl: `/user/orders/view/${doc.id}`,
49
- });
50
- }
51
- catch (err) {
52
- ctx.logger.warn("Reveal-expired notification failed", { err });
53
- }
54
- }
55
- refunded++;
56
- }
57
- ctx.logger.info("Prize reveal expiry sweep complete", { refunded });
58
- };
1
+ import { runPrizeRevealExpiry } from "../core/prizeRevealExpiry";
2
+ export const prizeRevealExpiryHandler = runPrizeRevealExpiry;
@@ -1,10 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealOpen — every 5 minutes.
3
- *
4
- * Flips `prizeRevealStatus` from "pending" to "open" on any prize-draw
5
- * product whose `prizeRevealWindowStart` has passed. Then (SB8-D) emits an
6
- * in-app notification to every buyer with an unrevealed paid order for that
7
- * draw: "Your reveal is ready — X reveals waiting. Reveal by [deadline]."
8
- */
9
1
  import type { ScheduleHandler } from "../runtime/types";
10
2
  export declare const prizeRevealOpenHandler: ScheduleHandler;
@@ -1,65 +1,2 @@
1
- /**
2
- * scheduledPrizeRevealOpen every 5 minutes.
3
- *
4
- * Flips `prizeRevealStatus` from "pending" to "open" on any prize-draw
5
- * product whose `prizeRevealWindowStart` has passed. Then (SB8-D) emits an
6
- * in-app notification to every buyer with an unrevealed paid order for that
7
- * draw: "Your reveal is ready — X reveals waiting. Reveal by [deadline]."
8
- */
9
- import { notificationRepository } from "../../../../repositories";
10
- const PRODUCT_COLLECTION = "products";
11
- const ORDER_COLLECTION = "orders";
12
- export const prizeRevealOpenHandler = async (ctx) => {
13
- ctx.logger.info("Prize reveal open sweep starting");
14
- const snap = await ctx.db
15
- .collection(PRODUCT_COLLECTION)
16
- .where("listingType", "==", "prize-draw")
17
- .where("prizeRevealStatus", "==", "pending")
18
- .where("prizeRevealWindowStart", "<=", ctx.now)
19
- .limit(100)
20
- .get();
21
- if (snap.empty) {
22
- ctx.logger.info("No prize draws to open");
23
- return;
24
- }
25
- for (const doc of snap.docs) {
26
- const product = doc.data();
27
- await doc.ref.update({
28
- prizeRevealStatus: "open",
29
- updatedAt: ctx.now,
30
- });
31
- // SB8-D — notify buyers with paid unrevealed orders.
32
- const orders = await ctx.db
33
- .collection(ORDER_COLLECTION)
34
- .where("prizeDrawProductId", "==", doc.id)
35
- .where("paymentStatus", "==", "paid")
36
- .where("status", "in", ["pending", "confirmed", "processing"])
37
- .get();
38
- let notified = 0;
39
- for (const orderDoc of orders.docs) {
40
- const order = orderDoc.data();
41
- if (!order.userId || order.prizeWon)
42
- continue;
43
- try {
44
- await notificationRepository.create({
45
- userId: order.userId,
46
- type: "prize_reveal_ready",
47
- priority: "high",
48
- title: "Your reveal is ready!",
49
- message: `Reveal your prize for "${product.title ?? "draw"}". You have ${product.prizeRevealDeadlineDays ?? 3} days to claim it.`,
50
- relatedId: orderDoc.id,
51
- relatedType: "order",
52
- actionUrl: `/user/orders/view/${orderDoc.id}`,
53
- });
54
- notified++;
55
- }
56
- catch (err) {
57
- ctx.logger.warn("Reveal-ready notification failed", { err });
58
- }
59
- }
60
- ctx.logger.info("Opened prize draw", {
61
- productId: doc.id,
62
- buyersNotified: notified,
63
- });
64
- }
65
- };
1
+ import { runPrizeRevealOpen } from "../core/prizeRevealOpen";
2
+ export const prizeRevealOpenHandler = runPrizeRevealOpen;