@absolutejs/commerce 0.4.0-beta.0 → 0.5.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,89 @@ 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 createReturnRequest = async (db, request) => {
61
+ const [created] = await db.insert(commerceReturnRequests).values(request).returning();
62
+ return created;
63
+ };
64
+ var findOrderForTracking = async (db, orderNumber, email) => {
65
+ const tail = orderNumber.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
66
+ if (tail.length < 4)
67
+ return null;
68
+ const [order] = await db.select({
69
+ amount_total: commerceOrders.amount_total,
70
+ carrier: commerceOrders.carrier,
71
+ created_at: commerceOrders.created_at,
72
+ production_stage: commerceOrders.production_stage,
73
+ session_id: commerceOrders.session_id,
74
+ status: commerceOrders.status,
75
+ tracking_number: commerceOrders.tracking_number
76
+ }).from(commerceOrders).where(and(sql`lower(right(${commerceOrders.session_id}, 8)) = ${tail}`, sql`lower(${commerceOrders.customer_email}) = ${email.trim().toLowerCase()}`)).limit(1);
77
+ return order ?? null;
78
+ };
79
+ var listReturnRequests = (db) => db.select().from(commerceReturnRequests).orderBy(desc(commerceReturnRequests.created_at));
80
+ var setReturnStatus = async (db, id, status) => {
81
+ const [updated] = await db.update(commerceReturnRequests).set({ status }).where(eq(commerceReturnRequests.id, id)).returning();
82
+ return updated;
83
+ };
84
+ var listSubscribers = (db) => db.select().from(commerceSubscribers).orderBy(desc(commerceSubscribers.created_at));
85
+ var subscribe = async (db, email) => {
86
+ await db.insert(commerceSubscribers).values({ email: email.trim().toLowerCase() }).onConflictDoNothing();
87
+ };
88
+ var dueForReminder = (db, before) => db.select().from(commerceAbandonedCarts).where(and(eq(commerceAbandonedCarts.recovered, false), eq(commerceAbandonedCarts.reminded, false), lt(commerceAbandonedCarts.created_at, before)));
89
+ var markCartsRecovered = (db, email) => db.update(commerceAbandonedCarts).set({ recovered: true }).where(and(sql`lower(${commerceAbandonedCarts.customer_email}) = ${email.trim().toLowerCase()}`, eq(commerceAbandonedCarts.recovered, false)));
90
+ var markReminded = (db, id) => db.update(commerceAbandonedCarts).set({ reminded: true }).where(eq(commerceAbandonedCarts.id, id));
91
+ var recordAbandonedCart = async (db, email, cart) => {
92
+ await db.insert(commerceAbandonedCarts).values({ cart, customer_email: email.trim().toLowerCase() });
93
+ };
94
+
95
+ // src/drizzle/index.ts
13
96
  var commerceDesigns = pgTable("designs", {
14
97
  created_at: timestamp().notNull().defaultNow(),
15
98
  id: uuid().defaultRandom().primaryKey(),
@@ -73,16 +156,94 @@ var commerceQuotes = pgTable("quotes", {
73
156
  quoted_at: timestamp(),
74
157
  status: varchar({ length: 20 }).notNull().default("new")
75
158
  });
159
+ var commerceAbandonedCarts = pgTable("abandoned_carts", {
160
+ cart: jsonb().$type().notNull(),
161
+ created_at: timestamp().notNull().defaultNow(),
162
+ customer_email: varchar({ length: 320 }).notNull(),
163
+ id: uuid().defaultRandom().primaryKey(),
164
+ recovered: boolean().notNull().default(false),
165
+ reminded: boolean().notNull().default(false)
166
+ });
167
+ var commerceFavorites = pgTable("favorites", {
168
+ created_at: timestamp().notNull().defaultNow(),
169
+ customer_email: varchar({ length: 320 }).notNull(),
170
+ id: uuid().defaultRandom().primaryKey(),
171
+ product_id: varchar({ length: 40 }).notNull()
172
+ });
173
+ var commerceReturnRequests = pgTable("return_requests", {
174
+ created_at: timestamp().notNull().defaultNow(),
175
+ customer_email: varchar({ length: 320 }).notNull(),
176
+ id: uuid().defaultRandom().primaryKey(),
177
+ kind: varchar({ length: 20 }).notNull(),
178
+ order_session_id: varchar({ length: 255 }).notNull(),
179
+ reason: text().notNull(),
180
+ status: varchar({ length: 20 }).notNull().default("pending")
181
+ });
182
+ var commerceReviews = pgTable("reviews", {
183
+ author_name: varchar({ length: 120 }).notNull(),
184
+ body: text().notNull(),
185
+ created_at: timestamp().notNull().defaultNow(),
186
+ id: uuid().defaultRandom().primaryKey(),
187
+ order_session_id: varchar({ length: 255 }),
188
+ product_id: varchar({ length: 40 }).notNull(),
189
+ rating: integer().notNull(),
190
+ status: varchar({ length: 20 }).notNull().default("pending"),
191
+ title: varchar({ length: 160 })
192
+ });
193
+ var commerceSavedDesigns = pgTable("saved_designs", {
194
+ created_at: timestamp().notNull().defaultNow(),
195
+ customer_email: varchar({ length: 320 }).notNull(),
196
+ id: uuid().defaultRandom().primaryKey(),
197
+ label: varchar({ length: 120 }),
198
+ product_id: varchar({ length: 40 }).notNull(),
199
+ snapshot: jsonb().$type().notNull()
200
+ });
201
+ var commerceSubscribers = pgTable("subscribers", {
202
+ created_at: timestamp().notNull().defaultNow(),
203
+ email: varchar({ length: 320 }).primaryKey()
204
+ });
76
205
  var commerceDrizzleSchema = {
206
+ abandonedCarts: commerceAbandonedCarts,
77
207
  designs: commerceDesigns,
78
208
  discounts: commerceDiscounts,
209
+ favorites: commerceFavorites,
79
210
  orders: commerceOrders,
80
- quotes: commerceQuotes
211
+ quotes: commerceQuotes,
212
+ returnRequests: commerceReturnRequests,
213
+ reviews: commerceReviews,
214
+ savedDesigns: commerceSavedDesigns,
215
+ subscribers: commerceSubscribers
81
216
  };
82
217
  export {
218
+ toggleFavorite,
219
+ subscribe,
220
+ setReviewStatus,
221
+ setReturnStatus,
222
+ saveDesign,
223
+ recordAbandonedCart,
224
+ ratingSummaries,
225
+ markReminded,
226
+ markCartsRecovered,
227
+ listSubscribers,
228
+ listSavedDesigns,
229
+ listReturnRequests,
230
+ listFavorites,
231
+ listApprovedReviews,
232
+ listAllReviews,
233
+ findOrderForTracking,
234
+ dueForReminder,
235
+ deleteSavedDesign,
236
+ createReview,
237
+ createReturnRequest,
238
+ commerceSubscribers,
239
+ commerceSavedDesigns,
240
+ commerceReviews,
241
+ commerceReturnRequests,
83
242
  commerceQuotes,
84
243
  commerceOrders,
244
+ commerceFavorites,
85
245
  commerceDrizzleSchema,
86
246
  commerceDiscounts,
87
- commerceDesigns
247
+ commerceDesigns,
248
+ commerceAbandonedCarts
88
249
  };