@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
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,OAAO,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACpD,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;AAMzC;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/emails/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAS1C;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAgBlC;AAMD;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKpD;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/emails/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAS1C;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAgBlC;AAMD;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAKpD;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAapD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAa3D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBvD"}
|
package/dist/emails/config.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* support email at runtime via the settings page.
|
|
9
9
|
*/
|
|
10
10
|
import { Resend } from 'resend';
|
|
11
|
-
import { findSettings
|
|
11
|
+
import { findSettings } from '../core/db';
|
|
12
12
|
// =============================================================================
|
|
13
13
|
// Resend Client
|
|
14
14
|
// =============================================================================
|
|
@@ -56,18 +56,15 @@ export async function getFromEmail() {
|
|
|
56
56
|
* @returns Store name
|
|
57
57
|
*/
|
|
58
58
|
export async function getStoreName() {
|
|
59
|
-
// Try database first (
|
|
59
|
+
// Try database first (each store has its own database)
|
|
60
60
|
try {
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
if (settings?.storeName) {
|
|
65
|
-
return settings.storeName;
|
|
66
|
-
}
|
|
61
|
+
const settings = await findSettings();
|
|
62
|
+
if (settings?.storeName) {
|
|
63
|
+
return settings.storeName;
|
|
67
64
|
}
|
|
68
65
|
}
|
|
69
66
|
catch {
|
|
70
|
-
//
|
|
67
|
+
// DB not available or error - fall through to env var
|
|
71
68
|
}
|
|
72
69
|
// Fall back to environment variable
|
|
73
70
|
return process.env.STORE_NAME || 'Our Store';
|
|
@@ -107,18 +104,15 @@ export async function getEmailConfig() {
|
|
|
107
104
|
* @returns Support email address
|
|
108
105
|
*/
|
|
109
106
|
export async function getSupportEmail() {
|
|
110
|
-
// Try database first (
|
|
107
|
+
// Try database first (each store has its own database)
|
|
111
108
|
try {
|
|
112
|
-
const
|
|
113
|
-
if (
|
|
114
|
-
|
|
115
|
-
if (settings?.storeEmail) {
|
|
116
|
-
return settings.storeEmail;
|
|
117
|
-
}
|
|
109
|
+
const settings = await findSettings();
|
|
110
|
+
if (settings?.storeEmail) {
|
|
111
|
+
return settings.storeEmail;
|
|
118
112
|
}
|
|
119
113
|
}
|
|
120
114
|
catch {
|
|
121
|
-
//
|
|
115
|
+
// DB not available or error - fall through to env var
|
|
122
116
|
}
|
|
123
117
|
// Fall back to environment variables
|
|
124
118
|
return (process.env.SUPPORT_EMAIL ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/emails/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/emails/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,IAAI,YAAY,GAAkB,IAAI,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,kDAAkD;gBAChD,iDAAiD;gBACjD,uBAAuB,CAC1B,CAAA;QACH,CAAC;QAED,YAAY,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,gFAAgF;AAChF,wEAAwE;AACxE,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,qBAAqB,CAAA;IACpE,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAA;IAEtC,OAAO,GAAG,SAAS,KAAK,KAAK,GAAG,CAAA;AAClC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,uDAAuD;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;QACrC,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC,SAAS,CAAA;QAC3B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IAED,oCAAoC;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAA;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,YAAY,EAAE;QACd,eAAe,EAAE;KAClB,CAAC,CAAA;IAEF,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACzC,SAAS;QACT,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;QAC7C,YAAY;QACZ,OAAO,EAAE,WAAW,EAAE;KACvB,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,uDAAuD;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;QACrC,IAAI,QAAQ,EAAE,UAAU,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC,UAAU,CAAA;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IAED,qCAAqC;IACrC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,aAAa;QACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,qBAAqB,CACtB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/api/delete
|
|
3
|
+
*
|
|
4
|
+
* API route handler for deleting files from R2 storage.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/media/route.ts
|
|
9
|
+
* export { DELETE } from '@rovela-ai/sdk/media/api/delete'
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
13
|
+
import type { DeleteApiResponse, MediaApiError } from '../types';
|
|
14
|
+
/**
|
|
15
|
+
* DELETE /api/media
|
|
16
|
+
*
|
|
17
|
+
* Delete one or more files from R2 storage.
|
|
18
|
+
*
|
|
19
|
+
* Request Body (single file):
|
|
20
|
+
* {
|
|
21
|
+
* url: string // Public URL of the file to delete
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* Request Body (multiple files):
|
|
25
|
+
* {
|
|
26
|
+
* urls: string[] // Array of public URLs to delete
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* Response (single):
|
|
30
|
+
* {
|
|
31
|
+
* success: boolean,
|
|
32
|
+
* error?: string
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* Response (multiple):
|
|
36
|
+
* {
|
|
37
|
+
* success: boolean,
|
|
38
|
+
* succeeded?: string[],
|
|
39
|
+
* failed?: string[],
|
|
40
|
+
* error?: string
|
|
41
|
+
* }
|
|
42
|
+
*/
|
|
43
|
+
export declare function DELETE(request: NextRequest): Promise<NextResponse<DeleteApiResponse | MediaApiError>>;
|
|
44
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/media/api/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAKvD,OAAO,KAAK,EAAoB,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAuDlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,iBAAiB,GAAG,aAAa,CAAC,CAAC,CAqE1D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/api/delete
|
|
3
|
+
*
|
|
4
|
+
* API route handler for deleting files from R2 storage.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/media/route.ts
|
|
9
|
+
* export { DELETE } from '@rovela-ai/sdk/media/api/delete'
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { NextResponse } from 'next/server';
|
|
13
|
+
import { getServerSession } from 'next-auth';
|
|
14
|
+
import { createAuthOptions } from '../../auth/config';
|
|
15
|
+
import { deleteFile, deleteFiles } from '../server/delete';
|
|
16
|
+
import { isMediaConfigured } from '../config';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Auth Helper
|
|
19
|
+
// =============================================================================
|
|
20
|
+
async function requireAdmin() {
|
|
21
|
+
const session = await getServerSession(createAuthOptions());
|
|
22
|
+
const user = session?.user;
|
|
23
|
+
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
24
|
+
return NextResponse.json({ success: false, error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Validation
|
|
30
|
+
// =============================================================================
|
|
31
|
+
function validateRequest(body) {
|
|
32
|
+
if (!body || typeof body !== 'object') {
|
|
33
|
+
return { valid: false, error: 'Request body is required' };
|
|
34
|
+
}
|
|
35
|
+
const req = body;
|
|
36
|
+
// Check for single URL
|
|
37
|
+
if (req.url && typeof req.url === 'string') {
|
|
38
|
+
return { valid: true, url: req.url };
|
|
39
|
+
}
|
|
40
|
+
// Check for multiple URLs
|
|
41
|
+
if (req.urls && Array.isArray(req.urls)) {
|
|
42
|
+
const urls = req.urls.filter((u) => typeof u === 'string');
|
|
43
|
+
if (urls.length === 0) {
|
|
44
|
+
return { valid: false, error: 'urls array must contain at least one valid URL' };
|
|
45
|
+
}
|
|
46
|
+
return { valid: true, urls };
|
|
47
|
+
}
|
|
48
|
+
return { valid: false, error: 'url (string) or urls (string[]) is required' };
|
|
49
|
+
}
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// DELETE Handler
|
|
52
|
+
// =============================================================================
|
|
53
|
+
/**
|
|
54
|
+
* DELETE /api/media
|
|
55
|
+
*
|
|
56
|
+
* Delete one or more files from R2 storage.
|
|
57
|
+
*
|
|
58
|
+
* Request Body (single file):
|
|
59
|
+
* {
|
|
60
|
+
* url: string // Public URL of the file to delete
|
|
61
|
+
* }
|
|
62
|
+
*
|
|
63
|
+
* Request Body (multiple files):
|
|
64
|
+
* {
|
|
65
|
+
* urls: string[] // Array of public URLs to delete
|
|
66
|
+
* }
|
|
67
|
+
*
|
|
68
|
+
* Response (single):
|
|
69
|
+
* {
|
|
70
|
+
* success: boolean,
|
|
71
|
+
* error?: string
|
|
72
|
+
* }
|
|
73
|
+
*
|
|
74
|
+
* Response (multiple):
|
|
75
|
+
* {
|
|
76
|
+
* success: boolean,
|
|
77
|
+
* succeeded?: string[],
|
|
78
|
+
* failed?: string[],
|
|
79
|
+
* error?: string
|
|
80
|
+
* }
|
|
81
|
+
*/
|
|
82
|
+
export async function DELETE(request) {
|
|
83
|
+
// Check admin auth
|
|
84
|
+
const authError = await requireAdmin();
|
|
85
|
+
if (authError)
|
|
86
|
+
return authError;
|
|
87
|
+
// Check if media is configured
|
|
88
|
+
if (!isMediaConfigured()) {
|
|
89
|
+
return NextResponse.json({
|
|
90
|
+
success: false,
|
|
91
|
+
error: 'Media storage not configured',
|
|
92
|
+
code: 'NOT_CONFIGURED',
|
|
93
|
+
}, { status: 503 });
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
// Parse request body
|
|
97
|
+
const body = await request.json();
|
|
98
|
+
// Validate request
|
|
99
|
+
const validation = validateRequest(body);
|
|
100
|
+
if (!validation.valid) {
|
|
101
|
+
return NextResponse.json({ success: false, error: validation.error || 'Invalid request' }, { status: 400 });
|
|
102
|
+
}
|
|
103
|
+
// Handle single file deletion
|
|
104
|
+
if (validation.url) {
|
|
105
|
+
try {
|
|
106
|
+
await deleteFile(validation.url);
|
|
107
|
+
return NextResponse.json({ success: true });
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const message = error instanceof Error ? error.message : 'Failed to delete file';
|
|
111
|
+
return NextResponse.json({ success: false, error: message }, { status: 400 });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Handle multiple file deletion
|
|
115
|
+
if (validation.urls) {
|
|
116
|
+
const result = await deleteFiles(validation.urls);
|
|
117
|
+
return NextResponse.json({
|
|
118
|
+
success: result.failed.length === 0,
|
|
119
|
+
succeeded: result.succeeded,
|
|
120
|
+
failed: result.failed,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return NextResponse.json({ success: false, error: 'No files specified' }, { status: 400 });
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('[Media API] Delete error:', error);
|
|
127
|
+
return NextResponse.json({
|
|
128
|
+
success: false,
|
|
129
|
+
error: 'Failed to delete file(s)',
|
|
130
|
+
code: 'DELETE_FAILED',
|
|
131
|
+
}, { status: 500 });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/media/api/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/api
|
|
3
|
+
*
|
|
4
|
+
* API route handlers for media operations.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/media/presign/route.ts
|
|
9
|
+
* export { POST } from '@rovela-ai/sdk/media/api'
|
|
10
|
+
*
|
|
11
|
+
* // app/api/media/route.ts
|
|
12
|
+
* export { DELETE } from '@rovela-ai/sdk/media/api'
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { POST } from './presign';
|
|
16
|
+
export { DELETE } from './delete';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/media/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/api
|
|
3
|
+
*
|
|
4
|
+
* API route handlers for media operations.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/media/presign/route.ts
|
|
9
|
+
* export { POST } from '@rovela-ai/sdk/media/api'
|
|
10
|
+
*
|
|
11
|
+
* // app/api/media/route.ts
|
|
12
|
+
* export { DELETE } from '@rovela-ai/sdk/media/api'
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { POST } from './presign';
|
|
16
|
+
export { DELETE } from './delete';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/media/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/api/presign
|
|
3
|
+
*
|
|
4
|
+
* API route handler for generating presigned upload URLs.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/media/presign/route.ts
|
|
9
|
+
* export { POST } from '@rovela-ai/sdk/media/api/presign'
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
13
|
+
import type { PresignApiResponse, MediaApiError } from '../types';
|
|
14
|
+
/**
|
|
15
|
+
* POST /api/media/presign
|
|
16
|
+
*
|
|
17
|
+
* Generate a presigned URL for uploading a file to R2.
|
|
18
|
+
*
|
|
19
|
+
* Request Body:
|
|
20
|
+
* {
|
|
21
|
+
* filename: string, // Original filename (for extension)
|
|
22
|
+
* contentType: string, // MIME type (must be allowed type)
|
|
23
|
+
* folder: 'products' | 'categories' | 'variants' | 'general',
|
|
24
|
+
* entityId?: string // Optional entity ID for organization
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* Response:
|
|
28
|
+
* {
|
|
29
|
+
* success: true,
|
|
30
|
+
* data: {
|
|
31
|
+
* uploadUrl: string, // Presigned PUT URL (expires in 5 min)
|
|
32
|
+
* publicUrl: string, // Final accessible URL after upload
|
|
33
|
+
* key: string, // Storage key
|
|
34
|
+
* expiresAt: string // ISO date when URL expires
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
*/
|
|
38
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<PresignApiResponse | MediaApiError>>;
|
|
39
|
+
//# sourceMappingURL=presign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presign.d.ts","sourceRoot":"","sources":["../../../src/media/api/presign.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAMvD,OAAO,KAAK,EAEV,kBAAkB,EAClB,aAAa,EAEd,MAAM,UAAU,CAAA;AAkFjB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,kBAAkB,GAAG,aAAa,CAAC,CAAC,CAgD3D"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/api/presign
|
|
3
|
+
*
|
|
4
|
+
* API route handler for generating presigned upload URLs.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // app/api/media/presign/route.ts
|
|
9
|
+
* export { POST } from '@rovela-ai/sdk/media/api/presign'
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { NextResponse } from 'next/server';
|
|
13
|
+
import { getServerSession } from 'next-auth';
|
|
14
|
+
import { createAuthOptions } from '../../auth/config';
|
|
15
|
+
import { generatePresignedUrl } from '../server/presign';
|
|
16
|
+
import { isMediaConfigured, getUploadConfig } from '../config';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Auth Helper
|
|
19
|
+
// =============================================================================
|
|
20
|
+
async function requireAdmin() {
|
|
21
|
+
const session = await getServerSession(createAuthOptions());
|
|
22
|
+
const user = session?.user;
|
|
23
|
+
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
24
|
+
return NextResponse.json({ success: false, error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Validation
|
|
30
|
+
// =============================================================================
|
|
31
|
+
const VALID_FOLDERS = ['products', 'categories', 'variants', 'general'];
|
|
32
|
+
function validateRequest(body) {
|
|
33
|
+
if (!body || typeof body !== 'object') {
|
|
34
|
+
return { valid: false, error: 'Request body is required' };
|
|
35
|
+
}
|
|
36
|
+
const req = body;
|
|
37
|
+
// Validate filename
|
|
38
|
+
if (!req.filename || typeof req.filename !== 'string') {
|
|
39
|
+
return { valid: false, error: 'filename is required' };
|
|
40
|
+
}
|
|
41
|
+
// Validate contentType
|
|
42
|
+
if (!req.contentType || typeof req.contentType !== 'string') {
|
|
43
|
+
return { valid: false, error: 'contentType is required' };
|
|
44
|
+
}
|
|
45
|
+
// Validate folder
|
|
46
|
+
if (!req.folder || typeof req.folder !== 'string') {
|
|
47
|
+
return { valid: false, error: 'folder is required' };
|
|
48
|
+
}
|
|
49
|
+
if (!VALID_FOLDERS.includes(req.folder)) {
|
|
50
|
+
return { valid: false, error: `folder must be one of: ${VALID_FOLDERS.join(', ')}` };
|
|
51
|
+
}
|
|
52
|
+
// Validate entityId (optional)
|
|
53
|
+
if (req.entityId !== undefined && typeof req.entityId !== 'string') {
|
|
54
|
+
return { valid: false, error: 'entityId must be a string' };
|
|
55
|
+
}
|
|
56
|
+
// Validate content type against allowed types
|
|
57
|
+
const uploadConfig = getUploadConfig();
|
|
58
|
+
if (!uploadConfig.allowedTypes.includes(req.contentType)) {
|
|
59
|
+
return {
|
|
60
|
+
valid: false,
|
|
61
|
+
error: `Content type ${req.contentType} is not allowed. Allowed: ${uploadConfig.allowedTypes.join(', ')}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
valid: true,
|
|
66
|
+
data: {
|
|
67
|
+
filename: req.filename,
|
|
68
|
+
contentType: req.contentType,
|
|
69
|
+
folder: req.folder,
|
|
70
|
+
entityId: req.entityId,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// =============================================================================
|
|
75
|
+
// POST Handler
|
|
76
|
+
// =============================================================================
|
|
77
|
+
/**
|
|
78
|
+
* POST /api/media/presign
|
|
79
|
+
*
|
|
80
|
+
* Generate a presigned URL for uploading a file to R2.
|
|
81
|
+
*
|
|
82
|
+
* Request Body:
|
|
83
|
+
* {
|
|
84
|
+
* filename: string, // Original filename (for extension)
|
|
85
|
+
* contentType: string, // MIME type (must be allowed type)
|
|
86
|
+
* folder: 'products' | 'categories' | 'variants' | 'general',
|
|
87
|
+
* entityId?: string // Optional entity ID for organization
|
|
88
|
+
* }
|
|
89
|
+
*
|
|
90
|
+
* Response:
|
|
91
|
+
* {
|
|
92
|
+
* success: true,
|
|
93
|
+
* data: {
|
|
94
|
+
* uploadUrl: string, // Presigned PUT URL (expires in 5 min)
|
|
95
|
+
* publicUrl: string, // Final accessible URL after upload
|
|
96
|
+
* key: string, // Storage key
|
|
97
|
+
* expiresAt: string // ISO date when URL expires
|
|
98
|
+
* }
|
|
99
|
+
* }
|
|
100
|
+
*/
|
|
101
|
+
export async function POST(request) {
|
|
102
|
+
// Check admin auth
|
|
103
|
+
const authError = await requireAdmin();
|
|
104
|
+
if (authError)
|
|
105
|
+
return authError;
|
|
106
|
+
// Check if media is configured
|
|
107
|
+
if (!isMediaConfigured()) {
|
|
108
|
+
return NextResponse.json({
|
|
109
|
+
success: false,
|
|
110
|
+
error: 'Media storage not configured',
|
|
111
|
+
code: 'NOT_CONFIGURED',
|
|
112
|
+
}, { status: 503 });
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
// Parse request body
|
|
116
|
+
const body = await request.json();
|
|
117
|
+
// Validate request
|
|
118
|
+
const validation = validateRequest(body);
|
|
119
|
+
if (!validation.valid || !validation.data) {
|
|
120
|
+
return NextResponse.json({ success: false, error: validation.error || 'Invalid request' }, { status: 400 });
|
|
121
|
+
}
|
|
122
|
+
// Generate presigned URL
|
|
123
|
+
const result = await generatePresignedUrl(validation.data);
|
|
124
|
+
return NextResponse.json({
|
|
125
|
+
success: true,
|
|
126
|
+
data: result,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error('[Media API] Presign error:', error);
|
|
131
|
+
return NextResponse.json({
|
|
132
|
+
success: false,
|
|
133
|
+
error: 'Failed to generate upload URL',
|
|
134
|
+
code: 'PRESIGN_FAILED',
|
|
135
|
+
}, { status: 500 });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=presign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presign.js","sourceRoot":"","sources":["../../../src/media/api/presign.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DropZoneProps } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* DropZone component for drag-and-drop file selection.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* <DropZone
|
|
8
|
+
* onFiles={(files) => handleFiles(files)}
|
|
9
|
+
* multiple
|
|
10
|
+
* accept={['image/jpeg', 'image/png']}
|
|
11
|
+
* >
|
|
12
|
+
* Drop images here
|
|
13
|
+
* </DropZone>
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function DropZone({ onFiles, multiple, accept, maxSize, disabled, className, children, }: DropZoneProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export default DropZone;
|
|
18
|
+
//# sourceMappingURL=DropZone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropZone.d.ts","sourceRoot":"","sources":["../../../src/media/components/DropZone.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAG7C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,QAAgB,EAChB,MAA2C,EAC3C,OAA4C,EAC5C,QAAgB,EAChB,SAAS,EACT,QAAQ,GACT,EAAE,aAAa,2CAqKf;AAwBD,eAAe,QAAQ,CAAA"}
|