@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.
- package/dist/_internal/server/features/account/data.js +2 -2
- package/dist/_internal/server/features/bundles/data.d.ts +26 -6
- package/dist/_internal/server/features/bundles/data.js +41 -6
- package/dist/_internal/server/features/bundles/index.d.ts +3 -2
- package/dist/_internal/server/features/bundles/index.js +4 -2
- package/dist/_internal/server/features/bundles/metadata.d.ts +20 -0
- package/dist/_internal/server/features/bundles/metadata.js +46 -0
- package/dist/_internal/server/features/bundles/og.d.ts +38 -0
- package/dist/_internal/server/features/bundles/og.js +122 -0
- package/dist/_internal/server/features/checkout/actions.js +192 -133
- package/dist/_internal/server/features/checkout/bundle-expansion.d.ts +57 -0
- package/dist/_internal/server/features/checkout/bundle-expansion.js +70 -0
- package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +5 -15
- package/dist/_internal/server/features/checkout/prize-bundle-gates.js +5 -21
- package/dist/_internal/server/features/media/contextGuards.js +15 -1
- package/dist/_internal/server/features/payouts/actions.d.ts +19 -0
- package/dist/_internal/server/features/payouts/actions.js +38 -0
- package/dist/_internal/server/features/products/data.js +1 -2
- package/dist/_internal/server/features/raffle/actions.d.ts +11 -0
- package/dist/_internal/server/features/raffle/actions.js +31 -0
- package/dist/_internal/server/features/refunds/actions.d.ts +31 -0
- package/dist/_internal/server/features/refunds/actions.js +77 -0
- package/dist/_internal/server/jobs/core/adminAnalytics.d.ts +28 -0
- package/dist/_internal/server/jobs/core/adminAnalytics.js +98 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +19 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +81 -0
- package/dist/_internal/server/jobs/core/auctionSettlement.d.ts +2 -0
- package/dist/_internal/server/jobs/core/auctionSettlement.js +70 -0
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.d.ts +2 -0
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +109 -0
- package/dist/_internal/server/jobs/core/bundleStockSync.d.ts +10 -0
- package/dist/_internal/server/jobs/core/bundleStockSync.js +71 -0
- package/dist/_internal/server/jobs/core/cartPrune.d.ts +2 -0
- package/dist/_internal/server/jobs/core/cartPrune.js +13 -0
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.d.ts +2 -0
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +45 -0
- package/dist/_internal/server/jobs/core/countersReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/core/countersReconcile.js +107 -0
- package/dist/_internal/server/jobs/core/couponExpiry.d.ts +2 -0
- package/dist/_internal/server/jobs/core/couponExpiry.js +13 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.d.ts +2 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.js +20 -0
- package/dist/_internal/server/jobs/core/index.d.ts +44 -0
- package/dist/_internal/server/jobs/core/index.js +47 -0
- package/dist/_internal/server/jobs/core/listingProcessor.d.ts +30 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +138 -0
- package/dist/_internal/server/jobs/core/mediaTmpCleanup.d.ts +14 -0
- package/dist/_internal/server/jobs/core/mediaTmpCleanup.js +68 -0
- package/dist/_internal/server/jobs/core/notificationPrune.d.ts +2 -0
- package/dist/_internal/server/jobs/core/notificationPrune.js +13 -0
- package/dist/_internal/server/jobs/core/offerExpiry.d.ts +2 -0
- package/dist/_internal/server/jobs/core/offerExpiry.js +50 -0
- package/dist/_internal/server/jobs/core/onBidPlaced.d.ts +15 -0
- package/dist/_internal/server/jobs/core/onBidPlaced.js +59 -0
- package/dist/_internal/server/jobs/core/onCategoryWrite.d.ts +14 -0
- package/dist/_internal/server/jobs/core/onCategoryWrite.js +134 -0
- package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +18 -0
- package/dist/_internal/server/jobs/core/onOrderCreate.js +78 -0
- package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +19 -0
- package/dist/_internal/server/jobs/core/onOrderStatusChange.js +139 -0
- package/dist/_internal/server/jobs/core/onProductStockChange.d.ts +23 -0
- package/dist/_internal/server/jobs/core/onProductStockChange.js +130 -0
- package/dist/_internal/server/jobs/core/onProductWrite.d.ts +12 -0
- package/dist/_internal/server/jobs/core/onProductWrite.js +94 -0
- package/dist/_internal/server/jobs/core/onReviewWrite.d.ts +7 -0
- package/dist/_internal/server/jobs/core/onReviewWrite.js +49 -0
- package/dist/_internal/server/jobs/core/onStoreWrite.d.ts +12 -0
- package/dist/_internal/server/jobs/core/onStoreWrite.js +7 -0
- package/dist/_internal/server/jobs/core/payoutBatch.d.ts +8 -0
- package/dist/_internal/server/jobs/core/payoutBatch.js +102 -0
- package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +2 -0
- package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +27 -0
- package/dist/_internal/server/jobs/core/positionsReconcile.d.ts +7 -0
- package/dist/_internal/server/jobs/core/positionsReconcile.js +87 -0
- package/dist/_internal/server/jobs/core/prizeRevealClose.d.ts +2 -0
- package/dist/_internal/server/jobs/core/prizeRevealClose.js +22 -0
- package/dist/_internal/server/jobs/core/prizeRevealExpiry.d.ts +2 -0
- package/dist/_internal/server/jobs/core/prizeRevealExpiry.js +50 -0
- package/dist/_internal/server/jobs/core/prizeRevealOpen.d.ts +2 -0
- package/dist/_internal/server/jobs/core/prizeRevealOpen.js +56 -0
- package/dist/_internal/server/jobs/core/prizeRevealReminder.d.ts +2 -0
- package/dist/_internal/server/jobs/core/prizeRevealReminder.js +38 -0
- package/dist/_internal/server/jobs/core/productStatsSync.d.ts +8 -0
- package/dist/_internal/server/jobs/core/productStatsSync.js +36 -0
- package/dist/_internal/server/jobs/core/promotions.d.ts +12 -0
- package/dist/_internal/server/jobs/core/promotions.js +43 -0
- package/dist/_internal/server/jobs/core/storeAnalytics.d.ts +30 -0
- package/dist/_internal/server/jobs/core/storeAnalytics.js +109 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +19 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +86 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.d.ts +6 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +85 -0
- package/dist/_internal/server/jobs/handlers/adminAnalytics.d.ts +2 -26
- package/dist/_internal/server/jobs/handlers/adminAnalytics.js +2 -98
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +1 -22
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +2 -86
- package/dist/_internal/server/jobs/handlers/auctionSettlement.js +2 -70
- package/dist/_internal/server/jobs/handlers/autoPayoutEligibility.js +2 -110
- package/dist/_internal/server/jobs/handlers/bundleStockSync.d.ts +0 -16
- package/dist/_internal/server/jobs/handlers/bundleStockSync.js +2 -80
- package/dist/_internal/server/jobs/handlers/cartPrune.js +2 -13
- package/dist/_internal/server/jobs/handlers/cleanupRtdbEvents.js +2 -45
- package/dist/_internal/server/jobs/handlers/countersReconcile.js +2 -109
- package/dist/_internal/server/jobs/handlers/couponExpiry.js +2 -13
- package/dist/_internal/server/jobs/handlers/dailyDataCleanup.js +2 -20
- package/dist/_internal/server/jobs/handlers/listingProcessor.d.ts +3 -28
- package/dist/_internal/server/jobs/handlers/listingProcessor.js +3 -138
- package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.d.ts +0 -12
- package/dist/_internal/server/jobs/handlers/mediaTmpCleanup.js +2 -69
- package/dist/_internal/server/jobs/handlers/notificationPrune.js +2 -13
- package/dist/_internal/server/jobs/handlers/offerExpiry.js +2 -50
- package/dist/_internal/server/jobs/handlers/onBidPlaced.d.ts +1 -10
- package/dist/_internal/server/jobs/handlers/onBidPlaced.js +2 -56
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.d.ts +1 -8
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +6 -134
- package/dist/_internal/server/jobs/handlers/onOrderCreate.d.ts +1 -12
- package/dist/_internal/server/jobs/handlers/onOrderCreate.js +2 -76
- package/dist/_internal/server/jobs/handlers/onOrderStatusChange.d.ts +1 -12
- package/dist/_internal/server/jobs/handlers/onOrderStatusChange.js +2 -139
- package/dist/_internal/server/jobs/handlers/onProductStockChange.d.ts +0 -13
- package/dist/_internal/server/jobs/handlers/onProductStockChange.js +7 -134
- package/dist/_internal/server/jobs/handlers/onProductWrite.d.ts +1 -6
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +6 -106
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +2 -49
- package/dist/_internal/server/jobs/handlers/onStoreWrite.d.ts +1 -8
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +7 -8
- package/dist/_internal/server/jobs/handlers/payoutBatch.d.ts +0 -9
- package/dist/_internal/server/jobs/handlers/payoutBatch.js +2 -104
- package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.d.ts +0 -6
- package/dist/_internal/server/jobs/handlers/pendingOrderTimeout.js +2 -33
- package/dist/_internal/server/jobs/handlers/positionsReconcile.d.ts +0 -5
- package/dist/_internal/server/jobs/handlers/positionsReconcile.js +2 -87
- package/dist/_internal/server/jobs/handlers/prizeRevealClose.d.ts +0 -7
- package/dist/_internal/server/jobs/handlers/prizeRevealClose.js +2 -29
- package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.d.ts +0 -8
- package/dist/_internal/server/jobs/handlers/prizeRevealExpiry.js +2 -58
- package/dist/_internal/server/jobs/handlers/prizeRevealOpen.d.ts +0 -8
- package/dist/_internal/server/jobs/handlers/prizeRevealOpen.js +2 -65
- package/dist/_internal/server/jobs/handlers/prizeRevealReminder.d.ts +0 -7
- package/dist/_internal/server/jobs/handlers/prizeRevealReminder.js +2 -45
- package/dist/_internal/server/jobs/handlers/productStatsSync.d.ts +0 -6
- package/dist/_internal/server/jobs/handlers/productStatsSync.js +2 -36
- package/dist/_internal/server/jobs/handlers/promotions.d.ts +2 -10
- package/dist/_internal/server/jobs/handlers/promotions.js +2 -43
- package/dist/_internal/server/jobs/handlers/storeAnalytics.d.ts +2 -28
- package/dist/_internal/server/jobs/handlers/storeAnalytics.js +2 -109
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +1 -28
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +2 -94
- package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.d.ts +0 -6
- package/dist/_internal/server/jobs/handlers/weeklyPayoutEligibility.js +2 -87
- package/dist/_internal/server/jobs/index.d.ts +1 -0
- package/dist/_internal/server/jobs/index.js +1 -0
- package/dist/_internal/server/jobs/runtime/adapters/firebase.js +21 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +84 -0
- package/dist/_internal/shared/actions/action-registry.js +160 -0
- package/dist/_internal/shared/checkout/rules/_defaults.d.ts +3 -0
- package/dist/_internal/shared/checkout/rules/_defaults.js +22 -0
- package/dist/_internal/shared/checkout/rules/_limits.d.ts +19 -0
- package/dist/_internal/shared/checkout/rules/_limits.js +19 -0
- package/dist/_internal/shared/checkout/rules/_registry.d.ts +44 -0
- package/dist/_internal/shared/checkout/rules/_registry.js +87 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/auction.rule.js +10 -0
- package/dist/_internal/shared/checkout/rules/bundle.rule.d.ts +11 -0
- package/dist/_internal/shared/checkout/rules/bundle.rule.js +6 -0
- package/dist/_internal/shared/checkout/rules/classified.rule.d.ts +9 -0
- package/dist/_internal/shared/checkout/rules/classified.rule.js +9 -0
- package/dist/_internal/shared/checkout/rules/digital-code.rule.d.ts +8 -0
- package/dist/_internal/shared/checkout/rules/digital-code.rule.js +6 -0
- package/dist/_internal/shared/checkout/rules/index.d.ts +12 -0
- package/dist/_internal/shared/checkout/rules/index.js +12 -0
- package/dist/_internal/shared/checkout/rules/live.rule.d.ts +10 -0
- package/dist/_internal/shared/checkout/rules/live.rule.js +6 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/offer.rule.js +9 -0
- package/dist/_internal/shared/checkout/rules/preorder.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/preorder.rule.js +28 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +65 -0
- package/dist/_internal/shared/checkout/rules/standard.rule.d.ts +2 -0
- package/dist/_internal/shared/checkout/rules/standard.rule.js +5 -0
- package/dist/_internal/shared/checkout/rules/types.d.ts +125 -0
- package/dist/_internal/shared/checkout/rules/types.js +13 -0
- package/dist/_internal/shared/features/cart/schema.d.ts +6 -6
- package/dist/_internal/shared/features/categories/bundle-copy.d.ts +123 -0
- package/dist/_internal/shared/features/categories/bundle-copy.js +134 -0
- package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +318 -0
- package/dist/_internal/shared/features/categories/bundle-schemas.js +55 -0
- package/dist/_internal/shared/features/events/schema.d.ts +4 -4
- package/dist/_internal/shared/features/orders/refund-copy.d.ts +36 -0
- package/dist/_internal/shared/features/orders/refund-copy.js +40 -0
- package/dist/_internal/shared/features/orders/schema.d.ts +4 -4
- package/dist/_internal/shared/features/products/schema.d.ts +8 -8
- package/dist/_internal/shared/listing-types/_registry.d.ts +27 -0
- package/dist/_internal/shared/listing-types/_registry.js +8 -0
- package/dist/_internal/shared/listing-types/action-tracker.d.ts +41 -0
- package/dist/_internal/shared/listing-types/action-tracker.js +70 -0
- package/dist/_internal/shared/listing-types/capabilities.js +25 -0
- package/dist/_internal/shared/listing-types/cart-shipping.d.ts +37 -0
- package/dist/_internal/shared/listing-types/cart-shipping.js +46 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +7 -0
- package/dist/_internal/shared/listing-types/classified/config.js +8 -0
- package/dist/_internal/shared/listing-types/classified/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/ctas.js +3 -0
- package/dist/_internal/shared/listing-types/classified/og.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/og.js +1 -0
- package/dist/_internal/shared/listing-types/classified/schema.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/schema.js +1 -0
- package/dist/_internal/shared/listing-types/classified/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +7 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +8 -0
- package/dist/_internal/shared/listing-types/digital-code/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/ctas.js +3 -0
- package/dist/_internal/shared/listing-types/digital-code/og.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/og.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/schema.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/schema.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/seed-factory.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +34 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +45 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +7 -0
- package/dist/_internal/shared/listing-types/live/config.js +8 -0
- package/dist/_internal/shared/listing-types/live/ctas.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/ctas.js +3 -0
- package/dist/_internal/shared/listing-types/live/og.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/og.js +1 -0
- package/dist/_internal/shared/listing-types/live/schema.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/schema.js +1 -0
- package/dist/_internal/shared/listing-types/live/seed-factory.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/seed-factory.js +1 -0
- package/dist/_internal/shared/media/limits.js +8 -0
- package/dist/client.d.ts +10 -5
- package/dist/client.js +16 -3
- package/dist/configs/next.js +7 -0
- package/dist/constants/api-endpoints.d.ts +6 -0
- package/dist/constants/api-endpoints.js +4 -0
- package/dist/core/hooks/useSyncManager.js +13 -1
- package/dist/core/unit-of-work.d.ts +1 -1
- package/dist/core/unit-of-work.js +2 -2
- package/dist/features/account/actions/address-actions.d.ts +1 -1
- package/dist/features/account/actions/address-actions.js +15 -7
- package/dist/features/account/schemas/firestore.d.ts +8 -43
- package/dist/features/account/schemas/firestore.js +8 -54
- package/dist/features/account/schemas/index.d.ts +6 -6
- package/dist/features/account/server.d.ts +1 -1
- package/dist/features/account/server.js +3 -1
- package/dist/features/addresses/index.d.ts +2 -0
- package/dist/features/addresses/index.js +2 -0
- package/dist/features/addresses/repository/addresses.repository.d.ts +29 -0
- package/dist/features/addresses/repository/addresses.repository.js +157 -0
- package/dist/features/addresses/schemas/firestore.d.ts +53 -0
- package/dist/features/addresses/schemas/firestore.js +68 -0
- package/dist/features/{bundles → addresses}/schemas/index.d.ts +0 -1
- package/dist/features/{bundles → addresses}/schemas/index.js +0 -1
- package/dist/features/addresses/server.d.ts +2 -0
- package/dist/features/addresses/server.js +2 -0
- package/dist/features/admin/components/AdminAllEventEntriesView.js +4 -3
- package/dist/features/admin/components/AdminBidsView.js +4 -3
- package/dist/features/admin/components/AdminBlogView.js +8 -3
- package/dist/features/admin/components/AdminBundleEditorView.d.ts +9 -0
- package/dist/features/admin/components/AdminBundleEditorView.js +209 -0
- package/dist/features/admin/components/AdminBundlesView.d.ts +9 -0
- package/dist/features/admin/components/AdminBundlesView.js +59 -0
- package/dist/features/admin/components/AdminCartsView.js +13 -3
- package/dist/features/admin/components/AdminContactView.js +4 -3
- package/dist/features/admin/components/AdminCouponsView.js +32 -13
- package/dist/features/admin/components/AdminNewsletterView.js +4 -3
- package/dist/features/admin/components/AdminOrdersView.js +15 -7
- package/dist/features/admin/components/AdminPayoutsView.js +4 -3
- package/dist/features/admin/components/AdminPrizeDrawsView.d.ts +4 -0
- package/dist/features/admin/components/AdminPrizeDrawsView.js +135 -0
- package/dist/features/admin/components/AdminProductsView.js +6 -5
- package/dist/features/admin/components/AdminReviewsView.js +5 -4
- package/dist/features/admin/components/AdminStoresView.js +4 -3
- package/dist/features/admin/components/AdminUsersView.js +15 -5
- package/dist/features/admin/components/AdminWishlistsView.js +10 -1
- package/dist/features/admin/components/DataTable.d.ts +5 -1
- package/dist/features/admin/components/DataTable.js +24 -20
- package/dist/features/admin/components/index.d.ts +6 -0
- package/dist/features/admin/components/index.js +5 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +435 -0
- package/dist/features/admin/constants/filter-tabs.js +216 -0
- package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -0
- package/dist/features/admin/hooks/useAdminListingData.js +1 -0
- package/dist/features/admin/schemas/firestore.d.ts +15 -0
- package/dist/features/admin/schemas/firestore.js +18 -0
- package/dist/features/admin/types/product.types.d.ts +2 -2
- package/dist/features/auctions/components/AuctionCard.d.ts +4 -1
- package/dist/features/auctions/components/AuctionCard.js +5 -3
- package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +2 -2
- package/dist/features/auctions/components/PlaceBidFormClient.js +12 -2
- package/dist/features/auctions/schemas/index.d.ts +2 -2
- package/dist/features/auth/index.d.ts +1 -0
- package/dist/features/auth/index.js +1 -0
- package/dist/features/auth/role-predicates.d.ts +16 -0
- package/dist/features/auth/role-predicates.js +15 -0
- package/dist/features/blog/components/BlogFeaturedCard.d.ts +4 -1
- package/dist/features/blog/components/BlogFeaturedCard.js +5 -3
- package/dist/features/cart/actions/cart-actions.d.ts +1 -0
- package/dist/features/cart/actions/cart-actions.js +16 -0
- package/dist/features/cart/components/CartView.d.ts +19 -1
- package/dist/features/cart/components/CartView.js +2 -2
- package/dist/features/cart/components/ShippingPicker.d.ts +13 -0
- package/dist/features/cart/components/ShippingPicker.js +48 -0
- package/dist/features/cart/components/index.d.ts +3 -1
- package/dist/features/cart/components/index.js +1 -0
- package/dist/features/cart/hooks/useCartCount.js +7 -1
- package/dist/features/cart/repository/cart.repository.d.ts +1 -0
- package/dist/features/cart/repository/cart.repository.js +35 -0
- package/dist/features/cart/schemas/firestore.d.ts +27 -2
- package/dist/features/categories/components/BundleAddToCartCta.d.ts +16 -0
- package/dist/features/categories/components/BundleAddToCartCta.js +54 -0
- package/dist/features/categories/components/BundleBuyNowCta.d.ts +8 -0
- package/dist/features/categories/components/BundleBuyNowCta.js +37 -0
- package/dist/features/categories/components/BundleDetailView.d.ts +22 -0
- package/dist/features/categories/components/BundleDetailView.js +31 -0
- package/dist/features/categories/components/BundleDynamicRuleEditor.d.ts +18 -0
- package/dist/features/categories/components/BundleDynamicRuleEditor.js +60 -0
- package/dist/features/categories/components/BundleItemsPicker.d.ts +26 -0
- package/dist/features/categories/components/BundleItemsPicker.js +135 -0
- package/dist/features/categories/components/BundlesListView.d.ts +13 -0
- package/dist/features/categories/components/BundlesListView.js +27 -0
- package/dist/features/categories/components/index.d.ts +12 -0
- package/dist/features/categories/components/index.js +9 -0
- package/dist/features/checkout/actions/checkout-actions.js +10 -3
- package/dist/features/events/components/AdminEventEditorView.js +108 -2
- package/dist/features/events/components/AdminEventsView.js +16 -4
- package/dist/features/events/components/EventCard.d.ts +4 -1
- package/dist/features/events/components/EventCard.js +7 -3
- package/dist/features/events/components/EventRaffleWinnerView.d.ts +21 -0
- package/dist/features/events/components/EventRaffleWinnerView.js +18 -0
- package/dist/features/events/components/SpinWheelView.d.ts +27 -0
- package/dist/features/events/components/SpinWheelView.js +64 -0
- package/dist/features/events/components/index.d.ts +4 -0
- package/dist/features/events/components/index.js +2 -0
- package/dist/features/events/schemas/firestore.d.ts +27 -1
- package/dist/features/events/schemas/firestore.js +7 -0
- package/dist/features/events/types/index.d.ts +27 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.d.ts +16 -0
- package/dist/features/homepage/components/FeaturedBundlesSection.js +24 -0
- package/dist/features/homepage/components/MarketplaceHomepageView.js +4 -1
- package/dist/features/homepage/components/WhatsAppCommunitySection.js +2 -2
- package/dist/features/homepage/lib/section-renderer.d.ts +2 -0
- package/dist/features/homepage/lib/section-renderer.js +5 -5
- package/dist/features/layout/NavbarLayout.d.ts +3 -1
- package/dist/features/layout/NavbarLayout.js +32 -3
- package/dist/features/layout/TitleBarLayout.d.ts +6 -3
- package/dist/features/layout/TitleBarLayout.js +22 -7
- package/dist/features/media/upload/MediaUploadField.d.ts +15 -1
- package/dist/features/media/upload/MediaUploadField.js +22 -1
- package/dist/features/orders/components/MarketplaceOrderCard.js +4 -2
- package/dist/features/orders/components/OrderSiblingPayments.d.ts +8 -0
- package/dist/features/orders/components/OrderSiblingPayments.js +16 -0
- package/dist/features/orders/components/RefundHistoryTable.d.ts +6 -0
- package/dist/features/orders/components/RefundHistoryTable.js +23 -0
- package/dist/features/orders/components/RefundRequestView.d.ts +8 -0
- package/dist/features/orders/components/RefundRequestView.js +42 -0
- package/dist/features/orders/components/index.d.ts +6 -0
- package/dist/features/orders/components/index.js +3 -0
- package/dist/features/orders/index.d.ts +1 -0
- package/dist/features/orders/index.js +2 -0
- package/dist/features/orders/repository/orders.repository.d.ts +20 -1
- package/dist/features/orders/repository/orders.repository.js +30 -1
- package/dist/features/orders/schemas/firestore.d.ts +63 -13
- package/dist/features/orders/schemas/firestore.js +5 -5
- package/dist/features/orders/schemas/index.d.ts +4 -4
- package/dist/features/orders/types/index.d.ts +12 -2
- package/dist/features/orders/utils/bundle-grouping.d.ts +48 -0
- package/dist/features/orders/utils/bundle-grouping.js +54 -0
- package/dist/features/orders/utils/order-splitter.d.ts +9 -10
- package/dist/features/orders/utils/order-splitter.js +24 -30
- package/dist/features/payments/repository/payout.repository.d.ts +17 -1
- package/dist/features/payments/repository/payout.repository.js +47 -0
- package/dist/features/payments/schemas/firestore.d.ts +26 -0
- package/dist/features/pre-orders/components/PreorderCard.d.ts +4 -1
- package/dist/features/pre-orders/components/PreorderCard.js +8 -6
- package/dist/features/products/actions/product-actions.d.ts +1 -1
- package/dist/features/products/actions/product-actions.js +1 -1
- package/dist/features/products/components/CompareOverlay.d.ts +2 -2
- package/dist/features/products/components/CompareOverlay.js +4 -4
- package/dist/features/products/components/InteractiveProductCard.js +7 -12
- package/dist/features/products/components/NonRefundableConsentModal.d.ts +1 -1
- package/dist/features/products/components/NonRefundableConsentModal.js +0 -10
- package/dist/features/products/components/ProductGrid.js +28 -12
- package/dist/features/products/components/ShowGroupSection.js +3 -3
- package/dist/features/products/components/SublistingCarouselSection.js +2 -2
- package/dist/features/products/components/index.d.ts +0 -4
- package/dist/features/products/components/index.js +5 -2
- package/dist/features/products/index.d.ts +1 -1
- package/dist/features/products/index.js +3 -1
- package/dist/features/products/repository/products.repository.js +4 -0
- package/dist/features/products/schemas/catalog-product.d.ts +70 -0
- package/dist/features/products/schemas/catalog-product.js +50 -0
- package/dist/features/products/schemas/firestore.d.ts +110 -2
- package/dist/features/products/schemas/firestore.js +30 -0
- package/dist/features/products/schemas/index.d.ts +8 -8
- package/dist/features/products/types/index.d.ts +1 -1
- package/dist/features/products/utils/listing-type.d.ts +9 -0
- package/dist/features/products/utils/listing-type.js +4 -0
- package/dist/features/promotions/actions/coupon-actions.d.ts +2 -2
- package/dist/features/promotions/actions/coupon-actions.js +1 -1
- package/dist/features/promotions/components/CouponCard.d.ts +28 -10
- package/dist/features/promotions/components/CouponCard.js +116 -14
- package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
- package/dist/features/promotions/repository/coupons.repository.d.ts +1 -1
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/search/schemas/index.d.ts +2 -2
- package/dist/features/search/types/index.d.ts +2 -2
- package/dist/features/seller/components/SellerAuctionsView.js +4 -5
- package/dist/features/seller/components/SellerBidsView.js +5 -13
- package/dist/features/seller/components/SellerCouponsView.js +31 -67
- package/dist/features/seller/components/SellerOffersView.js +4 -5
- package/dist/features/seller/components/SellerOrdersView.js +4 -5
- package/dist/features/seller/components/SellerPayoutsView.js +4 -5
- package/dist/features/seller/components/SellerPreOrdersView.d.ts +4 -0
- package/dist/features/seller/components/SellerPreOrdersView.js +141 -0
- package/dist/features/seller/components/SellerPrizeDrawsView.d.ts +4 -0
- package/dist/features/seller/components/SellerPrizeDrawsView.js +138 -0
- package/dist/features/seller/components/SellerProductsView.js +4 -8
- package/dist/features/seller/components/index.d.ts +4 -0
- package/dist/features/seller/components/index.js +2 -0
- package/dist/features/seller/schemas/index.d.ts +2 -2
- package/dist/features/stores/actions/store-address-actions.d.ts +10 -6
- package/dist/features/stores/actions/store-address-actions.js +8 -7
- package/dist/features/stores/components/InteractiveStoreCard.js +3 -10
- package/dist/features/stores/components/StoreDetailLayoutView.js +20 -5
- package/dist/features/stores/schemas/firestore.d.ts +45 -38
- package/dist/features/stores/schemas/firestore.js +2 -49
- package/dist/features/stores/server.d.ts +0 -1
- package/dist/features/stores/server.js +2 -1
- package/dist/features/wishlist/hooks/useWishlistCount.d.ts +7 -9
- package/dist/features/wishlist/hooks/useWishlistCount.js +67 -86
- package/dist/features/wishlist/types/index.d.ts +1 -1
- package/dist/index.d.ts +56 -9
- package/dist/index.js +66 -11
- package/dist/next/routing/route-map.d.ts +6 -0
- package/dist/next/routing/route-map.js +4 -0
- package/dist/providers/db-firebase/admin.d.ts +6 -2
- package/dist/providers/db-firebase/admin.js +23 -0
- package/dist/repositories/index.d.ts +1 -2
- package/dist/repositories/index.js +5 -2
- package/dist/security/authorization.d.ts +2 -1
- package/dist/security/authorization.js +3 -2
- package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +77 -2
- package/dist/seed/cart-seed-data.d.ts +10 -10
- package/dist/seed/cart-seed-data.js +15 -15
- package/dist/seed/events-seed-data.js +77 -0
- package/dist/seed/manifest.js +16 -8
- package/dist/seed/orders-seed-data.js +41 -2
- package/dist/seed/payouts-seed-data.js +18 -2
- package/dist/seed/stores-seed-data.js +55 -0
- package/dist/server-entry.d.ts +1 -0
- package/dist/server-entry.js +2 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.js +8 -0
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/FilterChipGroup.d.ts +39 -0
- package/dist/ui/components/FilterChipGroup.js +15 -0
- package/dist/ui/components/HorizontalScroller.js +32 -7
- package/dist/ui/components/HorizontalScroller.style.css +6 -0
- package/dist/ui/components/SiteLogo.js +1 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +2 -0
- package/dist/utils/id-generators.d.ts +11 -0
- package/dist/utils/id-generators.js +16 -0
- package/package.json +1 -1
- package/dist/_internal/shared/features/bundles/config.d.ts +0 -6
- package/dist/_internal/shared/features/bundles/config.js +0 -6
- package/dist/_internal/shared/schema-versions.d.ts +0 -76
- package/dist/_internal/shared/schema-versions.js +0 -82
- package/dist/features/account/migrations.d.ts +0 -2
- package/dist/features/account/migrations.js +0 -10
- package/dist/features/admin/migrations.d.ts +0 -2
- package/dist/features/admin/migrations.js +0 -10
- package/dist/features/auctions/migrations.d.ts +0 -2
- package/dist/features/auctions/migrations.js +0 -10
- package/dist/features/auth/migrations.d.ts +0 -2
- package/dist/features/auth/migrations.js +0 -10
- package/dist/features/blog/migrations.d.ts +0 -2
- package/dist/features/blog/migrations.js +0 -10
- package/dist/features/brands/actions/brand-actions.d.ts +0 -2
- package/dist/features/brands/actions/brand-actions.js +0 -5
- package/dist/features/brands/index.d.ts +0 -3
- package/dist/features/brands/index.js +0 -3
- package/dist/features/brands/migrations.d.ts +0 -2
- package/dist/features/brands/migrations.js +0 -10
- package/dist/features/brands/repository/brands.repository.d.ts +0 -13
- package/dist/features/brands/repository/brands.repository.js +0 -60
- package/dist/features/brands/schemas/index.d.ts +0 -33
- package/dist/features/brands/schemas/index.js +0 -15
- package/dist/features/brands/server.d.ts +0 -7
- package/dist/features/brands/server.js +0 -7
- package/dist/features/bundles/components/AdminBundleEditorView.d.ts +0 -8
- package/dist/features/bundles/components/AdminBundleEditorView.js +0 -7
- package/dist/features/bundles/components/BundleDetailPageView.d.ts +0 -9
- package/dist/features/bundles/components/BundleDetailPageView.js +0 -45
- package/dist/features/bundles/components/BundleForm.d.ts +0 -12
- package/dist/features/bundles/components/BundleForm.js +0 -126
- package/dist/features/bundles/components/BundleItemsPicker.d.ts +0 -9
- package/dist/features/bundles/components/BundleItemsPicker.js +0 -77
- package/dist/features/bundles/components/BundlesByCategoryListing.d.ts +0 -6
- package/dist/features/bundles/components/BundlesByCategoryListing.js +0 -50
- package/dist/features/bundles/components/BundlesListingView.d.ts +0 -17
- package/dist/features/bundles/components/BundlesListingView.js +0 -50
- package/dist/features/bundles/components/FeaturedBundlesSection.d.ts +0 -5
- package/dist/features/bundles/components/FeaturedBundlesSection.js +0 -55
- package/dist/features/bundles/components/SellerBundleCreateView.d.ts +0 -8
- package/dist/features/bundles/components/SellerBundleCreateView.js +0 -7
- package/dist/features/bundles/components/SellerBundleEditView.d.ts +0 -9
- package/dist/features/bundles/components/SellerBundleEditView.js +0 -7
- package/dist/features/bundles/components/index.d.ts +0 -18
- package/dist/features/bundles/components/index.js +0 -9
- package/dist/features/bundles/constants/index.d.ts +0 -32
- package/dist/features/bundles/constants/index.js +0 -35
- package/dist/features/bundles/index.d.ts +0 -2
- package/dist/features/bundles/index.js +0 -2
- package/dist/features/bundles/migrations.d.ts +0 -2
- package/dist/features/bundles/migrations.js +0 -10
- package/dist/features/bundles/repository/bundles.repository.d.ts +0 -36
- package/dist/features/bundles/repository/bundles.repository.js +0 -148
- package/dist/features/bundles/repository/index.d.ts +0 -1
- package/dist/features/bundles/repository/index.js +0 -1
- package/dist/features/bundles/schemas/firestore.d.ts +0 -88
- package/dist/features/bundles/schemas/firestore.js +0 -29
- package/dist/features/bundles/schemas/zod.d.ts +0 -377
- package/dist/features/bundles/schemas/zod.js +0 -71
- package/dist/features/cart/migrations.d.ts +0 -2
- package/dist/features/cart/migrations.js +0 -10
- package/dist/features/categories/migrations.d.ts +0 -2
- package/dist/features/categories/migrations.js +0 -10
- package/dist/features/events/migrations.d.ts +0 -2
- package/dist/features/events/migrations.js +0 -10
- package/dist/features/faq/migrations.d.ts +0 -2
- package/dist/features/faq/migrations.js +0 -10
- package/dist/features/grouped/migrations.d.ts +0 -2
- package/dist/features/grouped/migrations.js +0 -10
- package/dist/features/history/migrations.d.ts +0 -2
- package/dist/features/history/migrations.js +0 -10
- package/dist/features/messages/migrations.d.ts +0 -2
- package/dist/features/messages/migrations.js +0 -10
- package/dist/features/orders/migrations.d.ts +0 -2
- package/dist/features/orders/migrations.js +0 -10
- package/dist/features/payments/migrations.d.ts +0 -2
- package/dist/features/payments/migrations.js +0 -10
- package/dist/features/products/migrations.d.ts +0 -2
- package/dist/features/products/migrations.js +0 -10
- package/dist/features/products/repository/sublisting-categories.repository.d.ts +0 -16
- package/dist/features/products/repository/sublisting-categories.repository.js +0 -126
- package/dist/features/products/schemas/sublisting-categories.d.ts +0 -45
- package/dist/features/products/schemas/sublisting-categories.js +0 -16
- package/dist/features/promotions/migrations.d.ts +0 -2
- package/dist/features/promotions/migrations.js +0 -10
- package/dist/features/reviews/migrations.d.ts +0 -2
- package/dist/features/reviews/migrations.js +0 -10
- package/dist/features/scams/migrations.d.ts +0 -2
- package/dist/features/scams/migrations.js +0 -10
- package/dist/features/seller/migrations.d.ts +0 -2
- package/dist/features/seller/migrations.js +0 -10
- package/dist/features/stores/migrations.d.ts +0 -2
- package/dist/features/stores/migrations.js +0 -10
- package/dist/features/sublisting/migrations.d.ts +0 -2
- package/dist/features/sublisting/migrations.js +0 -10
- package/dist/features/sublisting/schemas/firestore.d.ts +0 -32
- package/dist/features/sublisting/schemas/firestore.js +0 -19
- package/dist/features/support/migrations.d.ts +0 -2
- package/dist/features/support/migrations.js +0 -10
- package/dist/features/wishlist/migrations.d.ts +0 -2
- package/dist/features/wishlist/migrations.js +0 -10
- package/dist/seed/_bundle-constants.d.ts +0 -14
- package/dist/seed/_bundle-constants.js +0 -14
- package/dist/seed/anime-figures-seed-data.d.ts +0 -8
- package/dist/seed/anime-figures-seed-data.js +0 -1033
- package/dist/seed/beyblade-seed-data.d.ts +0 -7
- package/dist/seed/beyblade-seed-data.js +0 -1129
- package/dist/seed/brands-seed-data.d.ts +0 -7
- package/dist/seed/brands-seed-data.js +0 -410
- package/dist/seed/bundles-seed-data.d.ts +0 -13
- package/dist/seed/bundles-seed-data.js +0 -229
- package/dist/seed/cosplay-accessories-seed-data.d.ts +0 -8
- package/dist/seed/cosplay-accessories-seed-data.js +0 -647
- package/dist/seed/hot-wheels-seed-data.d.ts +0 -7
- package/dist/seed/hot-wheels-seed-data.js +0 -1612
- package/dist/seed/letitrip-official-seed-data.d.ts +0 -8
- package/dist/seed/letitrip-official-seed-data.js +0 -399
- package/dist/seed/pokemon-carousel-slides-seed-data.d.ts +0 -8
- package/dist/seed/pokemon-carousel-slides-seed-data.js +0 -322
- package/dist/seed/pokemon-categories-seed-data.d.ts +0 -24
- package/dist/seed/pokemon-categories-seed-data.js +0 -547
- package/dist/seed/pokemon-coupons-seed-data.d.ts +0 -6
- package/dist/seed/pokemon-coupons-seed-data.js +0 -465
- package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +0 -7
- package/dist/seed/pokemon-homepage-sections-seed-data.js +0 -241
- package/dist/seed/pokemon-products-seed-data.d.ts +0 -9
- package/dist/seed/pokemon-products-seed-data.js +0 -1791
- package/dist/seed/pokemon-seed-bundle.d.ts +0 -47
- package/dist/seed/pokemon-seed-bundle.js +0 -71
- package/dist/seed/pokemon-stores-seed-data.d.ts +0 -6
- package/dist/seed/pokemon-stores-seed-data.js +0 -179
- package/dist/seed/pokemon-users-seed-data.d.ts +0 -6
- package/dist/seed/pokemon-users-seed-data.js +0 -521
- package/dist/seed/products-seed-data.d.ts +0 -6
- package/dist/seed/products-seed-data.js +0 -2530
- package/dist/seed/retro-gaming-seed-data.d.ts +0 -8
- package/dist/seed/retro-gaming-seed-data.js +0 -801
- package/dist/seed/server.d.ts +0 -2
- package/dist/seed/server.js +0 -7
- package/dist/seed/sublisting-categories-seed-data.d.ts +0 -7
- package/dist/seed/sublisting-categories-seed-data.js +0 -159
- package/dist/seed/transformers-seed-data.d.ts +0 -7
- package/dist/seed/transformers-seed-data.js +0 -530
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* scheduledPrizeRevealReminder — daily 10am IST (SB8-E).
|
|
3
|
-
*
|
|
4
|
-
* Notifies users whose prize-draw reveals expire in the next 24 hours and
|
|
5
|
-
* haven't been claimed yet. Triggered once a day so users get exactly one
|
|
6
|
-
* nudge before the auto-refund kicks in.
|
|
7
|
-
*/
|
|
8
1
|
import type { ScheduleHandler } from "../runtime/types";
|
|
9
2
|
export declare const prizeRevealReminderHandler: ScheduleHandler;
|
|
@@ -1,45 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Notifies users whose prize-draw reveals expire in the next 24 hours and
|
|
5
|
-
* haven't been claimed yet. Triggered once a day so users get exactly one
|
|
6
|
-
* nudge before the auto-refund kicks in.
|
|
7
|
-
*/
|
|
8
|
-
import { notificationRepository } from "../../../../repositories";
|
|
9
|
-
const ORDER_COLLECTION = "orders";
|
|
10
|
-
const ONE_DAY_MS = 86400000;
|
|
11
|
-
export const prizeRevealReminderHandler = async (ctx) => {
|
|
12
|
-
ctx.logger.info("Prize reveal reminder sweep starting");
|
|
13
|
-
const cutoff = new Date(ctx.now.getTime() + ONE_DAY_MS);
|
|
14
|
-
const snap = await ctx.db
|
|
15
|
-
.collection(ORDER_COLLECTION)
|
|
16
|
-
.where("paymentStatus", "==", "paid")
|
|
17
|
-
.where("status", "in", ["pending", "confirmed", "processing"])
|
|
18
|
-
.where("prizeRevealDeadline", "<=", cutoff)
|
|
19
|
-
.where("prizeRevealDeadline", ">", ctx.now)
|
|
20
|
-
.limit(500)
|
|
21
|
-
.get();
|
|
22
|
-
let notified = 0;
|
|
23
|
-
for (const doc of snap.docs) {
|
|
24
|
-
const order = doc.data();
|
|
25
|
-
if (!order.userId || order.prizeWon || !order.prizeDrawProductId)
|
|
26
|
-
continue;
|
|
27
|
-
try {
|
|
28
|
-
await notificationRepository.create({
|
|
29
|
-
userId: order.userId,
|
|
30
|
-
type: "prize_reveal_reminder",
|
|
31
|
-
priority: "normal",
|
|
32
|
-
title: "Reveal expires within 24h",
|
|
33
|
-
message: `Reveal your prize for "${order.productTitle ?? "the draw"}" today — unclaimed reveals are auto-refunded after the deadline.`,
|
|
34
|
-
relatedId: doc.id,
|
|
35
|
-
relatedType: "order",
|
|
36
|
-
actionUrl: `/user/orders/view/${doc.id}`,
|
|
37
|
-
});
|
|
38
|
-
notified++;
|
|
39
|
-
}
|
|
40
|
-
catch (err) {
|
|
41
|
-
ctx.logger.warn("Reveal reminder notification failed", { err });
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
ctx.logger.info("Prize reveal reminder sweep complete", { notified });
|
|
45
|
-
};
|
|
1
|
+
import { runPrizeRevealReminder } from "../core/prizeRevealReminder";
|
|
2
|
+
export const prizeRevealReminderHandler = runPrizeRevealReminder;
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Job handler: recompute avgRating + reviewCount on every published product
|
|
3
|
-
* from approved reviews. Heals drift from partial writes / moderation changes.
|
|
4
|
-
*
|
|
5
|
-
* Concurrency capped at 5 to avoid Firestore read-rate spikes.
|
|
6
|
-
*/
|
|
7
1
|
import type { ScheduleHandler } from "../runtime/types";
|
|
8
2
|
export declare const productStatsSyncHandler: ScheduleHandler;
|
|
@@ -1,36 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* from approved reviews. Heals drift from partial writes / moderation changes.
|
|
4
|
-
*
|
|
5
|
-
* Concurrency capped at 5 to avoid Firestore read-rate spikes.
|
|
6
|
-
*/
|
|
7
|
-
import { productRepository, reviewRepository } from "../../../../repositories";
|
|
8
|
-
const CONCURRENCY = 5;
|
|
9
|
-
async function syncOne(productId) {
|
|
10
|
-
const { count, avgRating } = await reviewRepository.getApprovedRatingAggregate(productId);
|
|
11
|
-
await productRepository.update(productId, { avgRating, reviewCount: count });
|
|
12
|
-
}
|
|
13
|
-
export const productStatsSyncHandler = async (ctx) => {
|
|
14
|
-
ctx.logger.info("Starting product stats sync");
|
|
15
|
-
const productIds = await productRepository.getPublishedIds();
|
|
16
|
-
if (productIds.length === 0) {
|
|
17
|
-
ctx.logger.info("No published products found");
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
ctx.logger.info(`Syncing stats for ${productIds.length} product(s)`);
|
|
21
|
-
let succeeded = 0;
|
|
22
|
-
let failed = 0;
|
|
23
|
-
for (let i = 0; i < productIds.length; i += CONCURRENCY) {
|
|
24
|
-
const slice = productIds.slice(i, i + CONCURRENCY);
|
|
25
|
-
const results = await Promise.allSettled(slice.map(syncOne));
|
|
26
|
-
for (const r of results) {
|
|
27
|
-
if (r.status === "fulfilled")
|
|
28
|
-
succeeded++;
|
|
29
|
-
else {
|
|
30
|
-
failed++;
|
|
31
|
-
ctx.logger.error("Failed to sync product stats", r.reason);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
ctx.logger.info("Product stats sync complete", { succeeded, failed });
|
|
36
|
-
};
|
|
1
|
+
import { runProductStatsSync } from "../core/productStatsSync";
|
|
2
|
+
export const productStatsSyncHandler = runProductStatsSync;
|
|
@@ -1,12 +1,4 @@
|
|
|
1
1
|
import type { CallableHandler } from "../runtime/types";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
featuredProducts: unknown[];
|
|
5
|
-
activeCoupons: unknown[];
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Callable handler for promotions data — promoted + featured products and
|
|
9
|
-
* active coupons. Wraps the listing query that needs an OR-shaped
|
|
10
|
-
* (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
|
|
11
|
-
*/
|
|
2
|
+
import { type PromotionsCallableResult } from "../core/promotions";
|
|
3
|
+
export type { PromotionsCallableResult };
|
|
12
4
|
export declare const promotionsHandler: CallableHandler<void, PromotionsCallableResult>;
|
|
@@ -1,43 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Callable handler for promotions data — promoted + featured products and
|
|
5
|
-
* active coupons. Wraps the listing query that needs an OR-shaped
|
|
6
|
-
* (coupon.startDate IS NULL OR <= now) filter Firestore can't express.
|
|
7
|
-
*/
|
|
8
|
-
export const promotionsHandler = async (_input, ctx) => {
|
|
9
|
-
ctx.logger.info("Promotions data requested");
|
|
10
|
-
const now = new Date();
|
|
11
|
-
const nowIso = now.toISOString();
|
|
12
|
-
const [promotedResult, featuredResult, activeCouponsResult] = await Promise.all([
|
|
13
|
-
productRepository.list({
|
|
14
|
-
filters: `status==${ProductStatusValues.PUBLISHED},isPromoted==true`,
|
|
15
|
-
sorts: "-createdAt",
|
|
16
|
-
page: "1",
|
|
17
|
-
pageSize: "12",
|
|
18
|
-
}, { status: ProductStatusValues.PUBLISHED }),
|
|
19
|
-
productRepository.list({
|
|
20
|
-
filters: `status==${ProductStatusValues.PUBLISHED},featured==true`,
|
|
21
|
-
sorts: "-createdAt",
|
|
22
|
-
page: "1",
|
|
23
|
-
pageSize: "8",
|
|
24
|
-
}, { status: ProductStatusValues.PUBLISHED }),
|
|
25
|
-
couponsRepository.list({
|
|
26
|
-
filters: `validity.isActive==true,validity.endDate>=${nowIso}`,
|
|
27
|
-
sorts: "validity.endDate",
|
|
28
|
-
page: "1",
|
|
29
|
-
pageSize: "50",
|
|
30
|
-
}),
|
|
31
|
-
]);
|
|
32
|
-
const activeCoupons = activeCouponsResult.items.filter((c) => !c.validity?.startDate || new Date(c.validity.startDate) <= now);
|
|
33
|
-
ctx.logger.info("Promotions loaded", {
|
|
34
|
-
promoted: promotedResult.items.length,
|
|
35
|
-
featured: featuredResult.items.length,
|
|
36
|
-
coupons: activeCoupons.length,
|
|
37
|
-
});
|
|
38
|
-
return {
|
|
39
|
-
promotedProducts: promotedResult.items,
|
|
40
|
-
featuredProducts: featuredResult.items,
|
|
41
|
-
activeCoupons,
|
|
42
|
-
};
|
|
43
|
-
};
|
|
1
|
+
import { runPromotions } from "../core/promotions";
|
|
2
|
+
export const promotionsHandler = runPromotions;
|
|
@@ -1,30 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTPS callable handler: aggregate seller (store) analytics for the past
|
|
3
|
-
* 6 months. Input: `{ sellerId }` (the Firebase Auth UID); store slug is
|
|
4
|
-
* resolved server-side via `storeRepository.findByOwnerId`.
|
|
5
|
-
*/
|
|
6
1
|
import type { CallableHandler } from "../runtime/types";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
export interface StoreAnalyticsResult {
|
|
11
|
-
summary: {
|
|
12
|
-
totalOrders: number;
|
|
13
|
-
totalRevenue: number;
|
|
14
|
-
totalProducts: number;
|
|
15
|
-
publishedProducts: number;
|
|
16
|
-
};
|
|
17
|
-
revenueByMonth: Array<{
|
|
18
|
-
month: string;
|
|
19
|
-
orders: number;
|
|
20
|
-
revenue: number;
|
|
21
|
-
}>;
|
|
22
|
-
topProducts: Array<{
|
|
23
|
-
productId: string;
|
|
24
|
-
title: string;
|
|
25
|
-
revenue: number;
|
|
26
|
-
orders: number;
|
|
27
|
-
mainImage: string;
|
|
28
|
-
}>;
|
|
29
|
-
}
|
|
2
|
+
import { type StoreAnalyticsInput, type StoreAnalyticsResult } from "../core/storeAnalytics";
|
|
3
|
+
export type { StoreAnalyticsInput, StoreAnalyticsResult };
|
|
30
4
|
export declare const storeAnalyticsHandler: CallableHandler<StoreAnalyticsInput, StoreAnalyticsResult>;
|
|
@@ -1,109 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* 6 months. Input: `{ sellerId }` (the Firebase Auth UID); store slug is
|
|
4
|
-
* resolved server-side via `storeRepository.findByOwnerId`.
|
|
5
|
-
*/
|
|
6
|
-
import { orderRepository, productRepository, storeRepository, } from "../../../../repositories";
|
|
7
|
-
import { formatMonthYear } from "../../../../utils/date.formatter";
|
|
8
|
-
import { ProductStatusValues } from "../../../../features/products/schemas/firestore";
|
|
9
|
-
class StoreAnalyticsError extends Error {
|
|
10
|
-
constructor(status, message) {
|
|
11
|
-
super(message);
|
|
12
|
-
this.name = "StoreAnalyticsError";
|
|
13
|
-
this.httpStatus = status;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function normalizeDate(raw) {
|
|
17
|
-
return raw instanceof Date ? raw : new Date(raw);
|
|
18
|
-
}
|
|
19
|
-
async function loadStore6MonthOrders(storeId) {
|
|
20
|
-
const now = new Date();
|
|
21
|
-
const isoStart = new Date(now.getFullYear(), now.getMonth() - 5, 1).toISOString();
|
|
22
|
-
const out = [];
|
|
23
|
-
let page = 1;
|
|
24
|
-
let hasMore = true;
|
|
25
|
-
while (hasMore && page <= 5) {
|
|
26
|
-
const result = await orderRepository.listAll({
|
|
27
|
-
filters: `storeId==${storeId},createdAt>=${isoStart}`,
|
|
28
|
-
sorts: "-createdAt",
|
|
29
|
-
page: String(page),
|
|
30
|
-
pageSize: "300",
|
|
31
|
-
});
|
|
32
|
-
out.push(...result.items);
|
|
33
|
-
hasMore = result.hasMore;
|
|
34
|
-
page += 1;
|
|
35
|
-
}
|
|
36
|
-
return out;
|
|
37
|
-
}
|
|
38
|
-
export const storeAnalyticsHandler = async (input, ctx) => {
|
|
39
|
-
const sellerId = input?.sellerId;
|
|
40
|
-
if (!sellerId || typeof sellerId !== "string") {
|
|
41
|
-
throw new StoreAnalyticsError(400, "sellerId is required");
|
|
42
|
-
}
|
|
43
|
-
ctx.logger.info("Store analytics requested", { sellerId });
|
|
44
|
-
const store = await storeRepository.findByOwnerId(sellerId);
|
|
45
|
-
if (!store)
|
|
46
|
-
throw new StoreAnalyticsError(404, "Store not found for this seller");
|
|
47
|
-
const storeId = store.id;
|
|
48
|
-
const [past6, totalProductsResult, publishedProductsResult] = await Promise.all([
|
|
49
|
-
loadStore6MonthOrders(storeId),
|
|
50
|
-
productRepository.list({ page: "1", pageSize: "1" }, { storeId }),
|
|
51
|
-
productRepository.list({
|
|
52
|
-
filters: `status==${ProductStatusValues.PUBLISHED}`,
|
|
53
|
-
page: "1",
|
|
54
|
-
pageSize: "1",
|
|
55
|
-
}, { storeId, status: ProductStatusValues.PUBLISHED }),
|
|
56
|
-
]);
|
|
57
|
-
const productIds = Array.from(new Set(past6.map((o) => o.productId)));
|
|
58
|
-
const products = await Promise.all(productIds.map((id) => productRepository.findById(id)));
|
|
59
|
-
const productMap = new Map(products.filter(Boolean).map((p) => [p.id, p]));
|
|
60
|
-
const totalOrders = past6.length;
|
|
61
|
-
const totalRevenue = past6.reduce((sum, o) => sum + (o.totalPrice ?? 0), 0);
|
|
62
|
-
const now = new Date();
|
|
63
|
-
const monthMap = new Map();
|
|
64
|
-
for (let i = 5; i >= 0; i--) {
|
|
65
|
-
const d = new Date(now.getFullYear(), now.getMonth() - i, 1);
|
|
66
|
-
const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`;
|
|
67
|
-
monthMap.set(key, { month: formatMonthYear(d), orders: 0, revenue: 0 });
|
|
68
|
-
}
|
|
69
|
-
for (const order of past6) {
|
|
70
|
-
const d = normalizeDate(order.createdAt);
|
|
71
|
-
const key = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}`;
|
|
72
|
-
const entry = monthMap.get(key);
|
|
73
|
-
if (entry) {
|
|
74
|
-
entry.orders += 1;
|
|
75
|
-
entry.revenue += order.totalPrice ?? 0;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const revenueByProduct = new Map();
|
|
79
|
-
for (const order of past6) {
|
|
80
|
-
const existing = revenueByProduct.get(order.productId);
|
|
81
|
-
if (existing) {
|
|
82
|
-
existing.revenue += order.totalPrice ?? 0;
|
|
83
|
-
existing.orders += 1;
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
const product = productMap.get(order.productId);
|
|
87
|
-
revenueByProduct.set(order.productId, {
|
|
88
|
-
productId: order.productId,
|
|
89
|
-
title: order.productTitle,
|
|
90
|
-
revenue: order.totalPrice ?? 0,
|
|
91
|
-
orders: 1,
|
|
92
|
-
mainImage: product?.mainImage ?? "",
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
const topProducts = Array.from(revenueByProduct.values())
|
|
97
|
-
.sort((a, b) => b.revenue - a.revenue)
|
|
98
|
-
.slice(0, 5);
|
|
99
|
-
return {
|
|
100
|
-
summary: {
|
|
101
|
-
totalOrders,
|
|
102
|
-
totalRevenue,
|
|
103
|
-
totalProducts: totalProductsResult.total,
|
|
104
|
-
publishedProducts: publishedProductsResult.total,
|
|
105
|
-
},
|
|
106
|
-
revenueByMonth: Array.from(monthMap.values()),
|
|
107
|
-
topProducts,
|
|
108
|
-
};
|
|
109
|
-
};
|
|
1
|
+
import { runStoreAnalytics, } from "../core/storeAnalytics";
|
|
2
|
+
export const storeAnalyticsHandler = runStoreAnalytics;
|
|
@@ -1,30 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* triggerEventRaffle — HTTP callable (SB9-D).
|
|
3
|
-
*
|
|
4
|
-
* Selects a raffle winner for an event using `crypto.randomInt()`. Pool logic
|
|
5
|
-
* keys off the event's `raffleType`:
|
|
6
|
-
* - "top_n_scorers" → sort entries by `points DESC` take top N
|
|
7
|
-
* - "top_n_participants" → sort entries by `createdAt ASC` take first N
|
|
8
|
-
* - "open_raffle" → all CONFIRMED entries are eligible
|
|
9
|
-
*
|
|
10
|
-
* On success the function stamps the winner fields onto the event doc and
|
|
11
|
-
* sets the GitHub permalink for proof-of-fairness.
|
|
12
|
-
*/
|
|
13
1
|
import type { CallableHandler } from "../runtime/types";
|
|
14
|
-
|
|
15
|
-
eventId: string;
|
|
16
|
-
/** Optional override; otherwise read from event.raffleType. */
|
|
17
|
-
raffleType?: "top_n_scorers" | "top_n_participants" | "open_raffle";
|
|
18
|
-
/** Optional N override; otherwise read from event.raffleTopN. */
|
|
19
|
-
topN?: number;
|
|
20
|
-
}
|
|
21
|
-
interface TriggerEventRaffleResult {
|
|
22
|
-
eventId: string;
|
|
23
|
-
raffleWinnerUserId?: string;
|
|
24
|
-
raffleWinnerDisplayName?: string;
|
|
25
|
-
raffleEntryCount: number;
|
|
26
|
-
alreadyTriggered?: boolean;
|
|
27
|
-
reason?: string;
|
|
28
|
-
}
|
|
2
|
+
import { type TriggerEventRaffleInput, type TriggerEventRaffleResult } from "../core/triggerEventRaffle";
|
|
29
3
|
export declare const triggerEventRaffleHandler: CallableHandler<TriggerEventRaffleInput, TriggerEventRaffleResult>;
|
|
30
|
-
export {};
|
|
@@ -1,94 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Selects a raffle winner for an event using `crypto.randomInt()`. Pool logic
|
|
5
|
-
* keys off the event's `raffleType`:
|
|
6
|
-
* - "top_n_scorers" → sort entries by `points DESC` take top N
|
|
7
|
-
* - "top_n_participants" → sort entries by `createdAt ASC` take first N
|
|
8
|
-
* - "open_raffle" → all CONFIRMED entries are eligible
|
|
9
|
-
*
|
|
10
|
-
* On success the function stamps the winner fields onto the event doc and
|
|
11
|
-
* sets the GitHub permalink for proof-of-fairness.
|
|
12
|
-
*/
|
|
13
|
-
import crypto from "node:crypto";
|
|
14
|
-
const EVENTS_COLLECTION = "events";
|
|
15
|
-
const EVENT_ENTRIES_COLLECTION = "eventEntries";
|
|
16
|
-
export const triggerEventRaffleHandler = async (input, ctx) => {
|
|
17
|
-
const eventRef = ctx.db.collection(EVENTS_COLLECTION).doc(input.eventId);
|
|
18
|
-
const eventSnap = await eventRef.get();
|
|
19
|
-
if (!eventSnap.exists) {
|
|
20
|
-
return {
|
|
21
|
-
eventId: input.eventId,
|
|
22
|
-
raffleEntryCount: 0,
|
|
23
|
-
reason: "event_not_found",
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
const event = eventSnap.data();
|
|
27
|
-
if (event.raffleWinnerUserId) {
|
|
28
|
-
return {
|
|
29
|
-
eventId: input.eventId,
|
|
30
|
-
raffleEntryCount: 0,
|
|
31
|
-
alreadyTriggered: true,
|
|
32
|
-
raffleWinnerUserId: event.raffleWinnerUserId,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
const raffleType = input.raffleType ?? event.raffleType ?? "open_raffle";
|
|
36
|
-
const topN = input.topN ?? event.raffleTopN ?? 0;
|
|
37
|
-
const entriesSnap = await ctx.db
|
|
38
|
-
.collection(EVENT_ENTRIES_COLLECTION)
|
|
39
|
-
.where("eventId", "==", input.eventId)
|
|
40
|
-
.where("status", "==", "CONFIRMED")
|
|
41
|
-
.get();
|
|
42
|
-
let pool = entriesSnap.docs.map((d) => ({
|
|
43
|
-
id: d.id,
|
|
44
|
-
data: d.data(),
|
|
45
|
-
}));
|
|
46
|
-
if (raffleType === "top_n_scorers" && topN > 0) {
|
|
47
|
-
pool = pool
|
|
48
|
-
.sort((a, b) => (b.data.points ?? 0) - (a.data.points ?? 0))
|
|
49
|
-
.slice(0, topN);
|
|
50
|
-
}
|
|
51
|
-
else if (raffleType === "top_n_participants" && topN > 0) {
|
|
52
|
-
pool = pool
|
|
53
|
-
.sort((a, b) => {
|
|
54
|
-
const aT = a.data.createdAt instanceof Date
|
|
55
|
-
? a.data.createdAt.getTime()
|
|
56
|
-
: (a.data.createdAt?.toDate?.()?.getTime() ?? 0);
|
|
57
|
-
const bT = b.data.createdAt instanceof Date
|
|
58
|
-
? b.data.createdAt.getTime()
|
|
59
|
-
: (b.data.createdAt?.toDate?.()?.getTime() ?? 0);
|
|
60
|
-
return aT - bT;
|
|
61
|
-
})
|
|
62
|
-
.slice(0, topN);
|
|
63
|
-
}
|
|
64
|
-
if (pool.length === 0) {
|
|
65
|
-
return {
|
|
66
|
-
eventId: input.eventId,
|
|
67
|
-
raffleEntryCount: 0,
|
|
68
|
-
reason: "no_eligible_entries",
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
const winnerIdx = crypto.randomInt(0, pool.length);
|
|
72
|
-
const winner = pool[winnerIdx];
|
|
73
|
-
await eventRef.update({
|
|
74
|
-
raffleWinnerUserId: winner.data.userId,
|
|
75
|
-
raffleWinnerDisplayName: winner.data.userDisplayName ?? "",
|
|
76
|
-
raffleWinnerEntryId: winner.id,
|
|
77
|
-
raffleTriggeredAt: ctx.now,
|
|
78
|
-
raffleEntryCount: entriesSnap.size,
|
|
79
|
-
raffleGithubFunctionUrl: `${ctx.env("PROOF_OF_FAIRNESS_BASE_URL") ?? ""}/raffles/${input.eventId}.json`,
|
|
80
|
-
updatedAt: ctx.now,
|
|
81
|
-
});
|
|
82
|
-
ctx.logger.info("Event raffle triggered", {
|
|
83
|
-
eventId: input.eventId,
|
|
84
|
-
raffleType,
|
|
85
|
-
poolSize: pool.length,
|
|
86
|
-
winnerId: winner.id,
|
|
87
|
-
});
|
|
88
|
-
return {
|
|
89
|
-
eventId: input.eventId,
|
|
90
|
-
raffleWinnerUserId: winner.data.userId,
|
|
91
|
-
raffleWinnerDisplayName: winner.data.userDisplayName,
|
|
92
|
-
raffleEntryCount: entriesSnap.size,
|
|
93
|
-
};
|
|
94
|
-
};
|
|
1
|
+
import { runTriggerEventRaffle, } from "../core/triggerEventRaffle";
|
|
2
|
+
export const triggerEventRaffleHandler = runTriggerEventRaffle;
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Job handler: weekly Saturday sweep — converts delivered Shiprocket orders
|
|
3
|
-
* with `payoutStatus=eligible` into pending payout documents grouped by seller.
|
|
4
|
-
* Net amount = gross − 5% platform fee. Idempotent: orders already requested
|
|
5
|
-
* are filtered out by the repository.
|
|
6
|
-
*/
|
|
7
1
|
import type { ScheduleHandler } from "../runtime/types";
|
|
8
2
|
export declare const weeklyPayoutEligibilityHandler: ScheduleHandler;
|
|
@@ -1,87 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* with `payoutStatus=eligible` into pending payout documents grouped by seller.
|
|
4
|
-
* Net amount = gross − 5% platform fee. Idempotent: orders already requested
|
|
5
|
-
* are filtered out by the repository.
|
|
6
|
-
*/
|
|
7
|
-
import { storeRepository, userRepository, orderRepository, payoutRepository, } from "../../../../repositories";
|
|
8
|
-
import { BATCH_LIMIT } from "./messages";
|
|
9
|
-
import { getDefaultCurrency } from "../../../../core";
|
|
10
|
-
const PLATFORM_COMMISSION_RATE = 0.05;
|
|
11
|
-
export const weeklyPayoutEligibilityHandler = async (ctx) => {
|
|
12
|
-
ctx.logger.info("Starting weekly payout eligibility sweep");
|
|
13
|
-
const eligible = await orderRepository.getEligibleShiprocket();
|
|
14
|
-
if (eligible.length === 0) {
|
|
15
|
-
ctx.logger.info("No eligible Shiprocket-delivered orders found");
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
ctx.logger.info(`Found ${eligible.length} eligible order(s) — grouping by seller`);
|
|
19
|
-
const byStore = new Map();
|
|
20
|
-
for (const entry of eligible) {
|
|
21
|
-
const storeId = entry.data.storeId;
|
|
22
|
-
if (!storeId) {
|
|
23
|
-
ctx.logger.warn(`Order ${entry.id} has no storeId — skipping`);
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
if (!byStore.has(storeId))
|
|
27
|
-
byStore.set(storeId, []);
|
|
28
|
-
byStore.get(storeId).push(entry);
|
|
29
|
-
}
|
|
30
|
-
let payoutsCreated = 0;
|
|
31
|
-
let ordersProcessed = 0;
|
|
32
|
-
const defaultCurrency = getDefaultCurrency();
|
|
33
|
-
for (const [storeId, orders] of byStore.entries()) {
|
|
34
|
-
const store = await storeRepository.findBySlug(storeId);
|
|
35
|
-
const seller = store ? await userRepository.findById(store.ownerId) : null;
|
|
36
|
-
if (!store || !seller) {
|
|
37
|
-
ctx.logger.warn(`Store/seller ${storeId} not found — skipping ${orders.length} order(s)`);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
const grossAmount = orders.reduce((sum, o) => sum + (o.data.totalPrice ?? 0), 0);
|
|
41
|
-
const platformFee = Math.round(grossAmount * PLATFORM_COMMISSION_RATE * 100) / 100;
|
|
42
|
-
const netAmount = Math.round((grossAmount - platformFee) * 100) / 100;
|
|
43
|
-
const payoutInput = {
|
|
44
|
-
storeId,
|
|
45
|
-
sellerName: (seller.displayName ?? seller.email ?? store.ownerId),
|
|
46
|
-
sellerEmail: (seller.email ?? ""),
|
|
47
|
-
orderIds: orders.map((o) => o.id),
|
|
48
|
-
amount: netAmount,
|
|
49
|
-
grossAmount,
|
|
50
|
-
platformFee,
|
|
51
|
-
platformFeeRate: PLATFORM_COMMISSION_RATE,
|
|
52
|
-
currency: defaultCurrency,
|
|
53
|
-
status: "pending",
|
|
54
|
-
paymentMethod: seller.payoutDetails?.method === "upi" ? "upi" : "bank_transfer",
|
|
55
|
-
upiId: seller.payoutDetails?.method === "upi" ? seller.payoutDetails.upiId : undefined,
|
|
56
|
-
bankAccount: seller.payoutDetails?.method === "bank_transfer" && seller.payoutDetails.bankAccount
|
|
57
|
-
? {
|
|
58
|
-
accountHolderName: seller.payoutDetails.bankAccount.accountHolderName,
|
|
59
|
-
accountNumberMasked: seller.payoutDetails.bankAccount.accountNumberMasked,
|
|
60
|
-
ifscCode: seller.payoutDetails.bankAccount.ifscCode,
|
|
61
|
-
bankName: seller.payoutDetails.bankAccount.bankName,
|
|
62
|
-
}
|
|
63
|
-
: undefined,
|
|
64
|
-
notes: `Automated weekly payout — ${orders.length} Shiprocket delivered order(s)`,
|
|
65
|
-
requestedAt: new Date(),
|
|
66
|
-
};
|
|
67
|
-
const { id: payoutId } = await payoutRepository.create(payoutInput);
|
|
68
|
-
for (let i = 0; i < orders.length; i += BATCH_LIMIT) {
|
|
69
|
-
const slice = orders.slice(i, i + BATCH_LIMIT);
|
|
70
|
-
const batch = ctx.db.batch();
|
|
71
|
-
for (const entry of slice) {
|
|
72
|
-
orderRepository.markPayoutRequested(batch, entry.ref, payoutId);
|
|
73
|
-
}
|
|
74
|
-
await batch.commit();
|
|
75
|
-
}
|
|
76
|
-
payoutsCreated++;
|
|
77
|
-
ordersProcessed += orders.length;
|
|
78
|
-
ctx.logger.info(`Payout created for store ${storeId}`, {
|
|
79
|
-
payoutId,
|
|
80
|
-
orderCount: orders.length,
|
|
81
|
-
netAmount,
|
|
82
|
-
grossAmount,
|
|
83
|
-
platformFee,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
ctx.logger.info("Weekly payout eligibility sweep complete", { payoutsCreated, ordersProcessed });
|
|
87
|
-
};
|
|
1
|
+
import { runWeeklyPayoutEligibility } from "../core/weeklyPayoutEligibility";
|
|
2
|
+
export const weeklyPayoutEligibilityHandler = runWeeklyPayoutEligibility;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from "./handlers/index";
|
|
2
|
+
export * from "./core/index";
|
|
2
3
|
export * from "./runtime/types";
|
|
3
4
|
export { bindSchedule, bindDocumentWritten, bindDocumentCreated, bindDocumentUpdated, bindCallable, bindHttps, bindToFirebase, } from "./runtime/adapters/firebase";
|
|
4
5
|
export type { BindHttpsOptions } from "./runtime/adapters/firebase";
|
|
@@ -13,6 +13,13 @@
|
|
|
13
13
|
import { onSchedule } from "firebase-functions/v2/scheduler";
|
|
14
14
|
import { onDocumentWritten, onDocumentCreated, onDocumentUpdated, } from "firebase-functions/v2/firestore";
|
|
15
15
|
import { onCall, onRequest, } from "firebase-functions/v2/https";
|
|
16
|
+
// Note: we intentionally pass secret NAMES (as strings) — not `defineSecret`
|
|
17
|
+
// Param refs — to `onRequest({ secrets: [...] })`. firebase-functions v2
|
|
18
|
+
// accepts both forms; the string form skips the firebase-tools Param-value
|
|
19
|
+
// preflight that requires either an interactive prompt or a
|
|
20
|
+
// functions/.env.<project> file (which would defeat the purpose of using
|
|
21
|
+
// Secret Manager for the value). At runtime the SDK resolves the secret name
|
|
22
|
+
// from Cloud Secret Manager directly and injects it into process.env.
|
|
16
23
|
import { getAdminDb } from "../../../../../providers/db-firebase";
|
|
17
24
|
import { serverLogger } from "../../../../../monitoring";
|
|
18
25
|
function buildContext(job) {
|
|
@@ -120,6 +127,20 @@ export function bindCallable(job, handler, options) {
|
|
|
120
127
|
*/
|
|
121
128
|
export function bindHttps(job, handler, options) {
|
|
122
129
|
const { secretEnvVar, methods = ["POST"], ...httpsOptions } = options;
|
|
130
|
+
// Firebase Functions v2 requires secrets to be DECLARED via `secrets: [...]`
|
|
131
|
+
// in the `onRequest` options for the runtime to inject them into
|
|
132
|
+
// `process.env`. Just *reading* `process.env[secretEnvVar]` returns
|
|
133
|
+
// undefined unless the secret is bound here. Declare it via `defineSecret`
|
|
134
|
+
// so the deploy step provisions the binding (and developers see the secret
|
|
135
|
+
// listed in `firebase deploy` output).
|
|
136
|
+
if (secretEnvVar) {
|
|
137
|
+
const existing = Array.isArray(httpsOptions.secrets)
|
|
138
|
+
? httpsOptions.secrets
|
|
139
|
+
: [];
|
|
140
|
+
if (!existing.includes(secretEnvVar)) {
|
|
141
|
+
httpsOptions.secrets = [...existing, secretEnvVar];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
123
144
|
return onRequest(httpsOptions, async (req, res) => {
|
|
124
145
|
const ctx = buildContext(job);
|
|
125
146
|
if (secretEnvVar) {
|