@rovela-ai/sdk 0.1.25 → 0.1.27
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/admin/components/CategoryForm.d.ts.map +1 -1
- package/dist/admin/components/CategoryForm.js +2 -2
- package/dist/admin/components/CategoryForm.js.map +1 -1
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +3 -35
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/ProductTable.d.ts.map +1 -1
- package/dist/admin/components/ProductTable.js +6 -1
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/server/admin-service.d.ts +3 -3
- package/dist/admin/server/admin-service.d.ts.map +1 -1
- package/dist/admin/server/admin-service.js +12 -22
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/auth/server/customer-service.d.ts +2 -2
- package/dist/auth/server/customer-service.d.ts.map +1 -1
- package/dist/auth/server/customer-service.js +11 -20
- package/dist/auth/server/customer-service.js.map +1 -1
- package/dist/auth/server/password-reset-service.d.ts +1 -0
- package/dist/auth/server/password-reset-service.d.ts.map +1 -1
- package/dist/auth/server/password-reset-service.js +5 -7
- package/dist/auth/server/password-reset-service.js.map +1 -1
- package/dist/auth/server/verification-service.d.ts +1 -0
- package/dist/auth/server/verification-service.d.ts.map +1 -1
- package/dist/auth/server/verification-service.js +6 -9
- package/dist/auth/server/verification-service.js.map +1 -1
- package/dist/core/db/client.d.ts +2 -44
- package/dist/core/db/client.d.ts.map +1 -1
- package/dist/core/db/client.js +2 -106
- package/dist/core/db/client.js.map +1 -1
- package/dist/core/db/index.d.ts +1 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +2 -2
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/db/queries.d.ts +18 -35
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +69 -110
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +1 -137
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +6 -23
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/server/index.d.ts +1 -1
- package/dist/core/server/index.d.ts.map +1 -1
- package/dist/core/server/index.js +1 -3
- package/dist/core/server/index.js.map +1 -1
- package/dist/core/types.d.ts +0 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/config.d.ts.map +1 -1
- package/dist/emails/config.js +11 -17
- package/dist/emails/config.js.map +1 -1
- package/dist/media/api/delete.d.ts +44 -0
- package/dist/media/api/delete.d.ts.map +1 -0
- package/dist/media/api/delete.js +134 -0
- package/dist/media/api/delete.js.map +1 -0
- package/dist/media/api/index.d.ts +17 -0
- package/dist/media/api/index.d.ts.map +1 -0
- package/dist/media/api/index.js +17 -0
- package/dist/media/api/index.js.map +1 -0
- package/dist/media/api/presign.d.ts +39 -0
- package/dist/media/api/presign.d.ts.map +1 -0
- package/dist/media/api/presign.js +138 -0
- package/dist/media/api/presign.js.map +1 -0
- package/dist/media/components/DropZone.d.ts +18 -0
- package/dist/media/components/DropZone.d.ts.map +1 -0
- package/dist/media/components/DropZone.js +112 -0
- package/dist/media/components/DropZone.js.map +1 -0
- package/dist/media/components/ImageGalleryUpload.d.ts +18 -0
- package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -0
- package/dist/media/components/ImageGalleryUpload.js +156 -0
- package/dist/media/components/ImageGalleryUpload.js.map +1 -0
- package/dist/media/components/ImageUpload.d.ts +17 -0
- package/dist/media/components/ImageUpload.d.ts.map +1 -0
- package/dist/media/components/ImageUpload.js +95 -0
- package/dist/media/components/ImageUpload.js.map +1 -0
- package/dist/media/components/index.d.ts +10 -0
- package/dist/media/components/index.d.ts.map +1 -0
- package/dist/media/components/index.js +9 -0
- package/dist/media/components/index.js.map +1 -0
- package/dist/media/config.d.ts +57 -0
- package/dist/media/config.d.ts.map +1 -0
- package/dist/media/config.js +142 -0
- package/dist/media/config.js.map +1 -0
- package/dist/media/hooks/index.d.ts +8 -0
- package/dist/media/hooks/index.d.ts.map +1 -0
- package/dist/media/hooks/index.js +7 -0
- package/dist/media/hooks/index.js.map +1 -0
- package/dist/media/hooks/useUpload.d.ts +32 -0
- package/dist/media/hooks/useUpload.d.ts.map +1 -0
- package/dist/media/hooks/useUpload.js +258 -0
- package/dist/media/hooks/useUpload.js.map +1 -0
- package/dist/media/index.d.ts +57 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +68 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/server/delete.d.ts +59 -0
- package/dist/media/server/delete.d.ts.map +1 -0
- package/dist/media/server/delete.js +176 -0
- package/dist/media/server/delete.js.map +1 -0
- package/dist/media/server/index.d.ts +10 -0
- package/dist/media/server/index.d.ts.map +1 -0
- package/dist/media/server/index.js +13 -0
- package/dist/media/server/index.js.map +1 -0
- package/dist/media/server/presign.d.ts +57 -0
- package/dist/media/server/presign.d.ts.map +1 -0
- package/dist/media/server/presign.js +112 -0
- package/dist/media/server/presign.js.map +1 -0
- package/dist/media/server/r2-client.d.ts +30 -0
- package/dist/media/server/r2-client.d.ts.map +1 -0
- package/dist/media/server/r2-client.js +76 -0
- package/dist/media/server/r2-client.js.map +1 -0
- package/dist/media/types.d.ts +271 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/types.js +52 -0
- package/dist/media/types.js.map +1 -0
- package/package.json +15 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-service.js","sourceRoot":"","sources":["../../../src/admin/server/admin-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"admin-service.js","sourceRoot":"","sources":["../../../src/admin/server/admin-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @rovela/sdk/auth/server/customer-service
|
|
3
3
|
*
|
|
4
|
-
* Customer CRUD operations
|
|
5
|
-
*
|
|
4
|
+
* Customer CRUD operations.
|
|
5
|
+
* Each store has its own database (via Neon branches) - no tenant isolation needed.
|
|
6
6
|
*/
|
|
7
7
|
import * as schema from '../../core/db/schema';
|
|
8
8
|
import type { CustomerSession } from '../types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customer-service.d.ts","sourceRoot":"","sources":["../../../src/auth/server/customer-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAM/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAA;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,gBAAgB,CAAA;CACtE;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"customer-service.d.ts","sourceRoot":"","sources":["../../../src/auth/server/customer-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAM/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,IAAI,CAAA;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,qBAAqB,GAAG,oBAAoB,GAAG,gBAAgB,CAAA;CACtE;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,mBAAmB,UAAO,GACzB,OAAO,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,CAsCjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAwBjC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAUjC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAUjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyBjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjE"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @rovela/sdk/auth/server/customer-service
|
|
3
3
|
*
|
|
4
|
-
* Customer CRUD operations
|
|
5
|
-
*
|
|
4
|
+
* Customer CRUD operations.
|
|
5
|
+
* Each store has its own database (via Neon branches) - no tenant isolation needed.
|
|
6
6
|
*/
|
|
7
|
-
import { eq
|
|
8
|
-
import { getDb
|
|
7
|
+
import { eq } from 'drizzle-orm';
|
|
8
|
+
import { getDb } from '../../core/db/client';
|
|
9
9
|
import * as schema from '../../core/db/schema';
|
|
10
10
|
import { hashPassword, verifyPassword } from './password';
|
|
11
11
|
// =============================================================================
|
|
@@ -33,14 +33,12 @@ import { hashPassword, verifyPassword } from './password';
|
|
|
33
33
|
*/
|
|
34
34
|
export async function createCustomer(email, password, name) {
|
|
35
35
|
const db = getDb();
|
|
36
|
-
const tenantId = getTenantId();
|
|
37
36
|
// Hash password
|
|
38
37
|
const passwordHash = await hashPassword(password);
|
|
39
38
|
try {
|
|
40
39
|
const [customer] = await db
|
|
41
40
|
.insert(schema.customers)
|
|
42
41
|
.values({
|
|
43
|
-
tenantId,
|
|
44
42
|
email: email.toLowerCase().trim(),
|
|
45
43
|
name: name?.trim() || null,
|
|
46
44
|
passwordHash,
|
|
@@ -79,12 +77,11 @@ export async function createCustomer(email, password, name) {
|
|
|
79
77
|
*/
|
|
80
78
|
export async function authenticateCustomer(email, password, requireVerification = true) {
|
|
81
79
|
const db = getDb();
|
|
82
|
-
const tenantId = getTenantId();
|
|
83
80
|
// Find customer by email
|
|
84
81
|
const [customer] = await db
|
|
85
82
|
.select()
|
|
86
83
|
.from(schema.customers)
|
|
87
|
-
.where(
|
|
84
|
+
.where(eq(schema.customers.email, email.toLowerCase().trim()))
|
|
88
85
|
.limit(1);
|
|
89
86
|
if (!customer) {
|
|
90
87
|
return {
|
|
@@ -128,7 +125,6 @@ export async function authenticateCustomer(email, password, requireVerification
|
|
|
128
125
|
*/
|
|
129
126
|
export async function findCustomerForSession(customerId) {
|
|
130
127
|
const db = getDb();
|
|
131
|
-
const tenantId = getTenantId();
|
|
132
128
|
const [customer] = await db
|
|
133
129
|
.select({
|
|
134
130
|
id: schema.customers.id,
|
|
@@ -137,7 +133,7 @@ export async function findCustomerForSession(customerId) {
|
|
|
137
133
|
emailVerified: schema.customers.emailVerified,
|
|
138
134
|
})
|
|
139
135
|
.from(schema.customers)
|
|
140
|
-
.where(
|
|
136
|
+
.where(eq(schema.customers.id, customerId))
|
|
141
137
|
.limit(1);
|
|
142
138
|
if (!customer) {
|
|
143
139
|
return null;
|
|
@@ -157,11 +153,10 @@ export async function findCustomerForSession(customerId) {
|
|
|
157
153
|
*/
|
|
158
154
|
export async function findCustomerByEmail(email) {
|
|
159
155
|
const db = getDb();
|
|
160
|
-
const tenantId = getTenantId();
|
|
161
156
|
const [customer] = await db
|
|
162
157
|
.select()
|
|
163
158
|
.from(schema.customers)
|
|
164
|
-
.where(
|
|
159
|
+
.where(eq(schema.customers.email, email.toLowerCase().trim()))
|
|
165
160
|
.limit(1);
|
|
166
161
|
return customer || null;
|
|
167
162
|
}
|
|
@@ -173,11 +168,10 @@ export async function findCustomerByEmail(email) {
|
|
|
173
168
|
*/
|
|
174
169
|
export async function findCustomerById(customerId) {
|
|
175
170
|
const db = getDb();
|
|
176
|
-
const tenantId = getTenantId();
|
|
177
171
|
const [customer] = await db
|
|
178
172
|
.select()
|
|
179
173
|
.from(schema.customers)
|
|
180
|
-
.where(
|
|
174
|
+
.where(eq(schema.customers.id, customerId))
|
|
181
175
|
.limit(1);
|
|
182
176
|
return customer || null;
|
|
183
177
|
}
|
|
@@ -195,7 +189,6 @@ export async function findCustomerById(customerId) {
|
|
|
195
189
|
*/
|
|
196
190
|
export async function updateCustomer(customerId, data) {
|
|
197
191
|
const db = getDb();
|
|
198
|
-
const tenantId = getTenantId();
|
|
199
192
|
const updateData = {};
|
|
200
193
|
if (data.name !== undefined) {
|
|
201
194
|
updateData.name = data.name?.trim() || null;
|
|
@@ -210,7 +203,7 @@ export async function updateCustomer(customerId, data) {
|
|
|
210
203
|
const [customer] = await db
|
|
211
204
|
.update(schema.customers)
|
|
212
205
|
.set(updateData)
|
|
213
|
-
.where(
|
|
206
|
+
.where(eq(schema.customers.id, customerId))
|
|
214
207
|
.returning();
|
|
215
208
|
return customer || null;
|
|
216
209
|
}
|
|
@@ -227,12 +220,11 @@ export async function updateCustomer(customerId, data) {
|
|
|
227
220
|
*/
|
|
228
221
|
export async function updateCustomerPassword(customerId, newPassword) {
|
|
229
222
|
const db = getDb();
|
|
230
|
-
const tenantId = getTenantId();
|
|
231
223
|
const passwordHash = await hashPassword(newPassword);
|
|
232
224
|
await db
|
|
233
225
|
.update(schema.customers)
|
|
234
226
|
.set({ passwordHash })
|
|
235
|
-
.where(
|
|
227
|
+
.where(eq(schema.customers.id, customerId));
|
|
236
228
|
}
|
|
237
229
|
/**
|
|
238
230
|
* Mark customer email as verified.
|
|
@@ -246,11 +238,10 @@ export async function updateCustomerPassword(customerId, newPassword) {
|
|
|
246
238
|
*/
|
|
247
239
|
export async function markEmailVerified(customerId) {
|
|
248
240
|
const db = getDb();
|
|
249
|
-
const tenantId = getTenantId();
|
|
250
241
|
await db
|
|
251
242
|
.update(schema.customers)
|
|
252
243
|
.set({ emailVerified: new Date() })
|
|
253
|
-
.where(
|
|
244
|
+
.where(eq(schema.customers.id, customerId));
|
|
254
245
|
}
|
|
255
246
|
/**
|
|
256
247
|
* Check if email is already registered.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customer-service.js","sourceRoot":"","sources":["../../../src/auth/server/customer-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"customer-service.js","sourceRoot":"","sources":["../../../src/auth/server/customer-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset-service.d.ts","sourceRoot":"","sources":["../../../src/auth/server/password-reset-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"password-reset-service.d.ts","sourceRoot":"","sources":["../../../src/auth/server/password-reset-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4BH;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,OAAO,EAAE,OAAO,CAAA;CACjB,CAAC,CA8BD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/D,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CA+BD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAyCD;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,CAAC,CASjE"}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Password reset token management.
|
|
5
5
|
* Handles creating, validating, and using reset tokens.
|
|
6
|
+
* Each store has its own database (via Neon branches) - no tenant isolation needed.
|
|
6
7
|
*/
|
|
7
|
-
import { eq,
|
|
8
|
+
import { eq, lt } from 'drizzle-orm';
|
|
8
9
|
import { nanoid } from 'nanoid';
|
|
9
|
-
import { getDb
|
|
10
|
+
import { getDb } from '../../core/db/client';
|
|
10
11
|
import * as schema from '../../core/db/schema';
|
|
11
12
|
import { findCustomerByEmail, updateCustomerPassword } from './customer-service';
|
|
12
13
|
import { sendPasswordResetEmail, getStoreName } from './email-sender';
|
|
@@ -51,11 +52,9 @@ export async function requestPasswordReset(email) {
|
|
|
51
52
|
await deletePasswordResetTokens(customer.id);
|
|
52
53
|
// Generate new token
|
|
53
54
|
const db = getDb();
|
|
54
|
-
const tenantId = getTenantId();
|
|
55
55
|
const token = nanoid(TOKEN_LENGTH);
|
|
56
56
|
const expires = new Date(Date.now() + TOKEN_EXPIRY_MS);
|
|
57
57
|
await db.insert(schema.customerPasswordResetTokens).values({
|
|
58
|
-
tenantId,
|
|
59
58
|
customerId: customer.id,
|
|
60
59
|
token,
|
|
61
60
|
expires,
|
|
@@ -86,7 +85,7 @@ export async function requestPasswordReset(email) {
|
|
|
86
85
|
*/
|
|
87
86
|
export async function validateResetToken(token) {
|
|
88
87
|
const db = getDb();
|
|
89
|
-
// Find the token
|
|
88
|
+
// Find the token
|
|
90
89
|
const [tokenRecord] = await db
|
|
91
90
|
.select()
|
|
92
91
|
.from(schema.customerPasswordResetTokens)
|
|
@@ -174,10 +173,9 @@ export async function resetPassword(token, newPassword) {
|
|
|
174
173
|
*/
|
|
175
174
|
export async function deletePasswordResetTokens(customerId) {
|
|
176
175
|
const db = getDb();
|
|
177
|
-
const tenantId = getTenantId();
|
|
178
176
|
await db
|
|
179
177
|
.delete(schema.customerPasswordResetTokens)
|
|
180
|
-
.where(
|
|
178
|
+
.where(eq(schema.customerPasswordResetTokens.customerId, customerId));
|
|
181
179
|
}
|
|
182
180
|
/**
|
|
183
181
|
* Clean up expired password reset tokens.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset-service.js","sourceRoot":"","sources":["../../../src/auth/server/password-reset-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"password-reset-service.js","sourceRoot":"","sources":["../../../src/auth/server/password-reset-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-service.d.ts","sourceRoot":"","sources":["../../../src/auth/server/verification-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verification-service.d.ts","sourceRoot":"","sources":["../../../src/auth/server/verification-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2BH;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CA6CD;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACpE,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CA+BD;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU1E;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAS5D"}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Email verification token management.
|
|
5
5
|
* Handles creating, validating, and cleaning up verification tokens.
|
|
6
|
+
* Each store has its own database (via Neon branches) - no tenant isolation needed.
|
|
6
7
|
*/
|
|
7
|
-
import { eq,
|
|
8
|
+
import { eq, lt } from 'drizzle-orm';
|
|
8
9
|
import { nanoid } from 'nanoid';
|
|
9
|
-
import { getDb
|
|
10
|
+
import { getDb } from '../../core/db/client';
|
|
10
11
|
import * as schema from '../../core/db/schema';
|
|
11
12
|
import { findCustomerByEmail, markEmailVerified } from './customer-service';
|
|
12
13
|
import { sendVerificationEmail, sendWelcomeEmail, getStoreName } from './email-sender';
|
|
@@ -39,14 +40,12 @@ const TOKEN_LENGTH = 32;
|
|
|
39
40
|
*/
|
|
40
41
|
export async function createVerificationToken(customerId) {
|
|
41
42
|
const db = getDb();
|
|
42
|
-
const tenantId = getTenantId();
|
|
43
43
|
// Delete any existing tokens for this customer
|
|
44
44
|
await deleteVerificationTokens(customerId);
|
|
45
45
|
// Generate new token
|
|
46
46
|
const token = nanoid(TOKEN_LENGTH);
|
|
47
47
|
const expires = new Date(Date.now() + TOKEN_EXPIRY_MS);
|
|
48
48
|
await db.insert(schema.customerVerificationTokens).values({
|
|
49
|
-
tenantId,
|
|
50
49
|
customerId,
|
|
51
50
|
token,
|
|
52
51
|
expires,
|
|
@@ -72,7 +71,7 @@ export async function createVerificationToken(customerId) {
|
|
|
72
71
|
*/
|
|
73
72
|
export async function verifyEmail(token) {
|
|
74
73
|
const db = getDb();
|
|
75
|
-
// Find the token
|
|
74
|
+
// Find the token
|
|
76
75
|
const [tokenRecord] = await db
|
|
77
76
|
.select()
|
|
78
77
|
.from(schema.customerVerificationTokens)
|
|
@@ -120,10 +119,9 @@ export async function verifyEmail(token) {
|
|
|
120
119
|
*/
|
|
121
120
|
export async function deleteVerificationTokens(customerId) {
|
|
122
121
|
const db = getDb();
|
|
123
|
-
const tenantId = getTenantId();
|
|
124
122
|
await db
|
|
125
123
|
.delete(schema.customerVerificationTokens)
|
|
126
|
-
.where(
|
|
124
|
+
.where(eq(schema.customerVerificationTokens.customerId, customerId));
|
|
127
125
|
}
|
|
128
126
|
/**
|
|
129
127
|
* Resend verification email to a customer.
|
|
@@ -177,11 +175,10 @@ export async function resendVerificationEmail(email) {
|
|
|
177
175
|
*/
|
|
178
176
|
export async function isEmailVerified(customerId) {
|
|
179
177
|
const db = getDb();
|
|
180
|
-
const tenantId = getTenantId();
|
|
181
178
|
const [customer] = await db
|
|
182
179
|
.select({ emailVerified: schema.customers.emailVerified })
|
|
183
180
|
.from(schema.customers)
|
|
184
|
-
.where(
|
|
181
|
+
.where(eq(schema.customers.id, customerId))
|
|
185
182
|
.limit(1);
|
|
186
183
|
return !!customer?.emailVerified;
|
|
187
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-service.js","sourceRoot":"","sources":["../../../src/auth/server/verification-service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"verification-service.js","sourceRoot":"","sources":["../../../src/auth/server/verification-service.ts"],"names":[],"mappings":"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"}
|
package/dist/core/db/client.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @rovela/sdk/core/db/client
|
|
3
3
|
*
|
|
4
4
|
* Neon serverless database client with Drizzle ORM
|
|
5
|
-
*
|
|
5
|
+
* Each store has its own database (via Neon branches) - no tenant isolation needed
|
|
6
6
|
*/
|
|
7
7
|
import { NeonQueryFunction } from '@neondatabase/serverless';
|
|
8
8
|
import { NeonHttpDatabase } from 'drizzle-orm/neon-http';
|
|
@@ -24,47 +24,6 @@ export declare function getDb(): NeonHttpDatabase<typeof schema>;
|
|
|
24
24
|
* Note: This is a lazy-loaded proxy to avoid connection at import time
|
|
25
25
|
*/
|
|
26
26
|
export declare const db: NeonHttpDatabase<typeof schema>;
|
|
27
|
-
/**
|
|
28
|
-
* Set the current tenant ID for the request
|
|
29
|
-
* All queries using withTenant() will be scoped to this tenant
|
|
30
|
-
*/
|
|
31
|
-
export declare function setTenantId(tenantId: string): void;
|
|
32
|
-
/**
|
|
33
|
-
* Get the current tenant ID
|
|
34
|
-
* Auto-initializes from TENANT_ID environment variable if not already set.
|
|
35
|
-
* @throws Error if tenant ID is not set and TENANT_ID env var is missing
|
|
36
|
-
*/
|
|
37
|
-
export declare function getTenantId(): string;
|
|
38
|
-
/**
|
|
39
|
-
* Clear the tenant context (call at end of request)
|
|
40
|
-
*/
|
|
41
|
-
export declare function clearTenantId(): void;
|
|
42
|
-
/**
|
|
43
|
-
* Initialize tenant from environment variable
|
|
44
|
-
* Useful for single-tenant deployments
|
|
45
|
-
*/
|
|
46
|
-
export declare function initTenantFromEnv(): void;
|
|
47
|
-
/**
|
|
48
|
-
* Execute a function with a specific tenant context
|
|
49
|
-
* Sets tenant at both application and database level (for RLS)
|
|
50
|
-
* Automatically clears tenant after execution
|
|
51
|
-
*
|
|
52
|
-
* @example
|
|
53
|
-
* const products = await withTenant(tenantId, async () => {
|
|
54
|
-
* return db.query.products.findMany()
|
|
55
|
-
* })
|
|
56
|
-
*/
|
|
57
|
-
export declare function withTenant<T>(tenantId: string, fn: () => Promise<T>): Promise<T>;
|
|
58
|
-
/**
|
|
59
|
-
* Execute raw SQL with tenant context for RLS
|
|
60
|
-
* Wraps query in a transaction with tenant set
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* const result = await withTenantSql(tenantId, async (sql) => {
|
|
64
|
-
* return sql`SELECT * FROM products WHERE status = 'active'`
|
|
65
|
-
* })
|
|
66
|
-
*/
|
|
67
|
-
export declare function withTenantSql<T>(tenantId: string, fn: (sql: NeonQueryFunction<false, false>) => Promise<T>): Promise<T>;
|
|
68
27
|
/**
|
|
69
28
|
* Check database connection health
|
|
70
29
|
* Returns true if connection is successful
|
|
@@ -75,7 +34,6 @@ export declare function checkConnection(): Promise<boolean>;
|
|
|
75
34
|
*/
|
|
76
35
|
export declare function getConnectionInfo(): {
|
|
77
36
|
hasUrl: boolean;
|
|
78
|
-
|
|
79
|
-
tenantId: string | null;
|
|
37
|
+
isConnected: boolean;
|
|
80
38
|
};
|
|
81
39
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAW,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAyBlC;;;GAGG;AACH,wBAAgB,MAAM,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAKxD;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,gBAAgB,CAAC,OAAO,MAAM,CAAC,CAMvD;AAED;;;;;GAKG;AACH,eAAO,MAAM,EAAE,iCAMb,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAW,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAyBlC;;;GAGG;AACH,wBAAgB,MAAM,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAKxD;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,gBAAgB,CAAC,OAAO,MAAM,CAAC,CAMvD;AAED;;;;;GAKG;AACH,eAAO,MAAM,EAAE,iCAMb,CAAA;AAMF;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAQxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;CACrB,CAKA"}
|
package/dist/core/db/client.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @rovela/sdk/core/db/client
|
|
3
3
|
*
|
|
4
4
|
* Neon serverless database client with Drizzle ORM
|
|
5
|
-
*
|
|
5
|
+
* Each store has its own database (via Neon branches) - no tenant isolation needed
|
|
6
6
|
*/
|
|
7
7
|
import { neon } from '@neondatabase/serverless';
|
|
8
8
|
import { drizzle } from 'drizzle-orm/neon-http';
|
|
@@ -59,109 +59,6 @@ export const db = new Proxy({}, {
|
|
|
59
59
|
},
|
|
60
60
|
});
|
|
61
61
|
// =============================================================================
|
|
62
|
-
// Tenant Context
|
|
63
|
-
// =============================================================================
|
|
64
|
-
/**
|
|
65
|
-
* Tenant context for multi-tenant isolation
|
|
66
|
-
* Set this at the start of each request to ensure queries are scoped
|
|
67
|
-
*/
|
|
68
|
-
let currentTenantId = null;
|
|
69
|
-
/**
|
|
70
|
-
* Set the current tenant ID for the request
|
|
71
|
-
* All queries using withTenant() will be scoped to this tenant
|
|
72
|
-
*/
|
|
73
|
-
export function setTenantId(tenantId) {
|
|
74
|
-
currentTenantId = tenantId;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Get the current tenant ID
|
|
78
|
-
* Auto-initializes from TENANT_ID environment variable if not already set.
|
|
79
|
-
* @throws Error if tenant ID is not set and TENANT_ID env var is missing
|
|
80
|
-
*/
|
|
81
|
-
export function getTenantId() {
|
|
82
|
-
if (!currentTenantId) {
|
|
83
|
-
// Auto-initialize from environment variable (lazy initialization)
|
|
84
|
-
const envTenantId = process.env.TENANT_ID;
|
|
85
|
-
if (envTenantId) {
|
|
86
|
-
currentTenantId = envTenantId;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
throw new Error('Tenant ID not set. Please set TENANT_ID environment variable.');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return currentTenantId;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Clear the tenant context (call at end of request)
|
|
96
|
-
*/
|
|
97
|
-
export function clearTenantId() {
|
|
98
|
-
currentTenantId = null;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Initialize tenant from environment variable
|
|
102
|
-
* Useful for single-tenant deployments
|
|
103
|
-
*/
|
|
104
|
-
export function initTenantFromEnv() {
|
|
105
|
-
const envTenantId = process.env.TENANT_ID;
|
|
106
|
-
if (envTenantId) {
|
|
107
|
-
setTenantId(envTenantId);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// =============================================================================
|
|
111
|
-
// Request Scoped Tenant (for middleware)
|
|
112
|
-
// =============================================================================
|
|
113
|
-
/**
|
|
114
|
-
* Set tenant ID at the database session level for RLS policies
|
|
115
|
-
* This must be called within a transaction for Neon HTTP driver
|
|
116
|
-
*/
|
|
117
|
-
async function setDbTenantId(tenantId) {
|
|
118
|
-
const sql = getSql();
|
|
119
|
-
await sql `SELECT set_config('app.tenant_id', ${tenantId}, true)`;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Execute a function with a specific tenant context
|
|
123
|
-
* Sets tenant at both application and database level (for RLS)
|
|
124
|
-
* Automatically clears tenant after execution
|
|
125
|
-
*
|
|
126
|
-
* @example
|
|
127
|
-
* const products = await withTenant(tenantId, async () => {
|
|
128
|
-
* return db.query.products.findMany()
|
|
129
|
-
* })
|
|
130
|
-
*/
|
|
131
|
-
export async function withTenant(tenantId, fn) {
|
|
132
|
-
const previousTenantId = currentTenantId;
|
|
133
|
-
try {
|
|
134
|
-
// Set at application level
|
|
135
|
-
setTenantId(tenantId);
|
|
136
|
-
// Set at database level for RLS
|
|
137
|
-
await setDbTenantId(tenantId);
|
|
138
|
-
return await fn();
|
|
139
|
-
}
|
|
140
|
-
finally {
|
|
141
|
-
if (previousTenantId) {
|
|
142
|
-
setTenantId(previousTenantId);
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
clearTenantId();
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Execute raw SQL with tenant context for RLS
|
|
151
|
-
* Wraps query in a transaction with tenant set
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* const result = await withTenantSql(tenantId, async (sql) => {
|
|
155
|
-
* return sql`SELECT * FROM products WHERE status = 'active'`
|
|
156
|
-
* })
|
|
157
|
-
*/
|
|
158
|
-
export async function withTenantSql(tenantId, fn) {
|
|
159
|
-
const sql = getSql();
|
|
160
|
-
// Set tenant for this connection
|
|
161
|
-
await sql `SELECT set_config('app.tenant_id', ${tenantId}, false)`;
|
|
162
|
-
return await fn(sql);
|
|
163
|
-
}
|
|
164
|
-
// =============================================================================
|
|
165
62
|
// Connection Health
|
|
166
63
|
// =============================================================================
|
|
167
64
|
/**
|
|
@@ -184,8 +81,7 @@ export async function checkConnection() {
|
|
|
184
81
|
export function getConnectionInfo() {
|
|
185
82
|
return {
|
|
186
83
|
hasUrl: !!process.env.DATABASE_URL,
|
|
187
|
-
|
|
188
|
-
tenantId: currentTenantId,
|
|
84
|
+
isConnected: _db !== null,
|
|
189
85
|
};
|
|
190
86
|
}
|
|
191
87
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAqB,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAElC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,oCAAoC;AACpC,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gDAAgD;YAC9C,wDAAwD,CAC3D,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,IAAI,IAAI,GAA2C,IAAI,CAAA;AACvD,IAAI,GAAG,GAA2C,IAAI,CAAA;AAEtD;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;QACpB,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,EAAqC,EAAE;IACjE,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAA;QACxB,8DAA8D;QAC9D,OAAQ,QAAgB,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;CACF,CAAC,CAAA;AAEF,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAqB,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAElC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,oCAAoC;AACpC,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gDAAgD;YAC9C,wDAAwD,CAC3D,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,IAAI,IAAI,GAA2C,IAAI,CAAA;AACvD,IAAI,GAAG,GAA2C,IAAI,CAAA;AAEtD;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;QACpB,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,EAAqC,EAAE;IACjE,GAAG,CAAC,OAAO,EAAE,IAAI;QACf,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAA;QACxB,8DAA8D;QAC9D,OAAQ,QAAgB,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;CACF,CAAC,CAAA;AAEF,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;QACpB,MAAM,GAAG,CAAA,UAAU,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAI/B,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;QAClC,WAAW,EAAE,GAAG,KAAK,IAAI;KAC1B,CAAA;AACH,CAAC"}
|
package/dist/core/db/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Database module exports
|
|
5
5
|
*/
|
|
6
|
-
export { db, getDb, getSql,
|
|
6
|
+
export { db, getDb, getSql, checkConnection, getConnectionInfo, } from './client';
|
|
7
7
|
export * as schema from './schema';
|
|
8
8
|
export type { Product, NewProduct, ProductVariant, NewProductVariant, Category, NewCategory, Order, NewOrder, OrderItem, NewOrderItem, Customer, NewCustomer, StoreAdmin, NewStoreAdmin, StoreSettings, NewStoreSettings, } from './schema';
|
|
9
9
|
export { findProducts, findProductBySlug, findProductById, findProductVariants, countProducts, createProduct, updateProduct, deleteProduct, hardDeleteProduct, createProductVariant, updateProductVariant, deleteProductVariant, updateVariantInventory, findVariantById, findCategories, findCategoryBySlug, findCategoryById, countCategories, createCategory, updateCategory, deleteCategory, findOrders, findOrderById, findOrderItems, findOrderByPaymentIntent, countOrders, getRevenueByPeriod, getOrdersByStatus, createOrder, createOrderItems, updateOrderStatus, findCustomerByEmail, findCustomerById, findCustomers, countCustomers, findCustomerOrders, findAdminByEmail, getStoreStats, getLowStockProducts, getRecentOrders, findSettings, upsertSettings, } from './queries';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/db/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,EAAE,EACF,KAAK,EACL,MAAM,EACN,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/db/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,EAAE,EACF,KAAK,EACL,MAAM,EACN,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAA;AAGjB,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAGlC,YAAY,EACV,OAAO,EACP,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,UAAU,CAAA;AAGjB,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,aAAa,EAEb,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EAEjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EAEf,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAEf,cAAc,EACd,cAAc,EACd,cAAc,EAEd,UAAU,EACV,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EAEjB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,kBAAkB,EAElB,gBAAgB,EAEhB,aAAa,EACb,mBAAmB,EACnB,eAAe,EAEf,YAAY,EACZ,cAAc,GACf,MAAM,WAAW,CAAA;AAElB,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA"}
|