@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.
- package/dist/core/analytics.d.ts +41 -0
- package/dist/drizzle/index.d.ts +1929 -424
- package/dist/drizzle/index.js +198 -2
- package/dist/drizzle/queries.d.ts +1808 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +70 -0
- package/package.json +1 -1
package/dist/drizzle/index.js
CHANGED
|
@@ -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
|
};
|