@absolutejs/commerce 0.4.0-beta.0 → 0.6.0-beta.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.
@@ -10,6 +10,112 @@ import {
10
10
  uuid,
11
11
  varchar
12
12
  } from "drizzle-orm/pg-core";
13
+
14
+ // src/drizzle/queries.ts
15
+ import { and, desc, eq, lt, sql } from "drizzle-orm";
16
+ var createReview = async (db, review) => {
17
+ const [created] = await db.insert(commerceReviews).values(review).returning();
18
+ return created;
19
+ };
20
+ var listAllReviews = (db) => db.select().from(commerceReviews).orderBy(desc(commerceReviews.created_at));
21
+ var listApprovedReviews = (db, productId) => db.select().from(commerceReviews).where(productId ? and(eq(commerceReviews.status, "approved"), eq(commerceReviews.product_id, productId)) : eq(commerceReviews.status, "approved")).orderBy(desc(commerceReviews.created_at));
22
+ var ratingSummaries = async (db) => {
23
+ const rows = await db.select({
24
+ average: sql`avg(${commerceReviews.rating})`,
25
+ count: sql`count(*)`,
26
+ productId: commerceReviews.product_id
27
+ }).from(commerceReviews).where(eq(commerceReviews.status, "approved")).groupBy(commerceReviews.product_id);
28
+ return rows.map((row) => ({
29
+ average: Math.round(Number(row.average) * 10) / 10,
30
+ count: Number(row.count),
31
+ productId: row.productId
32
+ }));
33
+ };
34
+ var setReviewStatus = async (db, id, status) => {
35
+ const [updated] = await db.update(commerceReviews).set({ status }).where(eq(commerceReviews.id, id)).returning();
36
+ return updated;
37
+ };
38
+ var listFavorites = async (db, email) => {
39
+ const rows = await db.select({ productId: commerceFavorites.product_id }).from(commerceFavorites).where(eq(commerceFavorites.customer_email, email));
40
+ return rows.map((row) => row.productId);
41
+ };
42
+ var toggleFavorite = async (db, email, productId) => {
43
+ const existing = await db.select({ id: commerceFavorites.id }).from(commerceFavorites).where(and(eq(commerceFavorites.customer_email, email), eq(commerceFavorites.product_id, productId))).limit(1);
44
+ if (existing.length > 0) {
45
+ await db.delete(commerceFavorites).where(eq(commerceFavorites.id, existing[0].id));
46
+ return false;
47
+ }
48
+ await db.insert(commerceFavorites).values({ customer_email: email, product_id: productId });
49
+ return true;
50
+ };
51
+ var deleteSavedDesign = async (db, id, email) => {
52
+ const [deleted] = await db.delete(commerceSavedDesigns).where(and(eq(commerceSavedDesigns.id, id), eq(commerceSavedDesigns.customer_email, email))).returning();
53
+ return deleted;
54
+ };
55
+ var listSavedDesigns = (db, email) => db.select().from(commerceSavedDesigns).where(eq(commerceSavedDesigns.customer_email, email)).orderBy(desc(commerceSavedDesigns.created_at));
56
+ var saveDesign = async (db, design) => {
57
+ const [created] = await db.insert(commerceSavedDesigns).values(design).returning();
58
+ return created;
59
+ };
60
+ var issueGiftCard = async (db, input) => {
61
+ const [created] = await db.insert(commerceGiftCards).values({
62
+ balance_cents: input.cents,
63
+ code: input.code.trim().toUpperCase(),
64
+ initial_cents: input.cents,
65
+ recipient_email: input.recipientEmail ?? null
66
+ }).returning();
67
+ return created;
68
+ };
69
+ var getGiftCard = async (db, code) => {
70
+ const [card] = await db.select().from(commerceGiftCards).where(eq(commerceGiftCards.code, code.trim().toUpperCase())).limit(1);
71
+ return card ?? null;
72
+ };
73
+ var redeemGiftCard = async (db, code, amountCents) => {
74
+ const card = await getGiftCard(db, code);
75
+ if (!card)
76
+ return null;
77
+ const applied = Math.max(0, Math.min(card.balance_cents, amountCents));
78
+ const balance = card.balance_cents - applied;
79
+ if (applied > 0)
80
+ await db.update(commerceGiftCards).set({ balance_cents: balance }).where(eq(commerceGiftCards.code, card.code));
81
+ return { appliedCents: applied, balanceCents: balance };
82
+ };
83
+ var createReturnRequest = async (db, request) => {
84
+ const [created] = await db.insert(commerceReturnRequests).values(request).returning();
85
+ return created;
86
+ };
87
+ var findOrderForTracking = async (db, orderNumber, email) => {
88
+ const tail = orderNumber.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
89
+ if (tail.length < 4)
90
+ return null;
91
+ const [order] = await db.select({
92
+ amount_total: commerceOrders.amount_total,
93
+ carrier: commerceOrders.carrier,
94
+ created_at: commerceOrders.created_at,
95
+ production_stage: commerceOrders.production_stage,
96
+ session_id: commerceOrders.session_id,
97
+ status: commerceOrders.status,
98
+ tracking_number: commerceOrders.tracking_number
99
+ }).from(commerceOrders).where(and(sql`lower(right(${commerceOrders.session_id}, 8)) = ${tail}`, sql`lower(${commerceOrders.customer_email}) = ${email.trim().toLowerCase()}`)).limit(1);
100
+ return order ?? null;
101
+ };
102
+ var listReturnRequests = (db) => db.select().from(commerceReturnRequests).orderBy(desc(commerceReturnRequests.created_at));
103
+ var setReturnStatus = async (db, id, status) => {
104
+ const [updated] = await db.update(commerceReturnRequests).set({ status }).where(eq(commerceReturnRequests.id, id)).returning();
105
+ return updated;
106
+ };
107
+ var listSubscribers = (db) => db.select().from(commerceSubscribers).orderBy(desc(commerceSubscribers.created_at));
108
+ var subscribe = async (db, email) => {
109
+ await db.insert(commerceSubscribers).values({ email: email.trim().toLowerCase() }).onConflictDoNothing();
110
+ };
111
+ var dueForReminder = (db, before) => db.select().from(commerceAbandonedCarts).where(and(eq(commerceAbandonedCarts.recovered, false), eq(commerceAbandonedCarts.reminded, false), lt(commerceAbandonedCarts.created_at, before)));
112
+ var markCartsRecovered = (db, email) => db.update(commerceAbandonedCarts).set({ recovered: true }).where(and(sql`lower(${commerceAbandonedCarts.customer_email}) = ${email.trim().toLowerCase()}`, eq(commerceAbandonedCarts.recovered, false)));
113
+ var markReminded = (db, id) => db.update(commerceAbandonedCarts).set({ reminded: true }).where(eq(commerceAbandonedCarts.id, id));
114
+ var recordAbandonedCart = async (db, email, cart) => {
115
+ await db.insert(commerceAbandonedCarts).values({ cart, customer_email: email.trim().toLowerCase() });
116
+ };
117
+
118
+ // src/drizzle/index.ts
13
119
  var commerceDesigns = pgTable("designs", {
14
120
  created_at: timestamp().notNull().defaultNow(),
15
121
  id: uuid().defaultRandom().primaryKey(),
@@ -73,16 +179,106 @@ var commerceQuotes = pgTable("quotes", {
73
179
  quoted_at: timestamp(),
74
180
  status: varchar({ length: 20 }).notNull().default("new")
75
181
  });
182
+ var commerceAbandonedCarts = pgTable("abandoned_carts", {
183
+ cart: jsonb().$type().notNull(),
184
+ created_at: timestamp().notNull().defaultNow(),
185
+ customer_email: varchar({ length: 320 }).notNull(),
186
+ id: uuid().defaultRandom().primaryKey(),
187
+ recovered: boolean().notNull().default(false),
188
+ reminded: boolean().notNull().default(false)
189
+ });
190
+ var commerceGiftCards = pgTable("gift_cards", {
191
+ balance_cents: integer().notNull(),
192
+ code: varchar({ length: 40 }).primaryKey(),
193
+ created_at: timestamp().notNull().defaultNow(),
194
+ initial_cents: integer().notNull(),
195
+ recipient_email: varchar({ length: 320 })
196
+ });
197
+ var commerceFavorites = pgTable("favorites", {
198
+ created_at: timestamp().notNull().defaultNow(),
199
+ customer_email: varchar({ length: 320 }).notNull(),
200
+ id: uuid().defaultRandom().primaryKey(),
201
+ product_id: varchar({ length: 40 }).notNull()
202
+ });
203
+ var commerceReturnRequests = pgTable("return_requests", {
204
+ created_at: timestamp().notNull().defaultNow(),
205
+ customer_email: varchar({ length: 320 }).notNull(),
206
+ id: uuid().defaultRandom().primaryKey(),
207
+ kind: varchar({ length: 20 }).notNull(),
208
+ order_session_id: varchar({ length: 255 }).notNull(),
209
+ reason: text().notNull(),
210
+ status: varchar({ length: 20 }).notNull().default("pending")
211
+ });
212
+ var commerceReviews = pgTable("reviews", {
213
+ author_name: varchar({ length: 120 }).notNull(),
214
+ body: text().notNull(),
215
+ created_at: timestamp().notNull().defaultNow(),
216
+ id: uuid().defaultRandom().primaryKey(),
217
+ order_session_id: varchar({ length: 255 }),
218
+ product_id: varchar({ length: 40 }).notNull(),
219
+ rating: integer().notNull(),
220
+ status: varchar({ length: 20 }).notNull().default("pending"),
221
+ title: varchar({ length: 160 })
222
+ });
223
+ var commerceSavedDesigns = pgTable("saved_designs", {
224
+ created_at: timestamp().notNull().defaultNow(),
225
+ customer_email: varchar({ length: 320 }).notNull(),
226
+ id: uuid().defaultRandom().primaryKey(),
227
+ label: varchar({ length: 120 }),
228
+ product_id: varchar({ length: 40 }).notNull(),
229
+ snapshot: jsonb().$type().notNull()
230
+ });
231
+ var commerceSubscribers = pgTable("subscribers", {
232
+ created_at: timestamp().notNull().defaultNow(),
233
+ email: varchar({ length: 320 }).primaryKey()
234
+ });
76
235
  var commerceDrizzleSchema = {
236
+ abandonedCarts: commerceAbandonedCarts,
77
237
  designs: commerceDesigns,
78
238
  discounts: commerceDiscounts,
239
+ favorites: commerceFavorites,
240
+ giftCards: commerceGiftCards,
79
241
  orders: commerceOrders,
80
- quotes: commerceQuotes
242
+ quotes: commerceQuotes,
243
+ returnRequests: commerceReturnRequests,
244
+ reviews: commerceReviews,
245
+ savedDesigns: commerceSavedDesigns,
246
+ subscribers: commerceSubscribers
81
247
  };
82
248
  export {
249
+ toggleFavorite,
250
+ subscribe,
251
+ setReviewStatus,
252
+ setReturnStatus,
253
+ saveDesign,
254
+ redeemGiftCard,
255
+ recordAbandonedCart,
256
+ ratingSummaries,
257
+ markReminded,
258
+ markCartsRecovered,
259
+ listSubscribers,
260
+ listSavedDesigns,
261
+ listReturnRequests,
262
+ listFavorites,
263
+ listApprovedReviews,
264
+ listAllReviews,
265
+ issueGiftCard,
266
+ getGiftCard,
267
+ findOrderForTracking,
268
+ dueForReminder,
269
+ deleteSavedDesign,
270
+ createReview,
271
+ createReturnRequest,
272
+ commerceSubscribers,
273
+ commerceSavedDesigns,
274
+ commerceReviews,
275
+ commerceReturnRequests,
83
276
  commerceQuotes,
84
277
  commerceOrders,
278
+ commerceGiftCards,
279
+ commerceFavorites,
85
280
  commerceDrizzleSchema,
86
281
  commerceDiscounts,
87
- commerceDesigns
282
+ commerceDesigns,
283
+ commerceAbandonedCarts
88
284
  };