@mohasinac/appkit 2.3.2 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +44 -12
- package/dist/client.js +22 -6
- package/dist/constants/api-endpoints.d.ts +380 -22
- package/dist/constants/api-endpoints.js +66 -13
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/core/hooks/useSyncManager.d.ts +1 -0
- package/dist/core/hooks/useSyncManager.js +83 -0
- package/dist/core/integration-keys.d.ts +4 -0
- package/dist/core/integration-keys.js +8 -0
- package/dist/features/about/components/FAQPageView.js +9 -11
- package/dist/features/about/components/PolicyPageView.js +32 -11
- package/dist/features/about/components/PublicProfileView.js +77 -11
- package/dist/features/account/components/AddressesIndexListing.js +63 -38
- package/dist/features/account/components/UserOffersPanel.d.ts +8 -0
- package/dist/features/account/components/UserOffersPanel.js +81 -0
- package/dist/features/account/components/UserSettingsView.d.ts +2 -1
- package/dist/features/account/components/UserSettingsView.js +2 -1
- package/dist/features/account/components/UserSidebar.d.ts +6 -1
- package/dist/features/account/components/UserSidebar.js +48 -42
- package/dist/features/account/components/index.d.ts +2 -0
- package/dist/features/account/components/index.js +1 -0
- package/dist/features/admin/actions/admin-actions.d.ts +1 -1
- package/dist/features/admin/actions/admin-actions.js +13 -3
- package/dist/features/admin/components/AdminAdEditorView.js +6 -7
- package/dist/features/admin/components/AdminAllEventEntriesView.d.ts +4 -0
- package/dist/features/admin/components/AdminAllEventEntriesView.js +102 -0
- package/dist/features/admin/components/AdminBidsView.js +94 -8
- package/dist/features/admin/components/AdminBlogEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminBlogEditorView.js +162 -0
- package/dist/features/admin/components/AdminBlogView.d.ts +4 -1
- package/dist/features/admin/components/AdminBlogView.js +61 -31
- package/dist/features/admin/components/AdminBrandEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminBrandEditorView.js +104 -0
- package/dist/features/admin/components/AdminBrandsView.d.ts +4 -0
- package/dist/features/admin/components/AdminBrandsView.js +76 -0
- package/dist/features/admin/components/AdminCarouselEditorView.d.ts +8 -0
- package/dist/features/admin/components/AdminCarouselEditorView.js +204 -0
- package/dist/features/admin/components/AdminCarouselView.js +153 -34
- package/dist/features/admin/components/AdminCartsView.d.ts +4 -0
- package/dist/features/admin/components/AdminCartsView.js +82 -0
- package/dist/features/admin/components/AdminCategoriesView.d.ts +4 -1
- package/dist/features/admin/components/AdminCategoriesView.js +66 -48
- package/dist/features/admin/components/AdminCategoryEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminCategoryEditorView.js +115 -0
- package/dist/features/admin/components/AdminContactEditorView.d.ts +11 -0
- package/dist/features/admin/components/AdminContactEditorView.js +32 -0
- package/dist/features/admin/components/AdminContactView.js +111 -20
- package/dist/features/admin/components/AdminCouponEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminCouponEditorView.js +179 -0
- package/dist/features/admin/components/AdminCouponsView.d.ts +4 -1
- package/dist/features/admin/components/AdminCouponsView.js +57 -9
- package/dist/features/admin/components/AdminDashboardView.js +3 -0
- package/dist/features/admin/components/AdminFaqEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminFaqEditorView.js +128 -0
- package/dist/features/admin/components/AdminFaqsView.d.ts +4 -1
- package/dist/features/admin/components/AdminFaqsView.js +55 -23
- package/dist/features/admin/components/AdminFeatureFlagsView.js +33 -24
- package/dist/features/admin/components/AdminListingScaffold.d.ts +7 -1
- package/dist/features/admin/components/AdminListingScaffold.js +2 -2
- package/dist/features/admin/components/AdminMediaView.js +18 -8
- package/dist/features/admin/components/AdminNavEditorView.d.ts +20 -0
- package/dist/features/admin/components/AdminNavEditorView.js +84 -0
- package/dist/features/admin/components/AdminNavigationView.d.ts +1 -7
- package/dist/features/admin/components/AdminNavigationView.js +84 -72
- package/dist/features/admin/components/AdminNewsletterView.js +102 -20
- package/dist/features/admin/components/AdminNotificationsView.d.ts +4 -0
- package/dist/features/admin/components/AdminNotificationsView.js +119 -0
- package/dist/features/admin/components/AdminOrderEditorView.d.ts +8 -0
- package/dist/features/admin/components/AdminOrderEditorView.js +74 -0
- package/dist/features/admin/components/AdminOrdersView.js +64 -8
- package/dist/features/admin/components/AdminPayoutsView.js +122 -13
- package/dist/features/admin/components/AdminProductEditorView.d.ts +7 -0
- package/dist/features/admin/components/AdminProductEditorView.js +143 -0
- package/dist/features/admin/components/AdminProductsView.d.ts +4 -1
- package/dist/features/admin/components/AdminProductsView.js +119 -30
- package/dist/features/admin/components/AdminReturnRequestsView.d.ts +5 -0
- package/dist/features/admin/components/AdminReturnRequestsView.js +101 -0
- package/dist/features/admin/components/AdminReviewsView.js +138 -28
- package/dist/features/admin/components/AdminSectionsView.js +361 -472
- package/dist/features/admin/components/AdminSessionsView.d.ts +4 -0
- package/dist/features/admin/components/AdminSessionsView.js +119 -0
- package/dist/features/admin/components/AdminSidebar.d.ts +18 -3
- package/dist/features/admin/components/AdminSidebar.js +51 -4
- package/dist/features/admin/components/AdminSiteSettingsView.d.ts +7 -0
- package/dist/features/admin/components/AdminSiteSettingsView.js +319 -0
- package/dist/features/admin/components/AdminStoreAddressesView.d.ts +5 -0
- package/dist/features/admin/components/AdminStoreAddressesView.js +52 -0
- package/dist/features/admin/components/AdminStoreEditorView.d.ts +9 -0
- package/dist/features/admin/components/AdminStoreEditorView.js +55 -0
- package/dist/features/admin/components/AdminStoresView.js +62 -20
- package/dist/features/admin/components/AdminUserEditorView.d.ts +10 -0
- package/dist/features/admin/components/AdminUserEditorView.js +72 -0
- package/dist/features/admin/components/AdminUsersView.js +70 -36
- package/dist/features/admin/components/AdminWishlistsView.d.ts +4 -0
- package/dist/features/admin/components/AdminWishlistsView.js +53 -0
- package/dist/features/admin/components/BrandQuickCreateForm.d.ts +5 -0
- package/dist/features/admin/components/BrandQuickCreateForm.js +36 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.d.ts +5 -0
- package/dist/features/admin/components/CategoryQuickCreateForm.js +35 -0
- package/dist/features/admin/components/DataTable.d.ts +4 -2
- package/dist/features/admin/components/DataTable.js +26 -6
- package/dist/features/admin/components/index.d.ts +47 -1
- package/dist/features/admin/components/index.js +23 -0
- package/dist/features/admin/components/sections/adminSectionsBuildParse.d.ts +48 -0
- package/dist/features/admin/components/sections/adminSectionsBuildParse.js +653 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +298 -0
- package/dist/features/admin/components/sections/adminSectionsTypes.js +278 -0
- package/dist/features/admin/schemas/firestore.d.ts +26 -0
- package/dist/features/admin/schemas/firestore.js +1 -0
- package/dist/features/admin/types/product.types.d.ts +2 -3
- package/dist/features/auctions/actions/bid-actions.js +6 -2
- package/dist/features/auctions/components/AuctionDetailPageView.d.ts +3 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +38 -12
- package/dist/features/auctions/components/AuctionFilters.d.ts +3 -1
- package/dist/features/auctions/components/AuctionFilters.js +6 -2
- package/dist/features/auctions/components/CollapsibleBidHistory.d.ts +7 -0
- package/dist/features/auctions/components/CollapsibleBidHistory.js +8 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +4 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +43 -9
- package/dist/features/auctions/components/MarketplaceAuctionGrid.js +1 -0
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +18 -0
- package/dist/features/auctions/components/PlaceBidFormClient.js +33 -0
- package/dist/features/auctions/hooks/useAuctions.d.ts +1 -0
- package/dist/features/auctions/hooks/useAuctions.js +1 -0
- package/dist/features/auctions/schemas/index.d.ts +22 -12
- package/dist/features/auth/actions/profile-actions.d.ts +5 -3
- package/dist/features/auth/actions/profile-actions.js +30 -11
- package/dist/features/auth/auth-helpers.js +1 -0
- package/dist/features/auth/components/LoginForm.js +2 -1
- package/dist/features/auth/hooks/useAuth.js +16 -4
- package/dist/features/auth/permissions/constants.d.ts +63 -0
- package/dist/features/auth/permissions/constants.js +323 -0
- package/dist/features/auth/schemas/firestore.d.ts +20 -0
- package/dist/features/auth/schemas/index.d.ts +4 -4
- package/dist/features/auth/schemas/index.js +3 -2
- package/dist/features/auth/types/index.d.ts +1 -1
- package/dist/features/before-after/schemas/index.d.ts +2 -2
- package/dist/features/blog/actions/blog-actions.d.ts +15 -15
- package/dist/features/blog/components/BlogFilters.js +1 -1
- package/dist/features/blog/components/BlogIndexListing.js +57 -5
- package/dist/features/blog/components/BlogIndexPageView.js +14 -2
- package/dist/features/blog/components/BlogPostForm.js +6 -2
- package/dist/features/blog/components/BlogPostView.js +2 -1
- package/dist/features/blog/hooks/useBlog.d.ts +2 -0
- package/dist/features/blog/hooks/useBlog.js +2 -0
- package/dist/features/blog/schemas/index.d.ts +46 -12
- package/dist/features/brands/actions/brand-actions.d.ts +2 -0
- package/dist/features/brands/actions/brand-actions.js +5 -0
- package/dist/features/brands/index.d.ts +3 -0
- package/dist/features/brands/index.js +3 -0
- package/dist/features/brands/repository/brands.repository.d.ts +13 -0
- package/dist/features/brands/repository/brands.repository.js +60 -0
- package/dist/features/brands/schemas/index.d.ts +33 -0
- package/dist/features/brands/schemas/index.js +15 -0
- package/dist/features/brands/server.d.ts +7 -0
- package/dist/features/brands/server.js +7 -0
- package/dist/features/cart/actions/cart-actions.js +2 -2
- package/dist/features/cart/components/CartDrawer.d.ts +5 -1
- package/dist/features/cart/components/CartDrawer.js +3 -3
- package/dist/features/cart/hooks/useCartCount.d.ts +3 -2
- package/dist/features/cart/hooks/useCartCount.js +4 -2
- package/dist/features/cart/hooks/useGuestCartMerge.js +1 -1
- package/dist/features/cart/index.d.ts +1 -0
- package/dist/features/cart/index.js +1 -0
- package/dist/features/cart/repository/cart.repository.d.ts +5 -1
- package/dist/features/cart/repository/cart.repository.js +36 -5
- package/dist/features/cart/schemas/firestore.d.ts +25 -6
- package/dist/features/cart/schemas/firestore.js +2 -2
- package/dist/features/cart/schemas/index.d.ts +9 -9
- package/dist/features/cart/schemas/index.js +1 -1
- package/dist/features/cart/types/index.d.ts +1 -1
- package/dist/features/cart/utils/pending-ops.d.ts +33 -0
- package/dist/features/cart/utils/pending-ops.js +102 -0
- package/dist/features/categories/components/BrandDetailPageView.d.ts +4 -0
- package/dist/features/categories/components/BrandDetailPageView.js +54 -0
- package/dist/features/categories/components/BrandDetailTabs.d.ts +10 -0
- package/dist/features/categories/components/BrandDetailTabs.js +22 -0
- package/dist/features/categories/components/CategoriesIndexListing.d.ts +3 -1
- package/dist/features/categories/components/CategoriesIndexListing.js +83 -7
- package/dist/features/categories/components/CategoryDetailPageView.js +42 -21
- package/dist/features/categories/components/CategoryDetailTabs.d.ts +7 -1
- package/dist/features/categories/components/CategoryDetailTabs.js +12 -7
- package/dist/features/categories/components/CategoryFilters.js +1 -1
- package/dist/features/categories/components/CategoryForm.js +10 -4
- package/dist/features/categories/components/CategoryProductsListing.d.ts +4 -1
- package/dist/features/categories/components/CategoryProductsListing.js +34 -5
- package/dist/features/categories/components/ConcernCard.js +1 -1
- package/dist/features/categories/hooks/useCategories.js +2 -0
- package/dist/features/categories/repository/categories.repository.js +2 -3
- package/dist/features/categories/schemas/firestore.d.ts +23 -2
- package/dist/features/categories/schemas/firestore.js +8 -0
- package/dist/features/categories/schemas/index.d.ts +8 -8
- package/dist/features/categories/types/index.d.ts +1 -0
- package/dist/features/collections/schemas/index.d.ts +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +2 -2
- package/dist/features/events/components/AdminEventsView.d.ts +4 -1
- package/dist/features/events/components/AdminEventsView.js +64 -38
- package/dist/features/events/components/EventCard.js +1 -1
- package/dist/features/events/components/EventFilters.js +1 -1
- package/dist/features/events/components/EventPollWidget.d.ts +12 -0
- package/dist/features/events/components/EventPollWidget.js +62 -0
- package/dist/features/events/components/EventsIndexListing.js +57 -5
- package/dist/features/events/components/EventsListPageView.js +1 -1
- package/dist/features/events/components/index.d.ts +2 -0
- package/dist/features/events/components/index.js +1 -0
- package/dist/features/events/hooks/useEvents.d.ts +1 -0
- package/dist/features/events/hooks/useEvents.js +1 -0
- package/dist/features/events/repository/events.repository.js +3 -0
- package/dist/features/events/schemas/firestore.d.ts +1 -0
- package/dist/features/events/schemas/index.d.ts +44 -0
- package/dist/features/events/types/index.d.ts +2 -0
- package/dist/features/faq/actions/faq-actions.d.ts +16 -16
- package/dist/features/faq/hooks/useFaqList.js +1 -1
- package/dist/features/faq/schemas/firestore.d.ts +2 -2
- package/dist/features/faq/schemas/firestore.js +2 -1
- package/dist/features/faq/schemas/index.d.ts +4 -4
- package/dist/features/filters/FilterFacetSection.d.ts +1 -0
- package/dist/features/filters/FilterFacetSection.js +13 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/grouped/schemas/firestore.d.ts +32 -0
- package/dist/features/grouped/schemas/firestore.js +19 -0
- package/dist/features/homepage/components/AdSlot.d.ts +1 -3
- package/dist/features/homepage/components/AdSlot.js +15 -14
- package/dist/features/homepage/components/BlogArticlesSection.d.ts +3 -1
- package/dist/features/homepage/components/BlogArticlesSection.js +2 -2
- package/dist/features/homepage/components/BrandsSection.d.ts +3 -1
- package/dist/features/homepage/components/BrandsSection.js +4 -3
- package/dist/features/homepage/components/CustomCardsSection.d.ts +3 -0
- package/dist/features/homepage/components/CustomCardsSection.js +76 -0
- package/dist/features/homepage/components/EventsSection.d.ts +3 -1
- package/dist/features/homepage/components/EventsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
- package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
- package/dist/features/homepage/components/FeaturedProductsSection.d.ts +4 -1
- package/dist/features/homepage/components/FeaturedProductsSection.js +8 -3
- package/dist/features/homepage/components/FeaturedStoresSection.d.ts +3 -1
- package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
- package/dist/features/homepage/components/GoogleReviewsSection.d.ts +3 -0
- package/dist/features/homepage/components/GoogleReviewsSection.js +65 -0
- package/dist/features/homepage/components/HeroCarousel.js +128 -84
- package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +2 -20
- package/dist/features/homepage/components/MarketplaceHomepageView.js +73 -230
- package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
- package/dist/features/homepage/components/SectionCarousel.js +2 -0
- package/dist/features/homepage/components/ShopByCategorySection.d.ts +3 -1
- package/dist/features/homepage/components/ShopByCategorySection.js +8 -4
- package/dist/features/homepage/components/SocialFeedSection.d.ts +3 -0
- package/dist/features/homepage/components/SocialFeedSection.js +86 -0
- package/dist/features/homepage/components/SocialPostCard.d.ts +7 -0
- package/dist/features/homepage/components/SocialPostCard.js +39 -0
- package/dist/features/homepage/components/StatsCounterSection.js +1 -1
- package/dist/features/homepage/components/WelcomeSection.js +1 -1
- package/dist/features/homepage/components/WhatsAppCommunitySection.js +1 -1
- package/dist/features/homepage/hooks/useActiveAd.d.ts +23 -0
- package/dist/features/homepage/hooks/useActiveAd.js +20 -0
- package/dist/features/homepage/hooks/useBlogArticles.d.ts +1 -0
- package/dist/features/homepage/hooks/useBlogArticles.js +10 -0
- package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +4 -1
- package/dist/features/homepage/hooks/useFeaturedAuctions.js +8 -4
- package/dist/features/homepage/hooks/useFeaturedPreOrders.d.ts +4 -1
- package/dist/features/homepage/hooks/useFeaturedPreOrders.js +8 -4
- package/dist/features/homepage/hooks/useFeaturedProducts.d.ts +1 -0
- package/dist/features/homepage/hooks/useFeaturedProducts.js +6 -3
- package/dist/features/homepage/hooks/useFeaturedStores.d.ts +3 -1
- package/dist/features/homepage/hooks/useFeaturedStores.js +2 -1
- package/dist/features/homepage/hooks/useHomepageEvents.d.ts +3 -1
- package/dist/features/homepage/hooks/useHomepageEvents.js +2 -1
- package/dist/features/homepage/hooks/useTopBrands.d.ts +3 -1
- package/dist/features/homepage/hooks/useTopBrands.js +2 -1
- package/dist/features/homepage/index.d.ts +2 -0
- package/dist/features/homepage/index.js +1 -0
- package/dist/features/homepage/lib/google-reviews-fetcher.d.ts +14 -0
- package/dist/features/homepage/lib/google-reviews-fetcher.js +27 -0
- package/dist/features/homepage/lib/live-stats.d.ts +14 -0
- package/dist/features/homepage/lib/live-stats.js +62 -0
- package/dist/features/homepage/lib/section-defaults.d.ts +11 -0
- package/dist/features/homepage/lib/section-defaults.js +45 -0
- package/dist/features/homepage/lib/section-helpers.d.ts +5 -0
- package/dist/features/homepage/lib/section-helpers.js +25 -0
- package/dist/features/homepage/lib/section-renderer.d.ts +33 -0
- package/dist/features/homepage/lib/section-renderer.js +164 -0
- package/dist/features/homepage/lib/social-feed-fetcher.d.ts +5 -0
- package/dist/features/homepage/lib/social-feed-fetcher.js +193 -0
- package/dist/features/homepage/schemas/firestore.d.ts +180 -29
- package/dist/features/homepage/schemas/firestore.js +5 -0
- package/dist/features/homepage/types/index.d.ts +48 -19
- package/dist/features/layout/AppLayoutShell.d.ts +6 -1
- package/dist/features/layout/AppLayoutShell.js +25 -9
- package/dist/features/layout/BottomActions.js +1 -1
- package/dist/features/layout/BottomNavbar.d.ts +15 -1
- package/dist/features/layout/BottomNavbar.js +8 -2
- package/dist/features/layout/FooterLayout.d.ts +7 -1
- package/dist/features/layout/FooterLayout.js +3 -3
- package/dist/features/layout/ListingLayout.js +2 -2
- package/dist/features/layout/MainNavbar.d.ts +6 -14
- package/dist/features/layout/MainNavbar.js +4 -16
- package/dist/features/layout/NavItem.js +1 -1
- package/dist/features/layout/NavbarLayout.d.ts +3 -1
- package/dist/features/layout/NavbarLayout.js +5 -5
- package/dist/features/layout/TitleBar.d.ts +4 -2
- package/dist/features/layout/TitleBar.js +5 -3
- package/dist/features/layout/TitleBarLayout.d.ts +3 -1
- package/dist/features/layout/TitleBarLayout.js +2 -2
- package/dist/features/layout/index.d.ts +1 -1
- package/dist/features/media/MediaPickerModal.d.ts +30 -0
- package/dist/features/media/MediaPickerModal.js +72 -0
- package/dist/features/media/index.d.ts +3 -1
- package/dist/features/media/index.js +1 -0
- package/dist/features/media/types/index.d.ts +12 -0
- package/dist/features/media/types/index.js +4 -2
- package/dist/features/media/upload/MediaUploadField.d.ts +5 -1
- package/dist/features/media/upload/MediaUploadField.js +56 -3
- package/dist/features/messages/schemas/firestore.d.ts +36 -0
- package/dist/features/messages/schemas/firestore.js +16 -0
- package/dist/features/orders/repository/orders.repository.d.ts +2 -2
- package/dist/features/orders/repository/orders.repository.js +2 -2
- package/dist/features/orders/schemas/firestore.d.ts +17 -4
- package/dist/features/orders/schemas/firestore.js +2 -2
- package/dist/features/orders/schemas/index.d.ts +18 -18
- package/dist/features/orders/schemas/index.js +3 -3
- package/dist/features/orders/types/index.d.ts +1 -1
- package/dist/features/orders/utils/order-splitter.d.ts +1 -1
- package/dist/features/orders/utils/order-splitter.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +4 -4
- package/dist/features/payments/repository/payout.repository.js +7 -7
- package/dist/features/payments/schemas/firestore.d.ts +6 -6
- package/dist/features/payments/schemas/firestore.js +6 -6
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +11 -10
- package/dist/features/pre-orders/components/PreOrderActionsClient.d.ts +11 -0
- package/dist/features/pre-orders/components/PreOrderActionsClient.js +28 -0
- package/dist/features/pre-orders/components/PreOrderDetailPageView.d.ts +2 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +27 -9
- package/dist/features/pre-orders/components/PreOrderFilters.d.ts +3 -1
- package/dist/features/pre-orders/components/PreOrderFilters.js +9 -6
- package/dist/features/pre-orders/components/PreOrdersIndexListing.d.ts +3 -1
- package/dist/features/pre-orders/components/PreOrdersIndexListing.js +132 -36
- package/dist/features/pre-orders/components/PreOrdersListView.js +3 -3
- package/dist/features/pre-orders/components/PreorderCard.js +1 -1
- package/dist/features/pre-orders/schemas/index.d.ts +10 -0
- package/dist/features/products/actions/product-actions.d.ts +2 -2
- package/dist/features/products/actions/product-actions.js +5 -5
- package/dist/features/products/api/[id]/route.js +5 -2
- package/dist/features/products/api/route.js +10 -14
- package/dist/features/products/columns/productTableColumns.js +2 -2
- package/dist/features/products/components/AuctionDetailView.d.ts +2 -1
- package/dist/features/products/components/AuctionDetailView.js +2 -2
- package/dist/features/products/components/AuctionsIndexListing.d.ts +3 -1
- package/dist/features/products/components/AuctionsIndexListing.js +93 -31
- package/dist/features/products/components/BidHistory.d.ts +2 -1
- package/dist/features/products/components/BidHistory.js +18 -2
- package/dist/features/products/components/MakeOfferButton.d.ts +10 -0
- package/dist/features/products/components/MakeOfferButton.js +68 -0
- package/dist/features/products/components/ProductDetailPageView.d.ts +11 -1
- package/dist/features/products/components/ProductDetailPageView.js +27 -8
- package/dist/features/products/components/ProductFilters.d.ts +7 -1
- package/dist/features/products/components/ProductFilters.js +4 -2
- package/dist/features/products/components/ProductForm.d.ts +19 -1
- package/dist/features/products/components/ProductForm.js +24 -6
- package/dist/features/products/components/ProductGrid.d.ts +10 -2
- package/dist/features/products/components/ProductGrid.js +76 -29
- package/dist/features/products/components/ProductsIndexListing.js +131 -45
- package/dist/features/products/components/RelatedProductsCarousel.js +1 -1
- package/dist/features/products/components/ShareButton.d.ts +7 -0
- package/dist/features/products/components/ShareButton.js +22 -0
- package/dist/features/products/components/index.d.ts +2 -0
- package/dist/features/products/components/index.js +1 -0
- package/dist/features/products/hooks/useProducts.d.ts +7 -0
- package/dist/features/products/hooks/useProducts.js +6 -4
- package/dist/features/products/repository/products.repository.d.ts +4 -8
- package/dist/features/products/repository/products.repository.js +17 -50
- package/dist/features/products/schemas/firestore.d.ts +11 -9
- package/dist/features/products/schemas/firestore.js +11 -3
- package/dist/features/products/schemas/index.d.ts +51 -50
- package/dist/features/products/schemas/index.js +2 -5
- package/dist/features/products/types/index.d.ts +13 -5
- 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/actions/seller-coupon-actions.js +11 -6
- package/dist/features/promotions/api/route.js +3 -3
- package/dist/features/promotions/components/CouponCard.js +16 -7
- package/dist/features/promotions/components/CouponsIndexListing.js +3 -9
- package/dist/features/promotions/hooks/useCouponValidate.d.ts +1 -1
- package/dist/features/promotions/hooks/usePromotions.js +2 -2
- package/dist/features/promotions/repository/coupons.repository.d.ts +21 -15
- package/dist/features/promotions/repository/coupons.repository.js +97 -125
- package/dist/features/promotions/schemas/firestore.d.ts +31 -2
- package/dist/features/promotions/schemas/firestore.js +29 -0
- package/dist/features/promotions/schemas/index.d.ts +9 -12
- package/dist/features/promotions/schemas/index.js +1 -2
- package/dist/features/promotions/types/index.d.ts +1 -2
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewDetailPageView.js +5 -9
- package/dist/features/reviews/components/ReviewFilters.js +1 -1
- package/dist/features/reviews/components/ReviewsIndexListing.js +58 -7
- package/dist/features/reviews/components/ReviewsList.js +2 -2
- package/dist/features/reviews/hooks/useReviews.d.ts +1 -0
- package/dist/features/reviews/hooks/useReviews.js +2 -1
- package/dist/features/reviews/repository/reviews.repository.d.ts +9 -4
- package/dist/features/reviews/repository/reviews.repository.js +18 -7
- package/dist/features/reviews/schemas/firestore.d.ts +5 -2
- package/dist/features/reviews/schemas/firestore.js +1 -0
- package/dist/features/reviews/schemas/index.d.ts +19 -16
- package/dist/features/reviews/schemas/index.js +3 -2
- package/dist/features/reviews/types/index.d.ts +3 -2
- package/dist/features/scams/actions/scam-actions.d.ts +29 -0
- package/dist/features/scams/actions/scam-actions.js +62 -0
- package/dist/features/scams/components/ScamProfileView.d.ts +7 -0
- package/dist/features/scams/components/ScamProfileView.js +49 -0
- package/dist/features/scams/components/ScamRegistryView.d.ts +6 -0
- package/dist/features/scams/components/ScamRegistryView.js +41 -0
- package/dist/features/scams/components/index.d.ts +4 -0
- package/dist/features/scams/components/index.js +2 -0
- package/dist/features/scams/constants/scam-types.d.ts +38 -0
- package/dist/features/scams/constants/scam-types.js +443 -0
- package/dist/features/scams/repository/scammer.repository.d.ts +67 -0
- package/dist/features/scams/repository/scammer.repository.js +160 -0
- package/dist/features/scams/schemas/firestore.d.ts +362 -0
- package/dist/features/scams/schemas/firestore.js +233 -0
- package/dist/features/search/components/Search.d.ts +12 -2
- package/dist/features/search/components/Search.js +26 -7
- package/dist/features/search/components/index.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.d.ts +1 -1
- package/dist/features/search/hooks/useNavSuggestions.js +2 -2
- package/dist/features/search/schemas/index.d.ts +7 -7
- package/dist/features/seller/actions/offer-actions.js +52 -36
- package/dist/features/seller/actions/seller-actions.js +19 -13
- package/dist/features/seller/api/products/route.js +9 -4
- package/dist/features/seller/components/SellerAddressesView.d.ts +3 -12
- package/dist/features/seller/components/SellerAddressesView.js +144 -4
- package/dist/features/seller/components/SellerAuctionsView.js +58 -5
- package/dist/features/seller/components/SellerBidsView.d.ts +4 -0
- package/dist/features/seller/components/SellerBidsView.js +131 -0
- package/dist/features/seller/components/SellerCouponEditorView.d.ts +19 -0
- package/dist/features/seller/components/SellerCouponEditorView.js +67 -0
- package/dist/features/seller/components/SellerCouponsView.d.ts +5 -3
- package/dist/features/seller/components/SellerCouponsView.js +135 -13
- package/dist/features/seller/components/SellerCreateProductView.d.ts +4 -10
- package/dist/features/seller/components/SellerCreateProductView.js +4 -3
- package/dist/features/seller/components/SellerEditProductView.d.ts +4 -10
- package/dist/features/seller/components/SellerEditProductView.js +4 -3
- package/dist/features/seller/components/SellerOffersPanel.d.ts +20 -0
- package/dist/features/seller/components/SellerOffersPanel.js +138 -0
- package/dist/features/seller/components/SellerOffersView.js +56 -5
- package/dist/features/seller/components/SellerOrdersView.d.ts +2 -1
- package/dist/features/seller/components/SellerOrdersView.js +185 -16
- package/dist/features/seller/components/SellerPayoutRequestView.d.ts +7 -0
- package/dist/features/seller/components/SellerPayoutRequestView.js +63 -0
- package/dist/features/seller/components/SellerPayoutSettingsView.d.ts +3 -10
- package/dist/features/seller/components/SellerPayoutSettingsView.js +89 -3
- package/dist/features/seller/components/SellerPayoutsView.js +56 -5
- package/dist/features/seller/components/SellerProductShell.d.ts +68 -0
- package/dist/features/seller/components/SellerProductShell.js +179 -0
- package/dist/features/seller/components/SellerProductsView.d.ts +2 -3
- package/dist/features/seller/components/SellerProductsView.js +194 -18
- package/dist/features/seller/components/SellerReviewsView.d.ts +5 -0
- package/dist/features/seller/components/SellerReviewsView.js +100 -0
- package/dist/features/seller/components/SellerShippingView.d.ts +3 -11
- package/dist/features/seller/components/SellerShippingView.js +87 -3
- package/dist/features/seller/components/SellerSidebar.d.ts +11 -3
- package/dist/features/seller/components/SellerSidebar.js +52 -8
- package/dist/features/seller/components/SellerStorefrontView.d.ts +26 -11
- package/dist/features/seller/components/SellerStorefrontView.js +45 -7
- package/dist/features/seller/components/index.d.ts +16 -2
- package/dist/features/seller/components/index.js +7 -0
- package/dist/features/seller/hooks/useSellerListingData.d.ts +3 -1
- package/dist/features/seller/hooks/useSellerListingData.js +6 -4
- package/dist/features/seller/repository/offer.repository.d.ts +3 -3
- package/dist/features/seller/repository/offer.repository.js +6 -6
- package/dist/features/seller/schemas/firestore.d.ts +7 -7
- package/dist/features/seller/schemas/firestore.js +4 -4
- package/dist/features/seller/schemas/index.d.ts +16 -16
- package/dist/features/shell/FormShell.d.ts +29 -0
- package/dist/features/shell/FormShell.js +103 -0
- package/dist/features/shell/QuickFormDrawer.d.ts +29 -0
- package/dist/features/shell/QuickFormDrawer.js +117 -0
- package/dist/features/shell/StepForm.d.ts +44 -0
- package/dist/features/shell/StepForm.js +81 -0
- package/dist/features/shell/index.d.ts +6 -0
- package/dist/features/shell/index.js +3 -0
- package/dist/features/stores/actions/store-query-actions.js +3 -3
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/products/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/components/InteractiveStoreCard.d.ts +2 -2
- package/dist/features/stores/components/InteractiveStoreCard.js +21 -7
- package/dist/features/stores/components/StoreAboutView.js +1 -1
- package/dist/features/stores/components/StoreAuctionsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreAuctionsListing.js +81 -8
- package/dist/features/stores/components/StoreAuctionsPageView.js +8 -7
- package/dist/features/stores/components/StoreDetailLayoutView.d.ts +1 -0
- package/dist/features/stores/components/StoreDetailLayoutView.js +29 -5
- package/dist/features/stores/components/StoreHeader.js +2 -1
- package/dist/features/stores/components/StorePreOrdersListing.d.ts +4 -2
- package/dist/features/stores/components/StorePreOrdersListing.js +59 -7
- package/dist/features/stores/components/StorePreOrdersPageView.js +8 -7
- package/dist/features/stores/components/StoreProductsListing.d.ts +5 -2
- package/dist/features/stores/components/StoreProductsListing.js +97 -8
- package/dist/features/stores/components/StoreProductsPageView.js +8 -7
- package/dist/features/stores/components/StoreReviewsListing.js +2 -2
- package/dist/features/stores/components/StoresIndexListing.js +74 -11
- package/dist/features/stores/components/StoresListView.js +1 -1
- package/dist/features/stores/hooks/useStores.d.ts +1 -0
- package/dist/features/stores/hooks/useStores.js +1 -0
- package/dist/features/stores/schemas/firestore.d.ts +34 -0
- package/dist/features/stores/schemas/index.d.ts +8 -8
- package/dist/features/sublisting/schemas/firestore.d.ts +30 -0
- package/dist/features/sublisting/schemas/firestore.js +19 -0
- package/dist/features/support/schemas/firestore.d.ts +113 -0
- package/dist/features/support/schemas/firestore.js +95 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.d.ts +5 -0
- package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +143 -0
- package/dist/features/whatsapp-bot/components/index.d.ts +2 -0
- package/dist/features/whatsapp-bot/components/index.js +1 -0
- package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +23 -1
- package/dist/features/whatsapp-bot/helpers/whatsapp.js +104 -0
- package/dist/features/whatsapp-bot/server.d.ts +1 -0
- package/dist/features/whatsapp-bot/server.js +1 -0
- package/dist/features/whatsapp-bot/types/index.d.ts +49 -0
- package/dist/features/wishlist/components/WishlistView.d.ts +0 -10
- package/dist/features/wishlist/components/WishlistView.js +13 -6
- package/dist/features/wishlist/hooks/useWishlist.js +2 -0
- package/dist/features/wishlist/hooks/useWishlistCount.d.ts +11 -3
- package/dist/features/wishlist/hooks/useWishlistCount.js +89 -25
- package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
- package/dist/features/wishlist/schemas/index.d.ts +2 -2
- package/dist/features/wishlist/types/index.d.ts +16 -0
- package/dist/http/api-handler.js +8 -1
- package/dist/index.d.ts +112 -16
- package/dist/index.js +133 -28
- package/dist/monitoring/server-logger.js +9 -3
- package/dist/next/routing/route-map.d.ts +120 -6
- package/dist/next/routing/route-map.js +53 -2
- package/dist/providers/db-firebase/realtime.d.ts +1 -1
- package/dist/react/contexts/SessionContext.js +17 -26
- package/dist/react/hooks/useBulkSelection.d.ts +7 -24
- package/dist/react/hooks/useBulkSelection.js +27 -34
- package/dist/react/hooks/useLongPress.d.ts +3 -16
- package/dist/react/hooks/useLongPress.js +6 -25
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +2 -0
- package/dist/repositories/index.d.ts +3 -0
- package/dist/repositories/index.js +2 -0
- package/dist/seed/actions/demo-seed-actions.d.ts +2 -2
- package/dist/seed/actions/demo-seed-actions.js +1 -1
- package/dist/seed/anime-figures-seed-data.d.ts +8 -0
- package/dist/seed/anime-figures-seed-data.js +1033 -0
- package/dist/seed/beyblade-seed-data.js +206 -24
- package/dist/seed/bids-seed-data.d.ts +4 -10
- package/dist/seed/bids-seed-data.js +365 -238
- package/dist/seed/blog-posts-seed-data.d.ts +3 -2
- package/dist/seed/blog-posts-seed-data.js +250 -511
- package/dist/seed/brands-seed-data.d.ts +7 -0
- package/dist/seed/brands-seed-data.js +410 -0
- package/dist/seed/carousel-slides-seed-data.d.ts +3 -2
- package/dist/seed/carousel-slides-seed-data.js +177 -216
- package/dist/seed/cart-seed-data.d.ts +9 -9
- package/dist/seed/cart-seed-data.js +73 -73
- package/dist/seed/categories-seed-data.d.ts +4 -2
- package/dist/seed/categories-seed-data.js +720 -879
- package/dist/seed/conversations-seed-data.d.ts +8 -0
- package/dist/seed/conversations-seed-data.js +388 -0
- package/dist/seed/cosplay-accessories-seed-data.d.ts +8 -0
- package/dist/seed/cosplay-accessories-seed-data.js +647 -0
- package/dist/seed/coupon-usage-seed-data.d.ts +25 -0
- package/dist/seed/coupon-usage-seed-data.js +69 -0
- package/dist/seed/coupons-seed-data.d.ts +6 -3
- package/dist/seed/coupons-seed-data.js +375 -3
- package/dist/seed/events-seed-data.d.ts +4 -2
- package/dist/seed/events-seed-data.js +128 -430
- package/dist/seed/factories/cart.factory.d.ts +0 -1
- package/dist/seed/factories/cart.factory.js +2 -2
- package/dist/seed/faq-seed-data.d.ts +11 -18
- package/dist/seed/faq-seed-data.js +786 -1817
- package/dist/seed/grouped-listings-seed-data.d.ts +8 -0
- package/dist/seed/grouped-listings-seed-data.js +201 -0
- package/dist/seed/homepage-sections-seed-data.d.ts +3 -13
- package/dist/seed/homepage-sections-seed-data.js +228 -252
- package/dist/seed/hot-wheels-seed-data.js +285 -38
- package/dist/seed/index.d.ts +12 -11
- package/dist/seed/index.js +10 -12
- package/dist/seed/letitrip-official-seed-data.d.ts +8 -0
- package/dist/seed/letitrip-official-seed-data.js +399 -0
- package/dist/seed/manifest.d.ts +15 -0
- package/dist/seed/manifest.js +140 -0
- package/dist/seed/notifications-seed-data.d.ts +4 -2
- package/dist/seed/notifications-seed-data.js +117 -440
- package/dist/seed/orders-seed-data.d.ts +4 -2
- package/dist/seed/orders-seed-data.js +1090 -521
- package/dist/seed/payouts-seed-data.d.ts +4 -2
- package/dist/seed/payouts-seed-data.js +522 -145
- package/dist/seed/pokemon-carousel-slides-seed-data.js +6 -1
- package/dist/seed/pokemon-categories-seed-data.js +81 -81
- package/dist/seed/pokemon-homepage-sections-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-homepage-sections-seed-data.js +116 -23
- package/dist/seed/pokemon-products-seed-data.d.ts +1 -1
- package/dist/seed/pokemon-products-seed-data.js +83 -73
- package/dist/seed/pokemon-seed-bundle.d.ts +5 -1
- package/dist/seed/pokemon-seed-bundle.js +21 -2
- package/dist/seed/pokemon-stores-seed-data.js +85 -9
- package/dist/seed/pokemon-users-seed-data.js +107 -8
- package/dist/seed/products-auctions-seed-data.d.ts +10 -0
- package/dist/seed/products-auctions-seed-data.js +689 -0
- package/dist/seed/products-preorders-seed-data.d.ts +9 -0
- package/dist/seed/products-preorders-seed-data.js +483 -0
- package/dist/seed/products-seed-data.js +34 -13
- package/dist/seed/products-standard-seed-data.d.ts +8 -0
- package/dist/seed/products-standard-seed-data.js +4179 -0
- package/dist/seed/retro-gaming-seed-data.d.ts +8 -0
- package/dist/seed/retro-gaming-seed-data.js +801 -0
- package/dist/seed/reviews-seed-data.d.ts +4 -17
- package/dist/seed/reviews-seed-data.js +1043 -515
- package/dist/seed/scammers-seed-data.d.ts +17 -0
- package/dist/seed/scammers-seed-data.js +118 -0
- package/dist/seed/site-settings-seed-data.js +25 -2
- package/dist/seed/store-addresses-seed-data.js +188 -84
- package/dist/seed/stores-seed-data.d.ts +3 -9
- package/dist/seed/stores-seed-data.js +212 -102
- package/dist/seed/sublisting-categories-seed-data.d.ts +7 -0
- package/dist/seed/sublisting-categories-seed-data.js +315 -0
- package/dist/seed/transformers-seed-data.js +34 -14
- package/dist/seed/users-seed-data.d.ts +3 -2
- package/dist/seed/users-seed-data.js +531 -440
- package/dist/seed/wishlists-seed-data.js +13 -13
- package/dist/server.d.ts +9 -2
- package/dist/server.js +12 -4
- package/dist/tokens/tokens.css +76 -31
- package/dist/ui/components/Avatar.style.css +10 -12
- package/dist/ui/components/BaseListingCard.d.ts +8 -3
- package/dist/ui/components/BaseListingCard.js +17 -6
- package/dist/ui/components/BaseListingCard.style.css +3 -1
- package/dist/ui/components/BulkActionsBar.d.ts +16 -0
- package/dist/ui/components/BulkActionsBar.js +22 -0
- package/dist/ui/components/Button.style.css +23 -23
- package/dist/ui/components/Card.style.css +60 -62
- package/dist/ui/components/Checkbox.style.css +19 -21
- package/dist/ui/components/DashboardStatsCard.style.css +12 -14
- package/dist/ui/components/Drawer.style.css +18 -14
- package/dist/ui/components/Dropdown.style.css +25 -27
- package/dist/ui/components/EmptyState.style.css +2 -4
- package/dist/ui/components/HorizontalScroller.d.ts +3 -1
- package/dist/ui/components/HorizontalScroller.js +116 -21
- package/dist/ui/components/HorizontalScroller.style.css +2 -2
- package/dist/ui/components/ImageLightbox.d.ts +0 -9
- package/dist/ui/components/ImageLightbox.js +43 -9
- package/dist/ui/components/InlineCreateSelect.d.ts +38 -0
- package/dist/ui/components/InlineCreateSelect.js +70 -0
- package/dist/ui/components/ListingLayout.style.css +41 -77
- package/dist/ui/components/ListingToolbar.d.ts +54 -0
- package/dist/ui/components/ListingToolbar.js +34 -0
- package/dist/ui/components/Modal.style.css +14 -10
- package/dist/ui/components/PageLoader.d.ts +11 -0
- package/dist/ui/components/PageLoader.js +21 -0
- package/dist/ui/components/Radio.style.css +34 -36
- package/dist/ui/components/RichTextEditor.js +1 -1
- package/dist/ui/components/RowActionMenu.d.ts +1 -0
- package/dist/ui/components/RowActionMenu.js +4 -2
- package/dist/ui/components/SectionTabs.js +1 -1
- package/dist/ui/components/SectionTabs.style.css +1 -0
- package/dist/ui/components/SideModal.style.css +4 -8
- package/dist/ui/components/Slider.style.css +2 -4
- package/dist/ui/components/Tabs.style.css +8 -10
- package/dist/ui/components/Toast.style.css +22 -24
- package/dist/ui/components/Toggle.style.css +11 -13
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/rich-text/RichText.js +2 -1
- package/dist/ui/rich-text/RichText.style.css +292 -5
- package/dist/ui/rich-text/RichTextRenderer.d.ts +15 -0
- package/dist/ui/rich-text/RichTextRenderer.js +15 -0
- package/dist/utils/id-generators.d.ts +10 -0
- package/dist/utils/id-generators.js +12 -0
- package/dist/validation/schemas.d.ts +9 -9
- package/package.json +5 -1
- package/README.md +0 -116
|
@@ -52,12 +52,14 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
52
52
|
*/
|
|
53
53
|
getCouponsExpiringSoon(days?: number): Promise<CouponDocument[]>;
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
55
|
+
* Steps shared by all public validate methods:
|
|
56
|
+
* 1. Code format 2. DB lookup 3. Validity 4. Per-user limit
|
|
56
57
|
*
|
|
57
|
-
*
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
* Returns either an early-exit failure result or the resolved coupon.
|
|
59
|
+
*/
|
|
60
|
+
private _fetchAndValidateCoupon;
|
|
61
|
+
/**
|
|
62
|
+
* Validate coupon against a flat order total (no cart breakdown).
|
|
61
63
|
*/
|
|
62
64
|
validateCoupon(code: string, userId: string, orderTotal: number): Promise<{
|
|
63
65
|
valid: boolean;
|
|
@@ -66,15 +68,19 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
66
68
|
message?: string;
|
|
67
69
|
}>;
|
|
68
70
|
/**
|
|
69
|
-
*
|
|
71
|
+
* Record coupon usage after a successful checkout.
|
|
70
72
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* @
|
|
73
|
+
* Increments both the global coupon counter and the per-user usage doc so
|
|
74
|
+
* that subsequent `validateCoupon` calls respect `perUserLimit` and
|
|
75
|
+
* `totalLimit` correctly.
|
|
76
|
+
*
|
|
77
|
+
* @param couponId - Coupon document ID (e.g. "coupon-welcome10")
|
|
78
|
+
* @param couponCode - Human-readable code (e.g. "WELCOME10")
|
|
79
|
+
* @param userId - Buyer UID
|
|
80
|
+
* @param orderIds - All order IDs created in this checkout that used the coupon
|
|
81
|
+
* @param discountAmount - Total discount amount applied across all order groups
|
|
76
82
|
*/
|
|
77
|
-
applyCoupon(couponId: string, userId: string,
|
|
83
|
+
applyCoupon(couponId: string, couponCode: string, userId: string, orderIds: string[], discountAmount: number): Promise<void>;
|
|
78
84
|
/**
|
|
79
85
|
* Get user's coupon usage count for a specific coupon
|
|
80
86
|
*
|
|
@@ -109,7 +115,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
109
115
|
*
|
|
110
116
|
* @param sellerId - The seller's user UID
|
|
111
117
|
*/
|
|
112
|
-
|
|
118
|
+
getStoreCoupons(storeId: string): Promise<CouponDocument[]>;
|
|
113
119
|
/**
|
|
114
120
|
* Validate a coupon against the cart items and return a per-item breakdown.
|
|
115
121
|
*
|
|
@@ -130,7 +136,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
130
136
|
*/
|
|
131
137
|
validateCouponForCart(code: string, userId: string, cartItems: Array<{
|
|
132
138
|
productId: string;
|
|
133
|
-
|
|
139
|
+
storeId: string;
|
|
134
140
|
price: number;
|
|
135
141
|
quantity: number;
|
|
136
142
|
isPreOrder: boolean;
|
|
@@ -142,7 +148,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
142
148
|
eligibleSubtotal?: number;
|
|
143
149
|
eligibleProductIds?: string[];
|
|
144
150
|
scope?: "admin" | "seller";
|
|
145
|
-
|
|
151
|
+
storeId?: string;
|
|
146
152
|
message?: string;
|
|
147
153
|
}>;
|
|
148
154
|
static readonly SIEVE_FIELDS: {
|
|
@@ -4,23 +4,11 @@
|
|
|
4
4
|
* Manages coupon creation, validation, and usage tracking
|
|
5
5
|
*/
|
|
6
6
|
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
7
|
-
import { COUPONS_COLLECTION, isValidCouponCode, isCouponValid, canUserUseCoupon, calculateDiscount, createCouponId, } from "../schemas";
|
|
7
|
+
import { COUPONS_COLLECTION, COUPON_FIELDS, isValidCouponCode, isCouponValid, canUserUseCoupon, calculateDiscount, createCouponId, } from "../schemas";
|
|
8
8
|
import { USER_COLLECTION } from "../../auth/schemas";
|
|
9
9
|
import { DatabaseError } from "../../../errors";
|
|
10
|
-
import { increment, serverTimestamp } from "../../../contracts/field-ops";
|
|
10
|
+
import { increment, arrayUnion, serverTimestamp } from "../../../contracts/field-ops";
|
|
11
11
|
const COUPON_USAGE_SUBCOLLECTION = "couponUsage";
|
|
12
|
-
const COUPON_FIELDS = {
|
|
13
|
-
CODE: "code",
|
|
14
|
-
TYPE: "type",
|
|
15
|
-
CREATED_BY: "createdBy",
|
|
16
|
-
SELLER_ID: "sellerId",
|
|
17
|
-
CREATED_AT: "createdAt",
|
|
18
|
-
VALIDITY_FIELDS: {
|
|
19
|
-
IS_ACTIVE: "validity.isActive",
|
|
20
|
-
START_DATE: "validity.startDate",
|
|
21
|
-
END_DATE: "validity.endDate",
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
12
|
/**
|
|
25
13
|
* Repository for coupon management
|
|
26
14
|
*/
|
|
@@ -87,9 +75,9 @@ export class CouponsRepository extends BaseRepository {
|
|
|
87
75
|
// validity.isActive ASC + validity.endDate ASC (see firestore.indexes.json)
|
|
88
76
|
const snapshot = await this.db
|
|
89
77
|
.collection(this.collection)
|
|
90
|
-
.where(COUPON_FIELDS.
|
|
91
|
-
.where(COUPON_FIELDS.
|
|
92
|
-
.orderBy(COUPON_FIELDS.
|
|
78
|
+
.where(COUPON_FIELDS.VALIDITY.IS_ACTIVE, "==", true)
|
|
79
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, ">=", now)
|
|
80
|
+
.orderBy(COUPON_FIELDS.VALIDITY.END_DATE, "asc")
|
|
93
81
|
.get();
|
|
94
82
|
return snapshot.docs
|
|
95
83
|
.map((doc) => this.mapDoc(doc))
|
|
@@ -147,13 +135,13 @@ export class CouponsRepository extends BaseRepository {
|
|
|
147
135
|
try {
|
|
148
136
|
const now = new Date();
|
|
149
137
|
const futureDate = new Date(now.getTime() + days * 24 * 60 * 60 * 1000);
|
|
150
|
-
// Firestore-native range filter
|
|
138
|
+
// Firestore-native range filter — reuses the same composite index as getActiveCoupons()
|
|
151
139
|
const snapshot = await this.db
|
|
152
140
|
.collection(this.collection)
|
|
153
|
-
.where(COUPON_FIELDS.
|
|
154
|
-
.where(COUPON_FIELDS.
|
|
155
|
-
.where(COUPON_FIELDS.
|
|
156
|
-
.orderBy(COUPON_FIELDS.
|
|
141
|
+
.where(COUPON_FIELDS.VALIDITY.IS_ACTIVE, "==", true)
|
|
142
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, ">", now)
|
|
143
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, "<=", futureDate)
|
|
144
|
+
.orderBy(COUPON_FIELDS.VALIDITY.END_DATE, "asc")
|
|
157
145
|
.get();
|
|
158
146
|
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
159
147
|
}
|
|
@@ -161,99 +149,91 @@ export class CouponsRepository extends BaseRepository {
|
|
|
161
149
|
throw new DatabaseError(`Failed to retrieve expiring coupons: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
162
150
|
}
|
|
163
151
|
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// Private helpers
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
164
155
|
/**
|
|
165
|
-
*
|
|
156
|
+
* Steps shared by all public validate methods:
|
|
157
|
+
* 1. Code format 2. DB lookup 3. Validity 4. Per-user limit
|
|
166
158
|
*
|
|
167
|
-
*
|
|
168
|
-
* @param userId - User ID attempting to use coupon
|
|
169
|
-
* @param orderTotal - Order total amount (for validation)
|
|
170
|
-
* @returns Promise<{valid: boolean, coupon?: CouponDocument, message?: string}>
|
|
159
|
+
* Returns either an early-exit failure result or the resolved coupon.
|
|
171
160
|
*/
|
|
172
|
-
async
|
|
173
|
-
// Validate code format
|
|
161
|
+
async _fetchAndValidateCoupon(code, userId) {
|
|
174
162
|
if (!isValidCouponCode(code)) {
|
|
175
|
-
return {
|
|
176
|
-
valid: false,
|
|
177
|
-
message: "Invalid coupon code format",
|
|
178
|
-
};
|
|
163
|
+
return { ok: false, result: { valid: false, message: "Invalid coupon code format" } };
|
|
179
164
|
}
|
|
180
|
-
// Get coupon from database
|
|
181
165
|
const coupon = await this.getCouponByCode(code);
|
|
182
166
|
if (!coupon) {
|
|
183
|
-
return {
|
|
184
|
-
valid: false,
|
|
185
|
-
message: "Coupon not found",
|
|
186
|
-
};
|
|
167
|
+
return { ok: false, result: { valid: false, message: "Coupon not found" } };
|
|
187
168
|
}
|
|
188
|
-
// Check if coupon is valid (active, date range, usage limits)
|
|
189
169
|
if (!isCouponValid(coupon)) {
|
|
190
|
-
return {
|
|
191
|
-
valid: false,
|
|
192
|
-
coupon,
|
|
193
|
-
message: "Coupon is not currently valid",
|
|
194
|
-
};
|
|
170
|
+
return { ok: false, result: { valid: false, coupon, message: "Coupon is not currently valid" } };
|
|
195
171
|
}
|
|
196
|
-
// Check minimum purchase requirement
|
|
197
|
-
if (coupon.discount.minPurchase &&
|
|
198
|
-
orderTotal < coupon.discount.minPurchase) {
|
|
199
|
-
return {
|
|
200
|
-
valid: false,
|
|
201
|
-
coupon,
|
|
202
|
-
message: "Minimum purchase requirement not met",
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
// Check user-specific usage limit
|
|
206
172
|
const userUsageCount = await this.getUserCouponUsageCount(userId, coupon.id);
|
|
207
173
|
if (!canUserUseCoupon(coupon, userUsageCount)) {
|
|
208
|
-
return {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
174
|
+
return { ok: false, result: { valid: false, coupon, message: "You have reached the usage limit for this coupon" } };
|
|
175
|
+
}
|
|
176
|
+
return { ok: true, coupon };
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Public validation methods
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Validate coupon against a flat order total (no cart breakdown).
|
|
183
|
+
*/
|
|
184
|
+
async validateCoupon(code, userId, orderTotal) {
|
|
185
|
+
const check = await this._fetchAndValidateCoupon(code, userId);
|
|
186
|
+
if (!check.ok)
|
|
187
|
+
return check.result;
|
|
188
|
+
const { coupon } = check;
|
|
189
|
+
if (coupon.discount.minPurchase && orderTotal < coupon.discount.minPurchase) {
|
|
190
|
+
return { valid: false, coupon, message: "Minimum purchase requirement not met" };
|
|
213
191
|
}
|
|
214
|
-
// Calculate discount
|
|
215
|
-
const discountAmount = calculateDiscount(coupon, orderTotal);
|
|
216
192
|
return {
|
|
217
193
|
valid: true,
|
|
218
194
|
coupon,
|
|
219
|
-
discountAmount,
|
|
195
|
+
discountAmount: calculateDiscount(coupon, orderTotal),
|
|
220
196
|
message: "Coupon is valid",
|
|
221
197
|
};
|
|
222
198
|
}
|
|
223
199
|
/**
|
|
224
|
-
*
|
|
200
|
+
* Record coupon usage after a successful checkout.
|
|
225
201
|
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
* @
|
|
202
|
+
* Increments both the global coupon counter and the per-user usage doc so
|
|
203
|
+
* that subsequent `validateCoupon` calls respect `perUserLimit` and
|
|
204
|
+
* `totalLimit` correctly.
|
|
205
|
+
*
|
|
206
|
+
* @param couponId - Coupon document ID (e.g. "coupon-welcome10")
|
|
207
|
+
* @param couponCode - Human-readable code (e.g. "WELCOME10")
|
|
208
|
+
* @param userId - Buyer UID
|
|
209
|
+
* @param orderIds - All order IDs created in this checkout that used the coupon
|
|
210
|
+
* @param discountAmount - Total discount amount applied across all order groups
|
|
231
211
|
*/
|
|
232
|
-
async applyCoupon(couponId, userId,
|
|
212
|
+
async applyCoupon(couponId, couponCode, userId, orderIds, discountAmount) {
|
|
233
213
|
try {
|
|
234
214
|
const batch = this.db.batch();
|
|
235
|
-
//
|
|
215
|
+
// Increment global coupon counters
|
|
236
216
|
const couponRef = this.db.collection(this.collection).doc(couponId);
|
|
237
217
|
batch.update(couponRef, {
|
|
238
218
|
"usage.currentUsage": increment(1),
|
|
239
|
-
"stats.
|
|
240
|
-
"stats.
|
|
219
|
+
"stats.totalDiscount": increment(discountAmount),
|
|
220
|
+
"stats.totalUses": increment(1),
|
|
241
221
|
updatedAt: new Date(),
|
|
242
222
|
});
|
|
243
|
-
//
|
|
244
|
-
const usageData = {
|
|
245
|
-
userId,
|
|
246
|
-
couponCode: "", // Will be filled by getCouponByCode
|
|
247
|
-
orderId,
|
|
248
|
-
discountAmount,
|
|
249
|
-
usedAt: new Date(),
|
|
250
|
-
};
|
|
223
|
+
// Upsert per-user usage doc — safe for perUserLimit > 1
|
|
251
224
|
const usageRef = this.db
|
|
252
225
|
.collection(USER_COLLECTION)
|
|
253
226
|
.doc(userId)
|
|
254
227
|
.collection(COUPON_USAGE_SUBCOLLECTION)
|
|
255
228
|
.doc(couponId);
|
|
256
|
-
|
|
229
|
+
// FieldValue sentinels (increment, arrayUnion) must NOT go through
|
|
230
|
+
// prepareForFirestore — it recurses into objects and Object.keys() on a
|
|
231
|
+
// FieldValue returns [] (non-enumerable internals), silently dropping them.
|
|
232
|
+
batch.set(usageRef, {
|
|
233
|
+
...prepareForFirestore({ userId, couponCode: couponCode.toUpperCase(), lastUsedAt: new Date() }),
|
|
234
|
+
usageCount: increment(1),
|
|
235
|
+
orders: arrayUnion(...orderIds),
|
|
236
|
+
}, { merge: true });
|
|
257
237
|
await batch.commit();
|
|
258
238
|
}
|
|
259
239
|
catch (error) {
|
|
@@ -275,7 +255,10 @@ export class CouponsRepository extends BaseRepository {
|
|
|
275
255
|
.collection(COUPON_USAGE_SUBCOLLECTION)
|
|
276
256
|
.doc(couponId)
|
|
277
257
|
.get();
|
|
278
|
-
|
|
258
|
+
if (!doc.exists)
|
|
259
|
+
return 0;
|
|
260
|
+
const data = doc.data();
|
|
261
|
+
return data.usageCount ?? 1;
|
|
279
262
|
}
|
|
280
263
|
catch {
|
|
281
264
|
return 0;
|
|
@@ -345,17 +328,17 @@ export class CouponsRepository extends BaseRepository {
|
|
|
345
328
|
*
|
|
346
329
|
* @param sellerId - The seller's user UID
|
|
347
330
|
*/
|
|
348
|
-
async
|
|
331
|
+
async getStoreCoupons(storeId) {
|
|
349
332
|
try {
|
|
350
333
|
const snapshot = await this.db
|
|
351
334
|
.collection(this.collection)
|
|
352
|
-
.where(COUPON_FIELDS.
|
|
335
|
+
.where(COUPON_FIELDS.STORE_ID, "==", storeId)
|
|
353
336
|
.orderBy(COUPON_FIELDS.CREATED_AT, "desc")
|
|
354
337
|
.get();
|
|
355
338
|
return snapshot.docs.map((doc) => this.mapDoc(doc));
|
|
356
339
|
}
|
|
357
340
|
catch (error) {
|
|
358
|
-
throw new DatabaseError(`Failed to retrieve
|
|
341
|
+
throw new DatabaseError(`Failed to retrieve store coupons: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
359
342
|
}
|
|
360
343
|
}
|
|
361
344
|
/**
|
|
@@ -377,40 +360,27 @@ export class CouponsRepository extends BaseRepository {
|
|
|
377
360
|
* and `eligibleProductIds` (the `productId` values that qualify).
|
|
378
361
|
*/
|
|
379
362
|
async validateCouponForCart(code, userId, cartItems) {
|
|
380
|
-
|
|
381
|
-
if (!
|
|
382
|
-
return
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
if (!isCouponValid(coupon)) {
|
|
389
|
-
return { valid: false, coupon, message: "Coupon is not currently valid" };
|
|
390
|
-
}
|
|
391
|
-
const userUsageCount = await this.getUserCouponUsageCount(userId, coupon.id);
|
|
392
|
-
if (!canUserUseCoupon(coupon, userUsageCount)) {
|
|
393
|
-
return {
|
|
394
|
-
valid: false,
|
|
395
|
-
coupon,
|
|
396
|
-
message: "You have reached the usage limit for this coupon",
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
// Determine eligible items
|
|
400
|
-
// Pre-order items are always excluded
|
|
401
|
-
let eligible = cartItems.filter((item) => !item.isPreOrder);
|
|
363
|
+
const check = await this._fetchAndValidateCoupon(code, userId);
|
|
364
|
+
if (!check.ok)
|
|
365
|
+
return check.result;
|
|
366
|
+
const { coupon } = check;
|
|
367
|
+
// Determine eligible items — no blanket exclusion by product type.
|
|
368
|
+
// Coupon flags (applicableToAuctions) decide type eligibility below.
|
|
369
|
+
let eligible = [...cartItems];
|
|
402
370
|
const scope = coupon.scope ?? "admin";
|
|
403
371
|
if (scope === "seller") {
|
|
404
|
-
// Restrict to this
|
|
405
|
-
eligible = eligible.filter((item) => item.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
372
|
+
// Restrict to this store's items
|
|
373
|
+
eligible = eligible.filter((item) => item.storeId === coupon.storeId);
|
|
374
|
+
}
|
|
375
|
+
// Apply product-type filter based on the coupon's own flag:
|
|
376
|
+
// true → auction-only coupon
|
|
377
|
+
// false → explicitly excludes auctions (but includes pre-orders & simple)
|
|
378
|
+
// undefined → no restriction; applies to all product types
|
|
379
|
+
if (coupon.applicableToAuctions === true) {
|
|
380
|
+
eligible = eligible.filter((item) => item.isAuction);
|
|
381
|
+
}
|
|
382
|
+
else if (coupon.applicableToAuctions === false) {
|
|
383
|
+
eligible = eligible.filter((item) => !item.isAuction);
|
|
414
384
|
}
|
|
415
385
|
// Apply product/category restrictions from the coupon itself
|
|
416
386
|
const { applicableProducts, applicableCategories, excludeProducts } = coupon.restrictions;
|
|
@@ -420,16 +390,18 @@ export class CouponsRepository extends BaseRepository {
|
|
|
420
390
|
if (excludeProducts && excludeProducts.length > 0) {
|
|
421
391
|
eligible = eligible.filter((item) => !excludeProducts.includes(item.productId));
|
|
422
392
|
}
|
|
423
|
-
// Note: category filtering requires product metadata
|
|
393
|
+
// Note: category filtering requires product metadata — skipped here but
|
|
424
394
|
// the restriction is stored and can be enforced by the order service.
|
|
425
395
|
void applicableCategories;
|
|
426
396
|
if (eligible.length === 0) {
|
|
427
397
|
return {
|
|
428
398
|
valid: false,
|
|
429
399
|
coupon,
|
|
430
|
-
message:
|
|
431
|
-
? "This coupon
|
|
432
|
-
:
|
|
400
|
+
message: coupon.applicableToAuctions === true
|
|
401
|
+
? "This coupon only applies to auction items"
|
|
402
|
+
: scope === "seller"
|
|
403
|
+
? "This coupon is not valid for the items in your cart from this seller"
|
|
404
|
+
: "No eligible items found for this coupon",
|
|
433
405
|
};
|
|
434
406
|
}
|
|
435
407
|
const eligibleSubtotal = eligible.reduce((sum, item) => sum + item.price * item.quantity, 0);
|
|
@@ -449,7 +421,7 @@ export class CouponsRepository extends BaseRepository {
|
|
|
449
421
|
eligibleSubtotal,
|
|
450
422
|
eligibleProductIds: eligible.map((item) => item.productId),
|
|
451
423
|
scope,
|
|
452
|
-
|
|
424
|
+
storeId: coupon.storeId,
|
|
453
425
|
message: "Coupon is valid",
|
|
454
426
|
};
|
|
455
427
|
}
|
|
@@ -478,8 +450,8 @@ export class CouponsRepository extends BaseRepository {
|
|
|
478
450
|
async getExpiredActiveRefs(now) {
|
|
479
451
|
const snap = await this.db
|
|
480
452
|
.collection(this.collection)
|
|
481
|
-
.where(COUPON_FIELDS.
|
|
482
|
-
.where(COUPON_FIELDS.
|
|
453
|
+
.where(COUPON_FIELDS.VALIDITY.IS_ACTIVE, "==", true)
|
|
454
|
+
.where(COUPON_FIELDS.VALIDITY.END_DATE, "<=", now)
|
|
483
455
|
.limit(500)
|
|
484
456
|
.get();
|
|
485
457
|
return snap.docs.map((d) => d.ref);
|
|
@@ -489,7 +461,7 @@ export class CouponsRepository extends BaseRepository {
|
|
|
489
461
|
*/
|
|
490
462
|
deactivateInBatch(batch, ref) {
|
|
491
463
|
batch.update(ref, {
|
|
492
|
-
[COUPON_FIELDS.
|
|
464
|
+
[COUPON_FIELDS.VALIDITY.IS_ACTIVE]: false,
|
|
493
465
|
updatedAt: serverTimestamp(),
|
|
494
466
|
});
|
|
495
467
|
}
|
|
@@ -48,8 +48,8 @@ export interface CouponDocument {
|
|
|
48
48
|
description: string;
|
|
49
49
|
type: CouponType;
|
|
50
50
|
scope: "admin" | "seller";
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
/** For seller-scoped coupons: the storeId (= storeSlug = store.id) of the issuing store */
|
|
52
|
+
storeId?: string;
|
|
53
53
|
applicableToAuctions?: boolean;
|
|
54
54
|
discount: DiscountConfig;
|
|
55
55
|
bxgy?: BXGYConfig;
|
|
@@ -73,6 +73,34 @@ export interface CouponUsageDocument {
|
|
|
73
73
|
export declare const COUPONS_COLLECTION: "coupons";
|
|
74
74
|
export declare const COUPON_USAGE_SUBCOLLECTION: "couponUsage";
|
|
75
75
|
export declare const COUPONS_INDEXED_FIELDS: readonly ["code", "validity.isActive", "validity.startDate", "validity.endDate", "type", "createdBy"];
|
|
76
|
+
export declare const COUPON_FIELDS: {
|
|
77
|
+
readonly CODE: "code";
|
|
78
|
+
readonly TYPE: "type";
|
|
79
|
+
readonly SCOPE: "scope";
|
|
80
|
+
readonly CREATED_BY: "createdBy";
|
|
81
|
+
readonly STORE_ID: "storeId";
|
|
82
|
+
readonly CREATED_AT: "createdAt";
|
|
83
|
+
readonly UPDATED_AT: "updatedAt";
|
|
84
|
+
readonly VALIDITY: {
|
|
85
|
+
readonly IS_ACTIVE: "validity.isActive";
|
|
86
|
+
readonly START_DATE: "validity.startDate";
|
|
87
|
+
readonly END_DATE: "validity.endDate";
|
|
88
|
+
};
|
|
89
|
+
readonly USAGE: {
|
|
90
|
+
readonly CURRENT_USAGE: "usage.currentUsage";
|
|
91
|
+
readonly TOTAL_LIMIT: "usage.totalLimit";
|
|
92
|
+
};
|
|
93
|
+
readonly TYPE_VALUES: {
|
|
94
|
+
readonly PERCENTAGE: CouponType;
|
|
95
|
+
readonly FIXED: CouponType;
|
|
96
|
+
readonly FREE_SHIPPING: CouponType;
|
|
97
|
+
readonly BUY_X_GET_Y: CouponType;
|
|
98
|
+
};
|
|
99
|
+
readonly SCOPE_VALUES: {
|
|
100
|
+
readonly ADMIN: "admin";
|
|
101
|
+
readonly SELLER: "seller";
|
|
102
|
+
};
|
|
103
|
+
};
|
|
76
104
|
export declare const COUPON_TYPE_LABELS: Record<CouponType, string>;
|
|
77
105
|
export declare const DEFAULT_COUPON_DATA: Partial<CouponDocument>;
|
|
78
106
|
export declare const COUPONS_PUBLIC_FIELDS: readonly ["id", "code", "name", "description", "type", "discount", "validity.startDate", "validity.endDate", "usage.totalLimit", "usage.perUserLimit"];
|
|
@@ -93,6 +121,7 @@ export declare const couponQueryHelpers: {
|
|
|
93
121
|
readonly inactive: () => readonly ["validity.isActive", "==", false];
|
|
94
122
|
readonly byType: (type: CouponType) => readonly ["type", "==", CouponType];
|
|
95
123
|
readonly byCreator: (userId: string) => readonly ["createdBy", "==", string];
|
|
124
|
+
readonly byStore: (storeId: string) => readonly ["storeId", "==", string];
|
|
96
125
|
readonly expiringSoon: (days?: number) => readonly ["validity.endDate", "<=", Date];
|
|
97
126
|
};
|
|
98
127
|
export declare function createCouponId(code: string): string;
|
|
@@ -12,6 +12,34 @@ export const COUPONS_INDEXED_FIELDS = [
|
|
|
12
12
|
"type",
|
|
13
13
|
"createdBy",
|
|
14
14
|
];
|
|
15
|
+
export const COUPON_FIELDS = {
|
|
16
|
+
CODE: "code",
|
|
17
|
+
TYPE: "type",
|
|
18
|
+
SCOPE: "scope",
|
|
19
|
+
CREATED_BY: "createdBy",
|
|
20
|
+
STORE_ID: "storeId",
|
|
21
|
+
CREATED_AT: "createdAt",
|
|
22
|
+
UPDATED_AT: "updatedAt",
|
|
23
|
+
VALIDITY: {
|
|
24
|
+
IS_ACTIVE: "validity.isActive",
|
|
25
|
+
START_DATE: "validity.startDate",
|
|
26
|
+
END_DATE: "validity.endDate",
|
|
27
|
+
},
|
|
28
|
+
USAGE: {
|
|
29
|
+
CURRENT_USAGE: "usage.currentUsage",
|
|
30
|
+
TOTAL_LIMIT: "usage.totalLimit",
|
|
31
|
+
},
|
|
32
|
+
TYPE_VALUES: {
|
|
33
|
+
PERCENTAGE: "percentage",
|
|
34
|
+
FIXED: "fixed",
|
|
35
|
+
FREE_SHIPPING: "free_shipping",
|
|
36
|
+
BUY_X_GET_Y: "buy_x_get_y",
|
|
37
|
+
},
|
|
38
|
+
SCOPE_VALUES: {
|
|
39
|
+
ADMIN: "admin",
|
|
40
|
+
SELLER: "seller",
|
|
41
|
+
},
|
|
42
|
+
};
|
|
15
43
|
export const COUPON_TYPE_LABELS = {
|
|
16
44
|
percentage: "Percentage Discount",
|
|
17
45
|
fixed: "Fixed Amount Discount",
|
|
@@ -52,6 +80,7 @@ export const couponQueryHelpers = {
|
|
|
52
80
|
inactive: () => ["validity.isActive", "==", false],
|
|
53
81
|
byType: (type) => ["type", "==", type],
|
|
54
82
|
byCreator: (userId) => ["createdBy", "==", userId],
|
|
83
|
+
byStore: (storeId) => ["storeId", "==", storeId],
|
|
55
84
|
expiringSoon: (days = 7) => {
|
|
56
85
|
const futureDate = new Date();
|
|
57
86
|
futureDate.setDate(futureDate.getDate() + days);
|
|
@@ -31,7 +31,6 @@ export declare const couponItemSchema: z.ZodObject<{
|
|
|
31
31
|
getQuantity: z.ZodOptional<z.ZodNumber>;
|
|
32
32
|
applicableProductIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
33
33
|
applicableCategoryIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
34
|
-
sellerId: z.ZodOptional<z.ZodString>;
|
|
35
34
|
storeId: z.ZodOptional<z.ZodString>;
|
|
36
35
|
isPublic: z.ZodBoolean;
|
|
37
36
|
isActive: z.ZodBoolean;
|
|
@@ -49,17 +48,16 @@ export declare const couponItemSchema: z.ZodObject<{
|
|
|
49
48
|
updatedAt: string;
|
|
50
49
|
isActive: boolean;
|
|
51
50
|
description: string;
|
|
52
|
-
isPublic: boolean;
|
|
53
51
|
discountValue: number;
|
|
52
|
+
isPublic: boolean;
|
|
54
53
|
usageCount: number;
|
|
55
|
-
sellerId?: string | undefined;
|
|
56
|
-
startsAt?: string | undefined;
|
|
57
54
|
storeId?: string | undefined;
|
|
55
|
+
startsAt?: string | undefined;
|
|
56
|
+
perUserLimit?: number | undefined;
|
|
58
57
|
expiresAt?: string | undefined;
|
|
59
58
|
minOrderAmount?: number | undefined;
|
|
60
59
|
maxDiscountAmount?: number | undefined;
|
|
61
60
|
maxUsageCount?: number | undefined;
|
|
62
|
-
perUserLimit?: number | undefined;
|
|
63
61
|
buyQuantity?: number | undefined;
|
|
64
62
|
getQuantity?: number | undefined;
|
|
65
63
|
applicableProductIds?: string[] | undefined;
|
|
@@ -74,17 +72,16 @@ export declare const couponItemSchema: z.ZodObject<{
|
|
|
74
72
|
updatedAt: string;
|
|
75
73
|
isActive: boolean;
|
|
76
74
|
description: string;
|
|
77
|
-
isPublic: boolean;
|
|
78
75
|
discountValue: number;
|
|
76
|
+
isPublic: boolean;
|
|
79
77
|
usageCount: number;
|
|
80
|
-
sellerId?: string | undefined;
|
|
81
|
-
startsAt?: string | undefined;
|
|
82
78
|
storeId?: string | undefined;
|
|
79
|
+
startsAt?: string | undefined;
|
|
80
|
+
perUserLimit?: number | undefined;
|
|
83
81
|
expiresAt?: string | undefined;
|
|
84
82
|
minOrderAmount?: number | undefined;
|
|
85
83
|
maxDiscountAmount?: number | undefined;
|
|
86
84
|
maxUsageCount?: number | undefined;
|
|
87
|
-
perUserLimit?: number | undefined;
|
|
88
85
|
buyQuantity?: number | undefined;
|
|
89
86
|
getQuantity?: number | undefined;
|
|
90
87
|
applicableProductIds?: string[] | undefined;
|
|
@@ -93,7 +90,7 @@ export declare const couponItemSchema: z.ZodObject<{
|
|
|
93
90
|
export declare const promotionsListParamsSchema: z.ZodObject<{
|
|
94
91
|
scope: z.ZodOptional<z.ZodEnum<["admin", "seller"]>>;
|
|
95
92
|
isActive: z.ZodOptional<z.ZodBoolean>;
|
|
96
|
-
|
|
93
|
+
storeId: z.ZodOptional<z.ZodString>;
|
|
97
94
|
page: z.ZodOptional<z.ZodNumber>;
|
|
98
95
|
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
99
96
|
filters: z.ZodOptional<z.ZodString>;
|
|
@@ -105,7 +102,7 @@ export declare const promotionsListParamsSchema: z.ZodObject<{
|
|
|
105
102
|
page?: number | undefined;
|
|
106
103
|
pageSize?: number | undefined;
|
|
107
104
|
filters?: string | undefined;
|
|
108
|
-
|
|
105
|
+
storeId?: string | undefined;
|
|
109
106
|
}, {
|
|
110
107
|
sort?: string | undefined;
|
|
111
108
|
scope?: "admin" | "seller" | undefined;
|
|
@@ -113,5 +110,5 @@ export declare const promotionsListParamsSchema: z.ZodObject<{
|
|
|
113
110
|
page?: number | undefined;
|
|
114
111
|
pageSize?: number | undefined;
|
|
115
112
|
filters?: string | undefined;
|
|
116
|
-
|
|
113
|
+
storeId?: string | undefined;
|
|
117
114
|
}>;
|
|
@@ -38,7 +38,6 @@ export const couponItemSchema = z.object({
|
|
|
38
38
|
getQuantity: z.number().optional(),
|
|
39
39
|
applicableProductIds: z.array(z.string()).optional(),
|
|
40
40
|
applicableCategoryIds: z.array(z.string()).optional(),
|
|
41
|
-
sellerId: z.string().optional(),
|
|
42
41
|
storeId: z.string().optional(),
|
|
43
42
|
isPublic: z.boolean(),
|
|
44
43
|
isActive: z.boolean(),
|
|
@@ -50,7 +49,7 @@ export const couponItemSchema = z.object({
|
|
|
50
49
|
export const promotionsListParamsSchema = z.object({
|
|
51
50
|
scope: couponScopeSchema.optional(),
|
|
52
51
|
isActive: z.coerce.boolean().optional(),
|
|
53
|
-
|
|
52
|
+
storeId: z.string().optional(),
|
|
54
53
|
page: z.coerce.number().optional(),
|
|
55
54
|
pageSize: z.coerce.number().optional(),
|
|
56
55
|
filters: z.string().optional(),
|
|
@@ -17,7 +17,6 @@ export interface CouponItem {
|
|
|
17
17
|
getQuantity?: number;
|
|
18
18
|
applicableProductIds?: string[];
|
|
19
19
|
applicableCategoryIds?: string[];
|
|
20
|
-
sellerId?: string;
|
|
21
20
|
storeId?: string;
|
|
22
21
|
isPublic: boolean;
|
|
23
22
|
isActive: boolean;
|
|
@@ -43,7 +42,7 @@ export interface PromotionsListResponse {
|
|
|
43
42
|
export interface PromotionsListParams {
|
|
44
43
|
scope?: CouponScope;
|
|
45
44
|
isActive?: boolean;
|
|
46
|
-
|
|
45
|
+
storeId?: string;
|
|
47
46
|
page?: number;
|
|
48
47
|
pageSize?: number;
|
|
49
48
|
filters?: string;
|
|
@@ -29,7 +29,8 @@ export async function createReview(userId, input) {
|
|
|
29
29
|
return reviewRepository.create({
|
|
30
30
|
productId: input.productId,
|
|
31
31
|
productTitle: product.title,
|
|
32
|
-
|
|
32
|
+
storeId: product.storeId,
|
|
33
|
+
storeName: product.storeName,
|
|
33
34
|
userId,
|
|
34
35
|
userName: profile?.displayName ?? "Anonymous",
|
|
35
36
|
userAvatar: profile?.photoURL ?? "",
|
|
@@ -159,7 +160,7 @@ export async function listAdminReviews(params) {
|
|
|
159
160
|
return reviewRepository.listAll(sieve);
|
|
160
161
|
}
|
|
161
162
|
export async function listReviewsBySeller(sellerId) {
|
|
162
|
-
const products = await productRepository.
|
|
163
|
+
const products = await productRepository.findByStore(sellerId);
|
|
163
164
|
const productIds = products
|
|
164
165
|
.filter((product) => product.status === ProductStatusValues.PUBLISHED)
|
|
165
166
|
.map((product) => product.id);
|