@mohasinac/appkit 4.9.2 → 4.9.4
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/features/admin/repository/notification.repository.js +2 -2
- package/dist/features/auctions/repository/bid.repository.d.ts +3 -1
- package/dist/features/auctions/repository/bid.repository.js +3 -3
- package/dist/features/auth/repository/session.repository.js +4 -4
- package/dist/features/auth/repository/user.repository.js +3 -3
- package/dist/features/blog/repository/blog.repository.d.ts +4 -1
- package/dist/features/blog/repository/blog.repository.js +4 -4
- package/dist/features/cart/repository/cart.repository.js +3 -3
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +2 -1
- package/dist/features/catalogue/repository/catalogue.repository.js +2 -2
- package/dist/features/categories/repository/categories.repository.js +2 -2
- package/dist/features/events/repository/event-entry.repository.js +2 -2
- package/dist/features/events/repository/events.repository.js +4 -4
- package/dist/features/faq/repository/faqs.repository.js +2 -2
- package/dist/features/homepage/repository/carousel.repository.js +3 -3
- package/dist/features/homepage/repository/homepage-sections.repository.js +3 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +2 -2
- package/dist/features/orders/repository/orders.repository.d.ts +5 -1
- package/dist/features/orders/repository/orders.repository.js +5 -5
- package/dist/features/payments/repository/payout.repository.d.ts +4 -1
- package/dist/features/payments/repository/payout.repository.js +4 -4
- package/dist/features/products/repository/products.repository.d.ts +7 -1
- package/dist/features/products/repository/products.repository.js +7 -7
- package/dist/features/promotions/repository/coupons.repository.d.ts +4 -1
- package/dist/features/promotions/repository/coupons.repository.js +4 -2
- package/dist/features/reviews/repository/reviews.repository.d.ts +3 -1
- package/dist/features/reviews/repository/reviews.repository.js +3 -3
- package/dist/features/scams/repository/scammer.repository.d.ts +2 -1
- package/dist/features/scams/repository/scammer.repository.js +2 -2
- package/dist/features/server-errors/repository/server-errors.repository.js +2 -2
- package/dist/features/shipments/repository/shipment-items.repository.d.ts +2 -1
- package/dist/features/shipments/repository/shipment-items.repository.js +2 -2
- package/dist/features/shipments/repository/shipment-lots.repository.d.ts +2 -1
- package/dist/features/shipments/repository/shipment-lots.repository.js +2 -2
- package/dist/features/shipments/repository/shipments.repository.d.ts +3 -1
- package/dist/features/shipments/repository/shipments.repository.js +3 -3
- package/dist/features/support/repository/support.repository.js +3 -3
- package/dist/features/tester/repository/tester-checklist-item.repository.js +2 -2
- package/dist/features/tester/repository/tester-checklist-response.repository.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/providers/db-firebase/base.js +17 -1
- package/dist/providers/db-firebase/index.d.ts +1 -1
- package/dist/providers/db-firebase/index.js +1 -1
- package/dist/providers/db-firebase/sieve.d.ts +19 -0
- package/dist/providers/db-firebase/sieve.js +11 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +3 -0
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
|
-
import { BaseRepository, getFirestoreCount, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
2
|
+
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
3
3
|
import { NOTIFICATIONS_COLLECTION, NOTIFICATION_FIELDS, } from "../schemas";
|
|
4
4
|
import { serverLogger } from "../../../monitoring";
|
|
5
5
|
import { serverTimestamp } from "../../../contracts/field-ops";
|
|
@@ -218,6 +218,6 @@ NotificationRepository.SIEVE_FIELDS = {
|
|
|
218
218
|
priority: { canFilter: true, canSort: true },
|
|
219
219
|
isRead: { canFilter: true, canSort: false },
|
|
220
220
|
relatedType: { canFilter: true, canSort: false },
|
|
221
|
-
createdAt: { canFilter: true, canSort: true },
|
|
221
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
222
222
|
};
|
|
223
223
|
export const notificationRepository = new NotificationRepository();
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Data access layer for bid documents in Firestore
|
|
5
5
|
*/
|
|
6
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
6
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
7
7
|
import type { DocumentReference, WriteBatch } from "firebase-admin/firestore";
|
|
8
8
|
import type { SieveModel, FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
9
9
|
import type { BidDocument, BidCreateInput, BidUpdateInput, BidAdminUpdateInput, BidStatus } from "../schemas";
|
|
@@ -138,10 +138,12 @@ export declare class BidRepository extends BaseRepository<BidDocument> {
|
|
|
138
138
|
bidDate: {
|
|
139
139
|
canFilter: boolean;
|
|
140
140
|
canSort: boolean;
|
|
141
|
+
parseValue: typeof parseSieveDateValue;
|
|
141
142
|
};
|
|
142
143
|
createdAt: {
|
|
143
144
|
canFilter: boolean;
|
|
144
145
|
canSort: boolean;
|
|
146
|
+
parseValue: typeof parseSieveDateValue;
|
|
145
147
|
};
|
|
146
148
|
};
|
|
147
149
|
/**
|
|
@@ -4,7 +4,7 @@ import { normalizeError } from "../../../errors/normalize";
|
|
|
4
4
|
*
|
|
5
5
|
* Data access layer for bid documents in Firestore
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, getFirestoreCount, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
8
8
|
import { DatabaseError } from "../../../errors";
|
|
9
9
|
import { BID_COLLECTION, createBidId } from "../schemas";
|
|
10
10
|
import { encryptPiiFields, decryptPiiFields, BID_PII_FIELDS, } from "../../../security";
|
|
@@ -375,7 +375,7 @@ BidRepository.SIEVE_FIELDS = {
|
|
|
375
375
|
bidAmount: { canFilter: true, canSort: true },
|
|
376
376
|
status: { canFilter: true, canSort: true },
|
|
377
377
|
isWinning: { canFilter: true, canSort: false },
|
|
378
|
-
bidDate: { canFilter: true, canSort: true },
|
|
379
|
-
createdAt: { canFilter: true, canSort: true },
|
|
378
|
+
bidDate: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
379
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
380
380
|
};
|
|
381
381
|
export const bidRepository = new BidRepository();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { DatabaseError } from "../../../errors";
|
|
3
3
|
import { serverLogger } from "../../../monitoring";
|
|
4
|
-
import { BaseRepository, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { generateSessionId } from "../token-helpers";
|
|
6
6
|
import { SESSION_COLLECTION, SESSION_EXPIRATION_MS, SESSION_FIELDS, } from "../schemas";
|
|
7
7
|
export class SessionRepository extends BaseRepository {
|
|
@@ -273,8 +273,8 @@ SessionRepository.SIEVE_FIELDS = {
|
|
|
273
273
|
canFilter: true,
|
|
274
274
|
canSort: false,
|
|
275
275
|
},
|
|
276
|
-
lastActivity: { canFilter: true, canSort: true },
|
|
277
|
-
expiresAt: { canFilter: true, canSort: true },
|
|
278
|
-
createdAt: { canFilter: true, canSort: true },
|
|
276
|
+
lastActivity: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
277
|
+
expiresAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
278
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
279
279
|
};
|
|
280
280
|
export const sessionRepository = new SessionRepository();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { DatabaseError } from "../../../errors";
|
|
3
|
-
import { BaseRepository, getFirestoreCount, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
3
|
+
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
4
4
|
import { USER_PII_FIELDS, decryptPayoutDetails, decryptPiiFields, decryptShippingConfig, encryptPayoutDetails, encryptPiiFields, encryptShippingConfig, piiBlindIndex, } from "../../../security";
|
|
5
5
|
import { USER_COLLECTION, USER_FIELDS, createUserId, } from "../schemas";
|
|
6
6
|
export class UserRepository extends BaseRepository {
|
|
@@ -257,7 +257,7 @@ UserRepository.SIEVE_FIELDS = {
|
|
|
257
257
|
emailVerified: { canFilter: true, canSort: false },
|
|
258
258
|
disabled: { canFilter: true, canSort: true },
|
|
259
259
|
storeStatus: { canFilter: true, canSort: false },
|
|
260
|
-
createdAt: { canFilter: true, canSort: true },
|
|
261
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
260
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
261
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
262
262
|
};
|
|
263
263
|
export const userRepository = new UserRepository();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FirebaseSieveResult, SieveModel } from "../../../providers/db-firebase";
|
|
2
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
2
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
3
3
|
import { type BlogPostCreateInput, type BlogPostDocument, type BlogPostUpdateInput } from "../schemas";
|
|
4
4
|
import type { BlogPostCategory } from "../types";
|
|
5
5
|
declare class BlogRepository extends BaseRepository<BlogPostDocument> {
|
|
@@ -61,10 +61,12 @@ declare class BlogRepository extends BaseRepository<BlogPostDocument> {
|
|
|
61
61
|
publishedAt: {
|
|
62
62
|
canFilter: boolean;
|
|
63
63
|
canSort: boolean;
|
|
64
|
+
parseValue: typeof parseSieveDateValue;
|
|
64
65
|
};
|
|
65
66
|
updatedAt: {
|
|
66
67
|
canFilter: boolean;
|
|
67
68
|
canSort: boolean;
|
|
69
|
+
parseValue: typeof parseSieveDateValue;
|
|
68
70
|
};
|
|
69
71
|
tags: {
|
|
70
72
|
canFilter: boolean;
|
|
@@ -73,6 +75,7 @@ declare class BlogRepository extends BaseRepository<BlogPostDocument> {
|
|
|
73
75
|
createdAt: {
|
|
74
76
|
canFilter: boolean;
|
|
75
77
|
canSort: boolean;
|
|
78
|
+
parseValue: typeof parseSieveDateValue;
|
|
76
79
|
};
|
|
77
80
|
};
|
|
78
81
|
listPublished(opts: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DatabaseError } from "../../../errors";
|
|
2
2
|
import { normalizeError } from "../../../errors/normalize";
|
|
3
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
3
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
4
4
|
import { BLOG_POST_FIELDS, BLOG_POSTS_COLLECTION, } from "../schemas";
|
|
5
5
|
import { createBlogPostId } from "../schemas";
|
|
6
6
|
import { increment } from "../../../contracts/field-ops";
|
|
@@ -171,10 +171,10 @@ BlogRepository.SIEVE_FIELDS = {
|
|
|
171
171
|
isFeatured: { canFilter: true, canSort: false },
|
|
172
172
|
readTimeMinutes: { canFilter: true, canSort: true },
|
|
173
173
|
views: { canFilter: true, canSort: true },
|
|
174
|
-
publishedAt: { canFilter: true, canSort: true },
|
|
175
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
174
|
+
publishedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
175
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
176
176
|
tags: { canFilter: true, canSort: false },
|
|
177
|
-
createdAt: { canFilter: true, canSort: true },
|
|
177
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
178
178
|
};
|
|
179
179
|
const blogRepository = new BlogRepository();
|
|
180
180
|
export { BlogRepository, blogRepository };
|
|
@@ -4,7 +4,7 @@ import { CART_FIELDS } from "../../../constants/field-names";
|
|
|
4
4
|
import { normalizeError } from "../../../errors/normalize";
|
|
5
5
|
const ERR_CART_ITEM_NOT_FOUND = "Cart item not found";
|
|
6
6
|
const ERR_CART_ITEM_LOCKED = "This item requires payment and cannot be removed or modified.";
|
|
7
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
8
8
|
import { decryptPii } from "../../../security";
|
|
9
9
|
import { CART_COLLECTION, } from "../schemas";
|
|
10
10
|
export class CartRepository extends BaseRepository {
|
|
@@ -291,7 +291,7 @@ export class CartRepository extends BaseRepository {
|
|
|
291
291
|
CartRepository.SIEVE_FIELDS = {
|
|
292
292
|
userId: { canFilter: true, canSort: false },
|
|
293
293
|
sessionId: { canFilter: true, canSort: false },
|
|
294
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
295
|
-
createdAt: { canFilter: true, canSort: true },
|
|
294
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
295
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
296
296
|
};
|
|
297
297
|
export const cartRepository = new CartRepository();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Personal Catalogue Repository (Feature B).
|
|
3
3
|
*/
|
|
4
|
-
import { BaseRepository, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
5
5
|
import { type CatalogueItemDocument, type CatalogueItemCreateInput, type CatalogueItemUpdateInput } from "../schemas/firestore";
|
|
6
6
|
export declare class CatalogueRepository extends BaseRepository<CatalogueItemDocument> {
|
|
7
7
|
constructor();
|
|
@@ -31,6 +31,7 @@ export declare class CatalogueRepository extends BaseRepository<CatalogueItemDoc
|
|
|
31
31
|
createdAt: {
|
|
32
32
|
canFilter: boolean;
|
|
33
33
|
canSort: boolean;
|
|
34
|
+
parseValue: typeof parseSieveDateValue;
|
|
34
35
|
};
|
|
35
36
|
};
|
|
36
37
|
/** Bounded scan for the staleness-reminder Function — images older than N days, not yet reminded for this update. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Personal Catalogue Repository (Feature B).
|
|
3
3
|
*/
|
|
4
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { CATALOGUE_COLLECTION, CATALOGUE_FIELDS, createCatalogueItemId, } from "../schemas/firestore";
|
|
6
6
|
export class CatalogueRepository extends BaseRepository {
|
|
7
7
|
constructor() {
|
|
@@ -63,6 +63,6 @@ CatalogueRepository.SIEVE_FIELDS = {
|
|
|
63
63
|
ownerId: { canFilter: true, canSort: false },
|
|
64
64
|
visibility: { canFilter: true, canSort: false },
|
|
65
65
|
listingStatus: { canFilter: true, canSort: false },
|
|
66
|
-
createdAt: { canFilter: true, canSort: true },
|
|
66
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
67
67
|
};
|
|
68
68
|
export const catalogueRepository = new CatalogueRepository();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { increment, arrayUnion, arrayRemove, } from "../../../contracts/field-ops";
|
|
3
3
|
import { DatabaseError } from "../../../errors";
|
|
4
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { PRODUCT_FIELDS } from "../../../constants/field-names";
|
|
6
6
|
import { CATEGORY_FIELDS, CATEGORIES_COLLECTION, MIN_ITEMS_FOR_FEATURED, buildCategoryTree, calculateCategoryFields, canBeFeatured, createCategoryId, isValidCategoryMove, } from "../schemas";
|
|
7
7
|
export class CategoriesRepository extends BaseRepository {
|
|
@@ -523,6 +523,6 @@ CategoriesRepository.SIEVE_FIELDS = {
|
|
|
523
523
|
},
|
|
524
524
|
id: { canFilter: true, canSort: false },
|
|
525
525
|
isLeaf: { canFilter: true, canSort: false },
|
|
526
|
-
createdAt: { canFilter: true, canSort: true },
|
|
526
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
527
527
|
};
|
|
528
528
|
export const categoriesRepository = new CategoriesRepository();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { DatabaseError } from "../../../errors";
|
|
3
3
|
import { serverLogger } from "../../../monitoring";
|
|
4
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { decryptPiiFields, encryptPiiFields, EVENT_ENTRY_PII_FIELDS, } from "../../../security";
|
|
6
6
|
import { EVENT_ENTRIES_COLLECTION, EVENT_ENTRY_FIELDS, } from "../schemas";
|
|
7
7
|
/** Extracted from getExportReport's poll branch to stay under the max nesting depth. */
|
|
@@ -304,7 +304,7 @@ EventEntryRepository.SIEVE_FIELDS = {
|
|
|
304
304
|
userDisplayName: { canFilter: false, canSort: false },
|
|
305
305
|
reviewStatus: { canFilter: true, canSort: false },
|
|
306
306
|
status: { canFilter: true, canSort: false },
|
|
307
|
-
submittedAt: { canFilter: true, canSort: true },
|
|
307
|
+
submittedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
308
308
|
points: { canFilter: true, canSort: true },
|
|
309
309
|
};
|
|
310
310
|
const eventEntryRepository = new EventEntryRepository();
|
|
@@ -2,7 +2,7 @@ import { DatabaseError } from "../../../errors";
|
|
|
2
2
|
import { serverLogger } from "../../../monitoring";
|
|
3
3
|
import { slugify } from "../../../utils";
|
|
4
4
|
import { normalizeError } from "../../../errors/normalize";
|
|
5
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
5
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
6
6
|
import { EVENT_FIELDS, EVENTS_COLLECTION, } from "../schemas";
|
|
7
7
|
import { increment } from "../../../contracts/field-ops";
|
|
8
8
|
class EventRepository extends BaseRepository {
|
|
@@ -143,8 +143,8 @@ EventRepository.SIEVE_FIELDS = {
|
|
|
143
143
|
status: { canFilter: true, canSort: true },
|
|
144
144
|
title: { canFilter: true, canSort: true },
|
|
145
145
|
createdBy: { canFilter: true, canSort: false },
|
|
146
|
-
startsAt: { canFilter: true, canSort: true },
|
|
147
|
-
endsAt: { canFilter: true, canSort: true },
|
|
146
|
+
startsAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
147
|
+
endsAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
148
148
|
"stats.totalEntries": {
|
|
149
149
|
path: "stats.totalEntries",
|
|
150
150
|
canFilter: true,
|
|
@@ -161,7 +161,7 @@ EventRepository.SIEVE_FIELDS = {
|
|
|
161
161
|
canSort: true,
|
|
162
162
|
},
|
|
163
163
|
id: { canFilter: true, canSort: false },
|
|
164
|
-
createdAt: { canFilter: true, canSort: true },
|
|
164
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
165
165
|
};
|
|
166
166
|
const eventRepository = new EventRepository();
|
|
167
167
|
export { EventRepository, eventRepository };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
1
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
2
2
|
import { DatabaseError } from "../../../errors";
|
|
3
3
|
import { increment } from "../../../contracts/field-ops";
|
|
4
4
|
import { FAQ_FIELDS } from "../../../constants/field-names";
|
|
@@ -295,6 +295,6 @@ FirebaseFAQsRepository.SIEVE_FIELDS = {
|
|
|
295
295
|
tags: { canFilter: true, canSort: false },
|
|
296
296
|
searchTokens: { canFilter: true, canSort: false },
|
|
297
297
|
"stats.helpful": { canFilter: false, canSort: true },
|
|
298
|
-
createdAt: { canFilter: true, canSort: true },
|
|
298
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
299
299
|
};
|
|
300
300
|
export const faqsRepository = new FirebaseFAQsRepository();
|
|
@@ -4,7 +4,7 @@ import { normalizeError } from "../../../errors/normalize";
|
|
|
4
4
|
*
|
|
5
5
|
* Manages homepage carousel slides with grid card system
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, getFirestoreCount, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, getFirestoreCount, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
8
8
|
import { increment } from "../../../contracts/field-ops";
|
|
9
9
|
import { CAROUSEL_SLIDES_COLLECTION, MAX_ACTIVE_SLIDES, DEFAULT_CAROUSEL_SLIDE_DATA, canActivateSlide, createCarouselId, } from "../schemas";
|
|
10
10
|
import { DatabaseError } from "../../../errors";
|
|
@@ -250,8 +250,8 @@ CarouselRepository.SIEVE_FIELDS = {
|
|
|
250
250
|
active: { canFilter: true, canSort: false },
|
|
251
251
|
order: { canFilter: true, canSort: true },
|
|
252
252
|
createdBy: { canFilter: true, canSort: false },
|
|
253
|
-
createdAt: { canFilter: true, canSort: true },
|
|
254
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
253
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
254
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
255
255
|
};
|
|
256
256
|
// Export singleton instance
|
|
257
257
|
export const carouselRepository = new CarouselRepository();
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { DatabaseError } from "../../../errors";
|
|
7
7
|
import { HOMEPAGE_SECTION_FIELDS } from "../../../constants/field-names";
|
|
8
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
8
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
9
9
|
import { normalizeError } from "../../../errors/normalize";
|
|
10
10
|
import { HOMEPAGE_SECTIONS_COLLECTION, createHomepageSectionId, } from "../schemas";
|
|
11
11
|
export class HomepageSectionsRepository extends BaseRepository {
|
|
@@ -180,7 +180,7 @@ HomepageSectionsRepository.SIEVE_FIELDS = {
|
|
|
180
180
|
type: { canFilter: true, canSort: false },
|
|
181
181
|
enabled: { canFilter: true, canSort: false },
|
|
182
182
|
order: { canFilter: true, canSort: true },
|
|
183
|
-
createdAt: { canFilter: true, canSort: true },
|
|
184
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
183
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
184
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
185
185
|
};
|
|
186
186
|
export const homepageSectionsRepository = new HomepageSectionsRepository();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { DatabaseError } from "../../../errors";
|
|
3
3
|
import { serverLogger } from "../../../monitoring";
|
|
4
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { decryptPiiFields, encryptPiiFields, LOTTERY_ENTRY_PII_FIELDS, } from "../../../security";
|
|
6
6
|
import { LOTTERY_ENTRIES_COLLECTION, LOTTERY_ENTRY_FIELDS, } from "../schemas/firestore";
|
|
7
7
|
class LotteryEntryRepository extends BaseRepository {
|
|
@@ -123,7 +123,7 @@ LotteryEntryRepository.SIEVE_FIELDS = {
|
|
|
123
123
|
productId: { canFilter: true, canSort: false },
|
|
124
124
|
userId: { canFilter: true, canSort: false },
|
|
125
125
|
status: { canFilter: true, canSort: false },
|
|
126
|
-
submittedAt: { canFilter: true, canSort: true },
|
|
126
|
+
submittedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
127
127
|
userLotteryNumber: { canFilter: false, canSort: true },
|
|
128
128
|
};
|
|
129
129
|
export { LotteryEntryRepository };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DocumentReference, WriteBatch } from "firebase-admin/firestore";
|
|
2
2
|
import type { FirebaseSieveResult, SieveModel } from "../../../providers/db-firebase";
|
|
3
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
3
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
4
4
|
import { type OrderCreateInput, type OrderDocument, type OrderRefundEvent } from "../schemas";
|
|
5
5
|
import type { OrderStatus, PaymentStatus } from "../types";
|
|
6
6
|
declare class OrderRepository extends BaseRepository<OrderDocument> {
|
|
@@ -89,10 +89,12 @@ declare class OrderRepository extends BaseRepository<OrderDocument> {
|
|
|
89
89
|
orderDate: {
|
|
90
90
|
canFilter: boolean;
|
|
91
91
|
canSort: boolean;
|
|
92
|
+
parseValue: typeof parseSieveDateValue;
|
|
92
93
|
};
|
|
93
94
|
createdAt: {
|
|
94
95
|
canFilter: boolean;
|
|
95
96
|
canSort: boolean;
|
|
97
|
+
parseValue: typeof parseSieveDateValue;
|
|
96
98
|
};
|
|
97
99
|
contestable: {
|
|
98
100
|
canFilter: boolean;
|
|
@@ -157,10 +159,12 @@ declare class OrderRepository extends BaseRepository<OrderDocument> {
|
|
|
157
159
|
orderDate: {
|
|
158
160
|
canFilter: boolean;
|
|
159
161
|
canSort: boolean;
|
|
162
|
+
parseValue: typeof parseSieveDateValue;
|
|
160
163
|
};
|
|
161
164
|
createdAt: {
|
|
162
165
|
canFilter: boolean;
|
|
163
166
|
canSort: boolean;
|
|
167
|
+
parseValue: typeof parseSieveDateValue;
|
|
164
168
|
};
|
|
165
169
|
paymentBatchId: {
|
|
166
170
|
canFilter: boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { DatabaseError, NotFoundError } from "../../../errors";
|
|
3
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
3
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
4
4
|
import { decryptPiiFields, encryptPiiFields, ORDER_PII_FIELDS, } from "../../../security";
|
|
5
5
|
import { serverTimestamp } from "../../../contracts/field-ops";
|
|
6
6
|
import { createOrderId, ORDER_COLLECTION, OrderStatusValues, } from "../schemas";
|
|
@@ -464,8 +464,8 @@ OrderRepository.SELLER_SIEVE_FIELDS = {
|
|
|
464
464
|
paymentStatus: { canFilter: true, canSort: true },
|
|
465
465
|
paymentMethod: { canFilter: true, canSort: true },
|
|
466
466
|
totalPrice: { canFilter: true, canSort: true },
|
|
467
|
-
orderDate: { canFilter: true, canSort: true },
|
|
468
|
-
createdAt: { canFilter: true, canSort: true },
|
|
467
|
+
orderDate: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
468
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
469
469
|
contestable: { canFilter: true, canSort: false },
|
|
470
470
|
};
|
|
471
471
|
OrderRepository.ADMIN_SIEVE_FIELDS = {
|
|
@@ -482,8 +482,8 @@ OrderRepository.ADMIN_SIEVE_FIELDS = {
|
|
|
482
482
|
shippingMethod: { canFilter: true, canSort: true },
|
|
483
483
|
payoutStatus: { canFilter: true, canSort: false },
|
|
484
484
|
totalPrice: { canFilter: true, canSort: true },
|
|
485
|
-
orderDate: { canFilter: true, canSort: true },
|
|
486
|
-
createdAt: { canFilter: true, canSort: true },
|
|
485
|
+
orderDate: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
486
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
487
487
|
// S-SBUNI-RULES 2026-05-13 — refund + batch fields
|
|
488
488
|
paymentBatchId: { canFilter: true, canSort: false },
|
|
489
489
|
contestable: { canFilter: true, canSort: false },
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Data access layer for payout documents in Firestore.
|
|
5
5
|
* Handles seller payout requests and admin payout processing.
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
8
8
|
import type { DocumentReference, WriteResult } from "firebase-admin/firestore";
|
|
9
9
|
import type { PayoutDocument, PayoutCreateInput, PayoutRefundDeduction, PayoutStatus, PayoutUpdateInput } from "../schemas";
|
|
10
10
|
export declare class PayoutRepository extends BaseRepository<PayoutDocument> {
|
|
@@ -109,14 +109,17 @@ export declare class PayoutRepository extends BaseRepository<PayoutDocument> {
|
|
|
109
109
|
requestedAt: {
|
|
110
110
|
canFilter: boolean;
|
|
111
111
|
canSort: boolean;
|
|
112
|
+
parseValue: typeof parseSieveDateValue;
|
|
112
113
|
};
|
|
113
114
|
createdAt: {
|
|
114
115
|
canFilter: boolean;
|
|
115
116
|
canSort: boolean;
|
|
117
|
+
parseValue: typeof parseSieveDateValue;
|
|
116
118
|
};
|
|
117
119
|
processedAt: {
|
|
118
120
|
canFilter: boolean;
|
|
119
121
|
canSort: boolean;
|
|
122
|
+
parseValue: typeof parseSieveDateValue;
|
|
120
123
|
};
|
|
121
124
|
};
|
|
122
125
|
/**
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Data access layer for payout documents in Firestore.
|
|
5
5
|
* Handles seller payout requests and admin payout processing.
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
8
8
|
import { PAYOUT_COLLECTION, PAYOUT_FIELDS, createPayoutId } from "../schemas";
|
|
9
9
|
import { encryptPiiFields, decryptPiiFields, addPiiIndices, PAYOUT_PII_FIELDS, PAYOUT_PII_INDEX_MAP, encryptPayoutBankAccount, decryptPayoutBankAccount, } from "../../../security";
|
|
10
10
|
export class PayoutRepository extends BaseRepository {
|
|
@@ -241,9 +241,9 @@ PayoutRepository.SIEVE_FIELDS = {
|
|
|
241
241
|
paymentMethod: { canFilter: true, canSort: false },
|
|
242
242
|
amount: { canFilter: true, canSort: true },
|
|
243
243
|
netAmount: { canFilter: true, canSort: true },
|
|
244
|
-
requestedAt: { canFilter: true, canSort: true },
|
|
245
|
-
createdAt: { canFilter: true, canSort: true },
|
|
246
|
-
processedAt: { canFilter: true, canSort: true },
|
|
244
|
+
requestedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
245
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
246
|
+
processedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
247
247
|
};
|
|
248
248
|
// Export singleton instance
|
|
249
249
|
export const payoutRepository = new PayoutRepository();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { DocumentReference, WriteBatch } from "firebase-admin/firestore";
|
|
2
2
|
import type { DocumentSnapshot } from "../../../providers/db-firebase";
|
|
3
|
-
import { BaseRepository, type FirebaseSieveResult, type SieveFilterAliases, type SieveModel } from "../../../providers/db-firebase";
|
|
3
|
+
import { BaseRepository, parseSieveDateValue, type FirebaseSieveResult, type SieveFilterAliases, type SieveModel } from "../../../providers/db-firebase";
|
|
4
4
|
import { type ProductCreateInput, type ProductDocument, type ProductUpdateInput } from "../schemas";
|
|
5
5
|
import type { ProductStatus } from "../types";
|
|
6
6
|
export declare class ProductRepository extends BaseRepository<ProductDocument> {
|
|
@@ -140,22 +140,27 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
|
|
|
140
140
|
createdAt: {
|
|
141
141
|
canFilter: boolean;
|
|
142
142
|
canSort: boolean;
|
|
143
|
+
parseValue: typeof parseSieveDateValue;
|
|
143
144
|
};
|
|
144
145
|
updatedAt: {
|
|
145
146
|
canFilter: boolean;
|
|
146
147
|
canSort: boolean;
|
|
148
|
+
parseValue: typeof parseSieveDateValue;
|
|
147
149
|
};
|
|
148
150
|
auctionEndDate: {
|
|
149
151
|
canFilter: boolean;
|
|
150
152
|
canSort: boolean;
|
|
153
|
+
parseValue: typeof parseSieveDateValue;
|
|
151
154
|
};
|
|
152
155
|
prizeRevealWindowStart: {
|
|
153
156
|
canFilter: boolean;
|
|
154
157
|
canSort: boolean;
|
|
158
|
+
parseValue: typeof parseSieveDateValue;
|
|
155
159
|
};
|
|
156
160
|
prizeRevealWindowEnd: {
|
|
157
161
|
canFilter: boolean;
|
|
158
162
|
canSort: boolean;
|
|
163
|
+
parseValue: typeof parseSieveDateValue;
|
|
159
164
|
};
|
|
160
165
|
prizeRevealStatus: {
|
|
161
166
|
canFilter: boolean;
|
|
@@ -184,6 +189,7 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
|
|
|
184
189
|
preOrderDeliveryDate: {
|
|
185
190
|
canFilter: boolean;
|
|
186
191
|
canSort: boolean;
|
|
192
|
+
parseValue: typeof parseSieveDateValue;
|
|
187
193
|
};
|
|
188
194
|
preOrderDepositPercent: {
|
|
189
195
|
canFilter: boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { normalizeError } from "../../../errors/normalize";
|
|
2
2
|
import { increment, serverTimestamp } from "../../../contracts/field-ops";
|
|
3
3
|
import { DatabaseError } from "../../../errors";
|
|
4
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { cacheManager } from "../../../core";
|
|
6
6
|
import { generateUniqueId, slugify, buildSearchTokens, tokenizeQuery, generateBarcodeId } from "../../../utils";
|
|
7
7
|
import { PRODUCT_COLLECTION, ProductStatusValues } from "../schemas";
|
|
@@ -500,18 +500,18 @@ ProductRepository.SIEVE_FIELDS = {
|
|
|
500
500
|
bidCount: { canFilter: true, canSort: true },
|
|
501
501
|
isSold: { canFilter: true, canSort: true },
|
|
502
502
|
isPartOfBundle: { canFilter: true, canSort: false },
|
|
503
|
-
createdAt: { canFilter: true, canSort: true },
|
|
504
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
505
|
-
auctionEndDate: { canFilter: true, canSort: true },
|
|
506
|
-
prizeRevealWindowStart: { canFilter: true, canSort: true },
|
|
507
|
-
prizeRevealWindowEnd: { canFilter: true, canSort: true },
|
|
503
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
504
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
505
|
+
auctionEndDate: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
506
|
+
prizeRevealWindowStart: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
507
|
+
prizeRevealWindowEnd: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
508
508
|
prizeRevealStatus: { canFilter: true, canSort: false },
|
|
509
509
|
startingBid: { canFilter: true, canSort: true },
|
|
510
510
|
buyNowPrice: { canFilter: true, canSort: true },
|
|
511
511
|
minBidIncrement: { canFilter: true, canSort: false },
|
|
512
512
|
autoExtendable: { canFilter: true, canSort: false },
|
|
513
513
|
reservePrice: { canFilter: true, canSort: true },
|
|
514
|
-
preOrderDeliveryDate: { canFilter: true, canSort: true },
|
|
514
|
+
preOrderDeliveryDate: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
515
515
|
preOrderDepositPercent: { canFilter: true, canSort: false },
|
|
516
516
|
preOrderDepositAmount: { canFilter: true, canSort: true },
|
|
517
517
|
preOrderMaxQuantity: { canFilter: true, canSort: true },
|
|
@@ -4,7 +4,7 @@ import type { ListingType } from "../../products/types";
|
|
|
4
4
|
*
|
|
5
5
|
* Manages coupon creation, validation, and usage tracking
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
8
8
|
import type { SieveModel, FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
9
9
|
import { CouponDocument, CouponUsageDocument, CouponCreateInput } from "../schemas";
|
|
10
10
|
import type { CouponType } from "../types";
|
|
@@ -179,11 +179,13 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
179
179
|
path: string;
|
|
180
180
|
canFilter: boolean;
|
|
181
181
|
canSort: boolean;
|
|
182
|
+
parseValue: typeof parseSieveDateValue;
|
|
182
183
|
};
|
|
183
184
|
"validity.startDate": {
|
|
184
185
|
path: string;
|
|
185
186
|
canFilter: boolean;
|
|
186
187
|
canSort: boolean;
|
|
188
|
+
parseValue: typeof parseSieveDateValue;
|
|
187
189
|
};
|
|
188
190
|
"discount.value": {
|
|
189
191
|
path: string;
|
|
@@ -203,6 +205,7 @@ export declare class CouponsRepository extends BaseRepository<CouponDocument> {
|
|
|
203
205
|
createdAt: {
|
|
204
206
|
canFilter: boolean;
|
|
205
207
|
canSort: boolean;
|
|
208
|
+
parseValue: typeof parseSieveDateValue;
|
|
206
209
|
};
|
|
207
210
|
storeId: {
|
|
208
211
|
canFilter: boolean;
|
|
@@ -5,7 +5,7 @@ import { serverLogger } from "../../../monitoring/server-logger";
|
|
|
5
5
|
*
|
|
6
6
|
* Manages coupon creation, validation, and usage tracking
|
|
7
7
|
*/
|
|
8
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
8
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
9
9
|
import { COUPONS_COLLECTION, COUPON_FIELDS, isValidCouponCode, isCouponValid, canUserUseCoupon, calculateDiscount, createCouponId, } from "../schemas";
|
|
10
10
|
import { USER_COLLECTION } from "../../auth/schemas";
|
|
11
11
|
import { DatabaseError } from "../../../errors";
|
|
@@ -500,11 +500,13 @@ CouponsRepository.SIEVE_FIELDS = {
|
|
|
500
500
|
path: "validity.endDate",
|
|
501
501
|
canFilter: true,
|
|
502
502
|
canSort: true,
|
|
503
|
+
parseValue: parseSieveDateValue,
|
|
503
504
|
},
|
|
504
505
|
"validity.startDate": {
|
|
505
506
|
path: "validity.startDate",
|
|
506
507
|
canFilter: true,
|
|
507
508
|
canSort: true,
|
|
509
|
+
parseValue: parseSieveDateValue,
|
|
508
510
|
},
|
|
509
511
|
"discount.value": {
|
|
510
512
|
path: "discount.value",
|
|
@@ -521,7 +523,7 @@ CouponsRepository.SIEVE_FIELDS = {
|
|
|
521
523
|
canFilter: true,
|
|
522
524
|
canSort: true,
|
|
523
525
|
},
|
|
524
|
-
createdAt: { canFilter: true, canSort: true },
|
|
526
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
525
527
|
storeId: { canFilter: true, canSort: false },
|
|
526
528
|
scope: { canFilter: true, canSort: false },
|
|
527
529
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FirebaseSieveResult, SieveModel } from "../../../providers/db-firebase";
|
|
2
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
2
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
3
3
|
import { type ReviewCreateInput, type ReviewDocument } from "../schemas";
|
|
4
4
|
import type { ReviewStatus } from "../types";
|
|
5
5
|
export interface ReviewRatingAggregate {
|
|
@@ -107,10 +107,12 @@ declare class ReviewRepository extends BaseRepository<ReviewDocument> {
|
|
|
107
107
|
updatedAt: {
|
|
108
108
|
canFilter: boolean;
|
|
109
109
|
canSort: boolean;
|
|
110
|
+
parseValue: typeof parseSieveDateValue;
|
|
110
111
|
};
|
|
111
112
|
createdAt: {
|
|
112
113
|
canFilter: boolean;
|
|
113
114
|
canSort: boolean;
|
|
115
|
+
parseValue: typeof parseSieveDateValue;
|
|
114
116
|
};
|
|
115
117
|
};
|
|
116
118
|
listForProduct(productId: string, model: SieveModel): Promise<FirebaseSieveResult<ReviewDocument>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
1
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
2
2
|
import { addPiiIndices, decryptPiiFields, encryptPiiFields, REVIEW_PII_FIELDS, REVIEW_PII_INDEX_MAP, } from "../../../security";
|
|
3
3
|
import { createReviewId, REVIEW_COLLECTION, } from "../schemas";
|
|
4
4
|
const REVIEW_FIELDS = {
|
|
@@ -262,8 +262,8 @@ ReviewRepository.SIEVE_FIELDS = {
|
|
|
262
262
|
helpfulCount: { canFilter: true, canSort: true },
|
|
263
263
|
featured: { canFilter: true, canSort: false },
|
|
264
264
|
reportCount: { canFilter: true, canSort: true },
|
|
265
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
266
|
-
createdAt: { canFilter: true, canSort: true },
|
|
265
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
266
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
267
267
|
};
|
|
268
268
|
const reviewRepository = new ReviewRepository();
|
|
269
269
|
export { ReviewRepository, reviewRepository };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseRepository, type FirebaseSieveResult, type SieveModel } from "../../../providers/db-firebase";
|
|
1
|
+
import { BaseRepository, parseSieveDateValue, type FirebaseSieveResult, type SieveModel } from "../../../providers/db-firebase";
|
|
2
2
|
import { type ScammerDocument, type ScammerIncidentDocument, type ScammerCommentDocument, type ScammerCreateInput, type ScammerAdminUpdateInput } from "../schemas/firestore";
|
|
3
3
|
declare class ScammerRepository extends BaseRepository<ScammerDocument> {
|
|
4
4
|
constructor();
|
|
@@ -42,6 +42,7 @@ declare class ScammerRepository extends BaseRepository<ScammerDocument> {
|
|
|
42
42
|
createdAt: {
|
|
43
43
|
canFilter: boolean;
|
|
44
44
|
canSort: boolean;
|
|
45
|
+
parseValue: typeof parseSieveDateValue;
|
|
45
46
|
};
|
|
46
47
|
updatedAt: {
|
|
47
48
|
canFilter: boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DatabaseError } from "../../../errors";
|
|
2
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
2
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
3
3
|
import { normalizeError } from "../../../errors/normalize";
|
|
4
4
|
import { serverLogger } from "../../../monitoring/server-logger";
|
|
5
5
|
import { increment } from "../../../contracts/field-ops";
|
|
@@ -190,7 +190,7 @@ ScammerRepository.SIEVE_FIELDS = {
|
|
|
190
190
|
isContested: { canFilter: true, canSort: false },
|
|
191
191
|
views: { canFilter: false, canSort: true },
|
|
192
192
|
incidentCount: { canFilter: false, canSort: true },
|
|
193
|
-
createdAt: { canFilter: true, canSort: true },
|
|
193
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
194
194
|
updatedAt: { canFilter: false, canSort: true },
|
|
195
195
|
};
|
|
196
196
|
const scammerRepository = new ScammerRepository();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseRepository } from "../../../providers/db-firebase";
|
|
2
|
-
import { applySieveToFirestore } from "../../../providers/db-firebase";
|
|
2
|
+
import { applySieveToFirestore, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
3
3
|
import { SERVER_ERRORS_COLLECTION, SERVER_ERROR_STACK_MAX_BYTES, } from "../schemas/firestore";
|
|
4
4
|
import { normalizeError } from "../../../errors/normalize";
|
|
5
5
|
/** Truncate a stack to the documented byte budget — never persist > 4 KB. */
|
|
@@ -63,7 +63,7 @@ export class ServerErrorsRepository extends BaseRepository {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
ServerErrorsRepository.SIEVE_FIELDS = {
|
|
66
|
-
occurredAt: { canFilter: true, canSort: true },
|
|
66
|
+
occurredAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
67
67
|
source: { canFilter: true, canSort: false },
|
|
68
68
|
route: { canFilter: true, canSort: false },
|
|
69
69
|
method: { canFilter: true, canSort: false },
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* exactly Firestore's native batched-write limit, so bulkCreate() writes an
|
|
5
5
|
* entire import in a single WriteBatch with no chunking logic.
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
8
8
|
import { type ShipmentItem, type ShipmentItemCreateInput, type ShipmentItemUpdateInput } from "../schemas/firestore";
|
|
9
9
|
export declare class ShipmentItemsRepository extends BaseRepository<ShipmentItem> {
|
|
10
10
|
constructor();
|
|
@@ -50,6 +50,7 @@ export declare class ShipmentItemsRepository extends BaseRepository<ShipmentItem
|
|
|
50
50
|
createdAt: {
|
|
51
51
|
canFilter: boolean;
|
|
52
52
|
canSort: boolean;
|
|
53
|
+
parseValue: typeof parseSieveDateValue;
|
|
53
54
|
};
|
|
54
55
|
};
|
|
55
56
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* exactly Firestore's native batched-write limit, so bulkCreate() writes an
|
|
5
5
|
* entire import in a single WriteBatch with no chunking logic.
|
|
6
6
|
*/
|
|
7
|
-
import { BaseRepository, } from "../../../providers/db-firebase";
|
|
7
|
+
import { BaseRepository, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
8
8
|
import { SHIPMENT_ITEM_COLLECTION, SHIPMENT_ITEM_FIELDS, MAX_ITEMS_PER_LOT, } from "../schemas/firestore";
|
|
9
9
|
import { ValidationError } from "../../../errors";
|
|
10
10
|
import { sieveAnd, sieveFilter, SIEVE_OP } from "../../../utils/sieve-builder";
|
|
@@ -73,6 +73,6 @@ ShipmentItemsRepository.SIEVE_FIELDS = {
|
|
|
73
73
|
title: { canFilter: true, canSort: true },
|
|
74
74
|
price: { canFilter: true, canSort: true },
|
|
75
75
|
linkedProductId: { canFilter: true, canSort: false },
|
|
76
|
-
createdAt: { canFilter: true, canSort: true },
|
|
76
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
77
77
|
};
|
|
78
78
|
export const shipmentItemsRepository = new ShipmentItemsRepository();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shipment Lots Repository — one doc per lot, FK'd to a shipment.
|
|
3
3
|
*/
|
|
4
|
-
import { BaseRepository, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
5
5
|
import { type ShipmentLot, type ShipmentLotCreateInput, type ShipmentLotUpdateInput } from "../schemas/firestore";
|
|
6
6
|
export declare class ShipmentLotsRepository extends BaseRepository<ShipmentLot> {
|
|
7
7
|
constructor();
|
|
@@ -42,6 +42,7 @@ export declare class ShipmentLotsRepository extends BaseRepository<ShipmentLot>
|
|
|
42
42
|
createdAt: {
|
|
43
43
|
canFilter: boolean;
|
|
44
44
|
canSort: boolean;
|
|
45
|
+
parseValue: typeof parseSieveDateValue;
|
|
45
46
|
};
|
|
46
47
|
};
|
|
47
48
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shipment Lots Repository — one doc per lot, FK'd to a shipment.
|
|
3
3
|
*/
|
|
4
|
-
import { BaseRepository, } from "../../../providers/db-firebase";
|
|
4
|
+
import { BaseRepository, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
5
5
|
import { SHIPMENT_LOT_COLLECTION, SHIPMENT_LOT_FIELDS, } from "../schemas/firestore";
|
|
6
6
|
export class ShipmentLotsRepository extends BaseRepository {
|
|
7
7
|
constructor() {
|
|
@@ -50,6 +50,6 @@ ShipmentLotsRepository.SIEVE_FIELDS = {
|
|
|
50
50
|
lotName: { canFilter: true, canSort: true },
|
|
51
51
|
projectedProfit: { canFilter: true, canSort: true },
|
|
52
52
|
projectedRevenue: { canFilter: true, canSort: true },
|
|
53
|
-
createdAt: { canFilter: true, canSort: true },
|
|
53
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
54
54
|
};
|
|
55
55
|
export const shipmentLotsRepository = new ShipmentLotsRepository();
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Procurement Shipments Repository — header document only.
|
|
3
3
|
* Lots/items live in ShipmentLotsRepository / ShipmentItemsRepository.
|
|
4
4
|
*/
|
|
5
|
-
import { BaseRepository, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
5
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
6
6
|
import { type ShipmentDocument, type ShipmentCreateInput, type ShipmentUpdateInput } from "../schemas/firestore";
|
|
7
7
|
export declare class ShipmentsRepository extends BaseRepository<ShipmentDocument> {
|
|
8
8
|
constructor();
|
|
@@ -39,10 +39,12 @@ export declare class ShipmentsRepository extends BaseRepository<ShipmentDocument
|
|
|
39
39
|
etaDate: {
|
|
40
40
|
canFilter: boolean;
|
|
41
41
|
canSort: boolean;
|
|
42
|
+
parseValue: typeof parseSieveDateValue;
|
|
42
43
|
};
|
|
43
44
|
createdAt: {
|
|
44
45
|
canFilter: boolean;
|
|
45
46
|
canSort: boolean;
|
|
47
|
+
parseValue: typeof parseSieveDateValue;
|
|
46
48
|
};
|
|
47
49
|
};
|
|
48
50
|
list(model: SieveModel): Promise<FirebaseSieveResult<ShipmentDocument>>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Procurement Shipments Repository — header document only.
|
|
3
3
|
* Lots/items live in ShipmentLotsRepository / ShipmentItemsRepository.
|
|
4
4
|
*/
|
|
5
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
5
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
6
6
|
import { ConflictError } from "../../../errors";
|
|
7
7
|
import { SHIPMENT_COLLECTION, SHIPMENT_FIELDS, SHIPMENT_ITEM_COLLECTION, DEFAULT_SHIPMENT_TOTALS, createShipmentId, } from "../schemas/firestore";
|
|
8
8
|
export class ShipmentsRepository extends BaseRepository {
|
|
@@ -71,7 +71,7 @@ ShipmentsRepository.SIEVE_FIELDS = {
|
|
|
71
71
|
shipmentNumber: { canFilter: true, canSort: true },
|
|
72
72
|
supplierName: { canFilter: true, canSort: true },
|
|
73
73
|
status: { canFilter: true, canSort: true },
|
|
74
|
-
etaDate: { canFilter: true, canSort: true },
|
|
75
|
-
createdAt: { canFilter: true, canSort: true },
|
|
74
|
+
etaDate: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
75
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
76
76
|
};
|
|
77
77
|
export const shipmentsRepository = new ShipmentsRepository();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { firebaseFieldOps } from "../../../providers/db-firebase";
|
|
2
|
-
import { BaseRepository, prepareForFirestore, } from "../../../providers/db-firebase";
|
|
2
|
+
import { BaseRepository, prepareForFirestore, parseSieveDateValue, } from "../../../providers/db-firebase";
|
|
3
3
|
import { normalizeError } from "../../../errors/normalize";
|
|
4
4
|
import { DatabaseError } from "../../../errors";
|
|
5
5
|
import { SUPPORT_TICKET_FIELDS } from "../../../constants/field-names";
|
|
@@ -115,7 +115,7 @@ SupportRepository.SIEVE_FIELDS = {
|
|
|
115
115
|
priority: { canFilter: true, canSort: false },
|
|
116
116
|
assignedTo: { canFilter: true, canSort: false },
|
|
117
117
|
orderId: { canFilter: true, canSort: false },
|
|
118
|
-
createdAt: { canFilter: true, canSort: true },
|
|
119
|
-
updatedAt: { canFilter: true, canSort: true },
|
|
118
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
119
|
+
updatedAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
120
120
|
};
|
|
121
121
|
export const supportRepository = new SupportRepository();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
1
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
2
2
|
import { DatabaseError } from "../../../errors";
|
|
3
3
|
import { TESTER_CHECKLIST_ITEM_COLLECTION, TESTER_CHECKLIST_ITEM_FIELDS, createChecklistItemId, } from "../schemas/firestore";
|
|
4
4
|
export class TesterChecklistItemRepository extends BaseRepository {
|
|
@@ -130,7 +130,7 @@ TesterChecklistItemRepository.SIEVE_FIELDS = {
|
|
|
130
130
|
phase: { canFilter: true, canSort: true },
|
|
131
131
|
isActive: { canFilter: true, canSort: false },
|
|
132
132
|
searchTokens: { canFilter: true, canSort: false },
|
|
133
|
-
createdAt: { canFilter: true, canSort: true },
|
|
133
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
134
134
|
bugConfirmed: { canFilter: true, canSort: false },
|
|
135
135
|
};
|
|
136
136
|
export const testerChecklistItemRepository = new TesterChecklistItemRepository();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseRepository } from "../../../providers/db-firebase";
|
|
1
|
+
import { BaseRepository, parseSieveDateValue } from "../../../providers/db-firebase";
|
|
2
2
|
import { TESTER_CHECKLIST_RESPONSE_COLLECTION, TESTER_CHECKLIST_RESPONSE_FIELDS, createChecklistResponseId, } from "../schemas/firestore";
|
|
3
3
|
import { testerChecklistItemRepository } from "./tester-checklist-item.repository";
|
|
4
4
|
function escapeMd(text) {
|
|
@@ -230,6 +230,6 @@ TesterChecklistResponseRepository.SIEVE_FIELDS = {
|
|
|
230
230
|
phase: { canFilter: true, canSort: true },
|
|
231
231
|
answer: { canFilter: true, canSort: false },
|
|
232
232
|
status: { canFilter: true, canSort: false },
|
|
233
|
-
createdAt: { canFilter: true, canSort: true },
|
|
233
|
+
createdAt: { canFilter: true, canSort: true, parseValue: parseSieveDateValue },
|
|
234
234
|
};
|
|
235
235
|
export const testerChecklistResponseRepository = new TesterChecklistResponseRepository();
|
package/dist/index.d.ts
CHANGED
|
@@ -1838,6 +1838,7 @@ export type { FeedbackConfig } from "./features/events/index";
|
|
|
1838
1838
|
export type { FormFieldType } from "./features/events/index";
|
|
1839
1839
|
export type { LeaderboardEntry } from "./features/events/index";
|
|
1840
1840
|
export type { PollResultEntry } from "./features/events/index";
|
|
1841
|
+
export type { SpinResultEntry } from "./features/events/index";
|
|
1841
1842
|
export type { OfferConfig } from "./features/events/index";
|
|
1842
1843
|
export type { PollConfig } from "./features/events/index";
|
|
1843
1844
|
export type { PollResultsVisibility } from "./features/events/index";
|
|
@@ -191,7 +191,18 @@ const TOKEN_TO_OP = {
|
|
|
191
191
|
">=": ">=",
|
|
192
192
|
"@=": "array-contains",
|
|
193
193
|
};
|
|
194
|
-
/**
|
|
194
|
+
/** Matches a bare `YYYY-MM-DD` date or a full ISO-8601 timestamp. */
|
|
195
|
+
const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:?\d{2})?)?$/;
|
|
196
|
+
/**
|
|
197
|
+
* Best-effort scalar coercion for sieve filter values, used by the legacy
|
|
198
|
+
* `findAll()` query path (no `SieveFieldConfig`/`parseValue` mechanism
|
|
199
|
+
* exists here — see `./sieve.ts`'s `sieveQuery`/`applySieveToFirestore` for
|
|
200
|
+
* that). An ISO-date-shaped string is converted to a real `Date` so a range
|
|
201
|
+
* filter (`>`/`<`/`>=`/`<=`) on a Firestore Timestamp field compares
|
|
202
|
+
* correctly — without this, the string reaches `.where(field, op, value)`
|
|
203
|
+
* unchanged and Firestore's type-ordering silently matches ZERO documents
|
|
204
|
+
* (CLAUDE.md Recurrent Root Cause Pattern #47).
|
|
205
|
+
*/
|
|
195
206
|
function coerceValue(raw) {
|
|
196
207
|
if (raw === "true")
|
|
197
208
|
return true;
|
|
@@ -199,6 +210,11 @@ function coerceValue(raw) {
|
|
|
199
210
|
return false;
|
|
200
211
|
if (raw === "null")
|
|
201
212
|
return null;
|
|
213
|
+
if (ISO_DATE_RE.test(raw)) {
|
|
214
|
+
const d = new Date(raw);
|
|
215
|
+
if (!Number.isNaN(d.getTime()))
|
|
216
|
+
return d;
|
|
217
|
+
}
|
|
202
218
|
const n = Number(raw);
|
|
203
219
|
if (!Number.isNaN(n) && raw !== "")
|
|
204
220
|
return n;
|
|
@@ -27,4 +27,4 @@ export declare const firebaseDbProvider: IDbProvider;
|
|
|
27
27
|
export { buildFirebaseClientConfig, normalizeFirebaseConfigValue, } from "./client-config";
|
|
28
28
|
export type { FirebaseClientConfig } from "./client-config";
|
|
29
29
|
export type { SieveModel, SieveFields, SieveFieldConfig, SieveOptions, SieveResult, SieveFilterAlias, SieveFilterAliases, FirebaseSieveFieldConfig, FirebaseSieveFields, FirebaseSieveOptions, FirebaseSieveResult, } from "./sieve";
|
|
30
|
-
export { applySieveToFirestore, expandFilterAliases } from "./sieve";
|
|
30
|
+
export { applySieveToFirestore, expandFilterAliases, parseSieveDateValue } from "./sieve";
|
|
@@ -38,4 +38,4 @@ export const firebaseDbProvider = {
|
|
|
38
38
|
};
|
|
39
39
|
// Firebase client config builder (for consumer app bundles)
|
|
40
40
|
export { buildFirebaseClientConfig, normalizeFirebaseConfigValue, } from "./client-config";
|
|
41
|
-
export { applySieveToFirestore, expandFilterAliases } from "./sieve";
|
|
41
|
+
export { applySieveToFirestore, expandFilterAliases, parseSieveDateValue } from "./sieve";
|
|
@@ -75,8 +75,27 @@ export type SieveFieldConfig = {
|
|
|
75
75
|
path?: string;
|
|
76
76
|
canFilter?: boolean;
|
|
77
77
|
canSort?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Convert the raw string filter value before it reaches the Firestore
|
|
80
|
+
* adapter. Required for any field stored as a Firestore Timestamp — without
|
|
81
|
+
* it, sievejs's default `convertValue` (`processor.js`) leaves date-like
|
|
82
|
+
* filter values as plain strings, and a Firestore inequality (`>`, `<`,
|
|
83
|
+
* `>=`, `<=`) comparing a Timestamp field against a string value matches
|
|
84
|
+
* ZERO documents (Firestore requires the query value's type to match the
|
|
85
|
+
* field's stored type for range comparisons) — silently, with no error.
|
|
86
|
+
* Use `parseSieveDateValue` below for Timestamp fields.
|
|
87
|
+
*/
|
|
88
|
+
parseValue?: (raw: string) => unknown;
|
|
78
89
|
};
|
|
79
90
|
export type SieveFields = Record<string, SieveFieldConfig>;
|
|
91
|
+
/**
|
|
92
|
+
* `SieveFieldConfig.parseValue` for any field stored as a Firestore
|
|
93
|
+
* Timestamp. Converts an ISO date string (or any `Date`-parseable value) into
|
|
94
|
+
* a real `Date`, which the Admin SDK compares correctly against a Timestamp
|
|
95
|
+
* field. Falls back to the raw string on an unparseable value rather than
|
|
96
|
+
* throwing, so a malformed filter degrades to "no match" instead of a 500.
|
|
97
|
+
*/
|
|
98
|
+
export declare function parseSieveDateValue(raw: string): Date | string;
|
|
80
99
|
export interface SieveModel {
|
|
81
100
|
/** Comma-delimited filter expressions, e.g. `status==published,price>=100` */
|
|
82
101
|
filters?: string;
|
|
@@ -101,6 +101,17 @@ import { expandFilterAliases as _expandFilterAliases, } from "./filter-aliases";
|
|
|
101
101
|
// should prefer importing from `./filter-aliases` directly — that path has
|
|
102
102
|
// zero runtime deps and is client-safe.
|
|
103
103
|
export { _expandFilterAliases as expandFilterAliases, };
|
|
104
|
+
/**
|
|
105
|
+
* `SieveFieldConfig.parseValue` for any field stored as a Firestore
|
|
106
|
+
* Timestamp. Converts an ISO date string (or any `Date`-parseable value) into
|
|
107
|
+
* a real `Date`, which the Admin SDK compares correctly against a Timestamp
|
|
108
|
+
* field. Falls back to the raw string on an unparseable value rather than
|
|
109
|
+
* throwing, so a malformed filter degrades to "no match" instead of a 500.
|
|
110
|
+
*/
|
|
111
|
+
export function parseSieveDateValue(raw) {
|
|
112
|
+
const parsed = new Date(raw);
|
|
113
|
+
return Number.isNaN(parsed.getTime()) ? raw : parsed;
|
|
114
|
+
}
|
|
104
115
|
const SIEVE_DEFAULTS = {
|
|
105
116
|
caseSensitive: false,
|
|
106
117
|
defaultPageSize: 20,
|
package/dist/server.d.ts
CHANGED
|
@@ -272,6 +272,8 @@ export { eventIdGET } from "./features/events/server";
|
|
|
272
272
|
export { eventsGET } from "./features/events/server";
|
|
273
273
|
export { getEventLeaderboard } from "./features/events/server";
|
|
274
274
|
export { getEventPollResults } from "./features/events/server";
|
|
275
|
+
export type { PollResultEntry, SpinResultEntry } from "./features/events/index";
|
|
276
|
+
export { getEventSpinResults } from "./features/events/server";
|
|
275
277
|
export { getBugHunterLeaderboard } from "./features/tester/server";
|
|
276
278
|
export { getPublicEventById } from "./features/events/server";
|
|
277
279
|
export { listPublicEvents } from "./features/events/server";
|
package/dist/server.js
CHANGED
|
@@ -779,6 +779,9 @@ export { getEventLeaderboard } from "./features/events/server";
|
|
|
779
779
|
// getEventPollResults - Helper for get event poll results (per-option vote tally).
|
|
780
780
|
export { getEventPollResults } from "./features/events/server";
|
|
781
781
|
// [SERVER-ONLY]-Server-only — uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
782
|
+
// getEventSpinResults - Last N winning spins for a spin_wheel event, most recent first.
|
|
783
|
+
export { getEventSpinResults } from "./features/events/server";
|
|
784
|
+
// [SERVER-ONLY]-Server-only — uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|
|
782
785
|
// getBugHunterLeaderboard - Ranks testers by confirmed-bug count.
|
|
783
786
|
export { getBugHunterLeaderboard } from "./features/tester/server";
|
|
784
787
|
// [SERVER-ONLY]-Server-only — uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
|