@lodashventure/medusa-collection-thumbnail 1.0.1 → 1.0.2
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/.medusa/server/src/admin/index.js +342 -0
- package/.medusa/server/src/admin/index.mjs +343 -0
- package/.medusa/server/src/api/admin/collections/[id]/thumbnail/route.js +211 -0
- package/.medusa/server/{api → src/api}/middlewares.js +1 -1
- package/.medusa/server/src/api/store/collections/[id]/route.js +43 -0
- package/.medusa/server/src/api/store/collections/route.js +71 -0
- package/.medusa/server/src/index.js +15 -0
- package/.medusa/server/{modules → src/modules}/collection/index.js +1 -1
- package/.medusa/server/{modules/collection/migrations/Migration20250921062957.js → src/modules/collection/migrations/Migration20251108000000.js} +4 -4
- package/.medusa/server/{modules → src/modules}/collection/models/collection.js +1 -1
- package/.medusa/server/{modules → src/modules}/collection/service.js +1 -1
- package/.medusa/server/src/services/gcs-direct-upload.js +56 -0
- package/.medusa/server/src/workflows/upload-collection-thumbnail.js +59 -0
- package/README.md +33 -35
- package/package.json +28 -21
- package/.medusa/server/api/admin/collections/[id]/thumbnail/route.d.ts +0 -4
- package/.medusa/server/api/admin/collections/[id]/thumbnail/route.js +0 -101
- package/.medusa/server/api/middlewares.d.ts +0 -2
- package/.medusa/server/api/store/collections/[id]/route.d.ts +0 -2
- package/.medusa/server/api/store/collections/[id]/route.js +0 -46
- package/.medusa/server/api/store/collections/route.d.ts +0 -2
- package/.medusa/server/api/store/collections/route.js +0 -71
- package/.medusa/server/index.d.ts +0 -2
- package/.medusa/server/index.js +0 -8
- package/.medusa/server/links/collection-thumbnail.d.ts +0 -2
- package/.medusa/server/links/collection-thumbnail.js +0 -16
- package/.medusa/server/modules/collection/index.d.ts +0 -21
- package/.medusa/server/modules/collection/migrations/Migration20250921062957.d.ts +0 -5
- package/.medusa/server/modules/collection/models/collection.d.ts +0 -5
- package/.medusa/server/modules/collection/service.d.ts +0 -10
- package/.medusa/server/services/gcs-direct-upload.d.ts +0 -8
- package/.medusa/server/services/gcs-direct-upload.js +0 -55
- package/.medusa/server/workflows/upload-collection-thumbnail.d.ts +0 -13
- package/.medusa/server/workflows/upload-collection-thumbnail.js +0 -57
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodashventure/medusa-collection-thumbnail",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Collection thumbnail management plugin for Medusa v2",
|
|
5
5
|
"author": "Lodashventure",
|
|
6
6
|
"license": "MIT",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
],
|
|
17
17
|
"exports": {
|
|
18
18
|
"./package.json": "./package.json",
|
|
19
|
-
"./workflows": "./.medusa/server/workflows/index.js",
|
|
20
|
-
"./.medusa/server/src/modules/*": "./.medusa/server/modules/*/index.js",
|
|
21
|
-
"./modules/*": "./.medusa/server/modules/*/index.js",
|
|
19
|
+
"./workflows": "./.medusa/server/src/workflows/index.js",
|
|
20
|
+
"./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
|
|
21
|
+
"./modules/*": "./.medusa/server/src/modules/*/index.js",
|
|
22
22
|
"./admin": "./.medusa/server/src/admin/index.mjs",
|
|
23
|
-
"./*": "./.medusa/server/*.js"
|
|
23
|
+
"./*": "./.medusa/server/src/*.js"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
@@ -28,31 +28,38 @@
|
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "medusa plugin:build",
|
|
31
|
-
"dev": "medusa plugin:develop"
|
|
31
|
+
"dev": "medusa plugin:develop",
|
|
32
|
+
"prepublishOnly": "medusa plugin:build"
|
|
32
33
|
},
|
|
33
34
|
"dependencies": {
|
|
34
|
-
"@google-cloud/storage": "^7.17.
|
|
35
|
-
"@medusajs/admin-sdk": "2.11.
|
|
36
|
-
"@medusajs/framework": "2.11.
|
|
37
|
-
"@medusajs/icons": "2.11.
|
|
38
|
-
"@medusajs/ui": "
|
|
35
|
+
"@google-cloud/storage": "^7.17.3",
|
|
36
|
+
"@medusajs/admin-sdk": "2.11.3",
|
|
37
|
+
"@medusajs/framework": "2.11.3",
|
|
38
|
+
"@medusajs/icons": "2.11.3",
|
|
39
|
+
"@medusajs/ui": "^4.0.27",
|
|
40
|
+
"yalc": "1.0.0-pre.53"
|
|
39
41
|
},
|
|
40
42
|
"peerDependencies": {
|
|
41
|
-
"@medusajs/admin-sdk": "2.11.
|
|
42
|
-
"@medusajs/framework": "2.11.
|
|
43
|
-
"@medusajs/icons": "2.11.
|
|
44
|
-
"@medusajs/medusa": "2.11.
|
|
43
|
+
"@medusajs/admin-sdk": "2.11.2",
|
|
44
|
+
"@medusajs/framework": "2.11.2",
|
|
45
|
+
"@medusajs/icons": "2.11.2",
|
|
46
|
+
"@medusajs/medusa": "2.11.2",
|
|
45
47
|
"@medusajs/ui": "*",
|
|
46
48
|
"react": "^18.0.0",
|
|
47
49
|
"react-dom": "^18.0.0"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
|
-
"@medusajs/
|
|
52
|
+
"@medusajs/admin-shared": "2.11.3",
|
|
53
|
+
"@medusajs/cli": "2.11.3",
|
|
54
|
+
"@medusajs/medusa": "2.11.3",
|
|
55
|
+
"@medusajs/types": "2.11.3",
|
|
56
|
+
"@swc/core": "^1.15.0",
|
|
51
57
|
"@types/multer": "^2.0.0",
|
|
52
|
-
"@types/node": "^
|
|
53
|
-
"@types/react": "^
|
|
54
|
-
"@types/react-dom": "^
|
|
58
|
+
"@types/node": "^24.10.0",
|
|
59
|
+
"@types/react": "^19.2.2",
|
|
60
|
+
"@types/react-dom": "^19.2.2",
|
|
55
61
|
"ts-node": "^10.9.2",
|
|
56
|
-
"typescript": "^5.
|
|
62
|
+
"typescript": "^5.9.3",
|
|
63
|
+
"vite": "^7.2.2"
|
|
57
64
|
}
|
|
58
|
-
}
|
|
65
|
+
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http";
|
|
2
|
-
export declare const GET: (req: MedusaRequest, res: MedusaResponse) => Promise<MedusaResponse>;
|
|
3
|
-
export declare const POST: (req: MedusaRequest, res: MedusaResponse) => Promise<MedusaResponse>;
|
|
4
|
-
export declare const DELETE: (req: MedusaRequest, res: MedusaResponse) => Promise<MedusaResponse>;
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DELETE = exports.POST = exports.GET = void 0;
|
|
4
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const upload_collection_thumbnail_1 = require("../../../../../workflows/upload-collection-thumbnail");
|
|
6
|
-
const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
|
|
7
|
-
const GET = async (req, res) => {
|
|
8
|
-
const { id } = req.params;
|
|
9
|
-
const collectionCustomService = req.scope.resolve("collectionCustom");
|
|
10
|
-
try {
|
|
11
|
-
const customData = await collectionCustomService
|
|
12
|
-
.listProductCollectionCustoms({ collection_id: id })
|
|
13
|
-
.then((result) => result[0]);
|
|
14
|
-
return res.json({
|
|
15
|
-
thumbnail: customData?.thumbnail || null,
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
catch (error) {
|
|
19
|
-
console.error("Error fetching thumbnail:", error);
|
|
20
|
-
return res.status(500).json({ error: "Failed to fetch thumbnail" });
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
exports.GET = GET;
|
|
24
|
-
const POST = async (req, res) => {
|
|
25
|
-
const { id } = req.params;
|
|
26
|
-
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
27
|
-
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
28
|
-
try {
|
|
29
|
-
const collection = await productModuleService.retrieveProductCollection(id);
|
|
30
|
-
if (!collection) {
|
|
31
|
-
return res.status(404).json({ error: "Collection not found" });
|
|
32
|
-
}
|
|
33
|
-
const file = req.file;
|
|
34
|
-
if (!file) {
|
|
35
|
-
return res.status(400).json({ error: "No file uploaded" });
|
|
36
|
-
}
|
|
37
|
-
const result = await (0, upload_collection_thumbnail_1.uploadCollectionThumbnailWorkflow)(req.scope).run({
|
|
38
|
-
input: {
|
|
39
|
-
collectionId: id,
|
|
40
|
-
fileData: {
|
|
41
|
-
filename: file.originalname,
|
|
42
|
-
mimeType: file.mimetype,
|
|
43
|
-
content: file.buffer.toString("base64"),
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
return res.json({
|
|
48
|
-
collection: {
|
|
49
|
-
id,
|
|
50
|
-
thumbnail: result.result.thumbnailUrl,
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
logger.error("Error uploading collection thumbnail:", error);
|
|
56
|
-
return res.status(500).json({ error: "Failed to upload thumbnail" });
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
exports.POST = POST;
|
|
60
|
-
const DELETE = async (req, res) => {
|
|
61
|
-
const { id } = req.params;
|
|
62
|
-
const collectionCustomService = req.scope.resolve("collectionCustom");
|
|
63
|
-
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
64
|
-
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
65
|
-
try {
|
|
66
|
-
const existingCustom = await collectionCustomService
|
|
67
|
-
.listProductCollectionCustoms({ collection_id: id })
|
|
68
|
-
.then((result) => result[0]);
|
|
69
|
-
if (!existingCustom || !existingCustom.thumbnail) {
|
|
70
|
-
return res.status(404).json({ error: "No thumbnail found for this collection" });
|
|
71
|
-
}
|
|
72
|
-
// Delete the file from GCS
|
|
73
|
-
if (existingCustom.thumbnail) {
|
|
74
|
-
try {
|
|
75
|
-
const url = existingCustom.thumbnail;
|
|
76
|
-
if (url.includes('storage.googleapis.com')) {
|
|
77
|
-
const parts = url.split('/');
|
|
78
|
-
const bucketIndex = parts.indexOf('sangaroon');
|
|
79
|
-
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
80
|
-
const filename = parts.slice(bucketIndex + 1).join('/');
|
|
81
|
-
await gcsUploadService.deleteFile(filename);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (deleteError) {
|
|
86
|
-
logger.error("Error deleting file from GCS:", deleteError);
|
|
87
|
-
// Continue even if file deletion fails
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
await collectionCustomService.updateProductCollectionCustoms([{ id: existingCustom.id, thumbnail: null }]);
|
|
91
|
-
return res.json({
|
|
92
|
-
message: "Thumbnail deleted successfully",
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
logger.error("Error deleting collection thumbnail:", error);
|
|
97
|
-
return res.status(500).json({ error: "Failed to delete thumbnail" });
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
exports.DELETE = DELETE;
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvbGxlY3Rpb25zL1tpZF0vdGh1bWJuYWlsL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUErRTtBQUUvRSxzR0FBeUc7QUFDekcsaUZBQW1GO0FBRTVFLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQVEsQ0FBQztJQUU3RSxJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLHVCQUF1QjthQUM3Qyw0QkFBNEIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNuRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxJQUFJLElBQUk7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7QUFDSCxDQUFDLENBQUM7QUFuQlcsUUFBQSxHQUFHLE9BbUJkO0FBRUssTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUFrQixFQUNs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
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GET = void 0;
|
|
4
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const GET = async (req, res) => {
|
|
6
|
-
const { id } = req.params;
|
|
7
|
-
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
8
|
-
const collectionCustomService = req.scope.resolve("collectionCustom");
|
|
9
|
-
try {
|
|
10
|
-
// Retrieve the collection from Medusa's default service
|
|
11
|
-
const collection = await productModuleService.retrieveProductCollection(id, {
|
|
12
|
-
relations: ["products"],
|
|
13
|
-
});
|
|
14
|
-
if (!collection) {
|
|
15
|
-
return res.status(404).json({
|
|
16
|
-
error: "Collection not found"
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
// Retrieve custom data (thumbnail) for this collection
|
|
20
|
-
const customData = await collectionCustomService
|
|
21
|
-
.listProductCollectionCustoms({ collection_id: id })
|
|
22
|
-
.then(result => result[0]);
|
|
23
|
-
// Enrich collection with thumbnail
|
|
24
|
-
const enrichedCollection = {
|
|
25
|
-
id: collection.id,
|
|
26
|
-
title: collection.title,
|
|
27
|
-
handle: collection.handle,
|
|
28
|
-
thumbnail: customData?.thumbnail || null,
|
|
29
|
-
created_at: collection.created_at,
|
|
30
|
-
updated_at: collection.updated_at,
|
|
31
|
-
products: collection.products,
|
|
32
|
-
};
|
|
33
|
-
return res.json({
|
|
34
|
-
collection: enrichedCollection,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
console.error("Error fetching collection:", error);
|
|
39
|
-
return res.status(500).json({
|
|
40
|
-
error: "Failed to fetch collection",
|
|
41
|
-
message: error.message
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
exports.GET = GET;
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NvbGxlY3Rpb25zL1tpZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEscURBQW9EO0FBRzdDLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sb0JBQW9CLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNuRSxlQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBQ0YsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBUSxDQUFDO0lBRTdFLElBQUksQ0FBQztRQUNILHdEQUF3RDtRQUN4RCxNQUFNLFVBQVUsR0FBRyxNQUFNLG9CQUFvQixDQUFDLHlCQUF5QixDQUFDLEVBQUUsRUFBRTtZQUMxRSxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDeEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxzQkFBc0I7YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHVEQUF1RDtRQUN2RCxNQUFNLFVBQVUsR0FBRyxNQUFNLHVCQUF1QjthQUM3Qyw0QkFBNEIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU3QixtQ0FBbUM7UUFDbkMsTUFBTSxrQkFBa0IsR0FBRztZQUN6QixFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDakIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQ3ZCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtZQUN6QixTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsSUFBSSxJQUFJO1lBQ3hDLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTtZQUNqQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7WUFDakMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1NBQzlCLENBQUM7UUFFRixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxVQUFVLEVBQUUsa0JBQWtCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFCLEtBQUssRUFBRSw0QkFBNEI7WUFDbkMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDLENBQUM7QUFoRFcsUUFBQSxHQUFHLE9BZ0RkIn0=
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GET = void 0;
|
|
4
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
-
const GET = async (req, res) => {
|
|
6
|
-
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
7
|
-
const collectionCustomService = req.scope.resolve("collectionCustom");
|
|
8
|
-
try {
|
|
9
|
-
// Parse query parameters
|
|
10
|
-
const limit = parseInt(req.query.limit) || 10;
|
|
11
|
-
const offset = parseInt(req.query.offset) || 0;
|
|
12
|
-
const handle = req.query.handle;
|
|
13
|
-
const created_at = req.query.created_at;
|
|
14
|
-
const updated_at = req.query.updated_at;
|
|
15
|
-
// Build filters for collections
|
|
16
|
-
const filters = {};
|
|
17
|
-
if (handle) {
|
|
18
|
-
filters.handle = handle;
|
|
19
|
-
}
|
|
20
|
-
if (created_at) {
|
|
21
|
-
filters.created_at = created_at;
|
|
22
|
-
}
|
|
23
|
-
if (updated_at) {
|
|
24
|
-
filters.updated_at = updated_at;
|
|
25
|
-
}
|
|
26
|
-
// Retrieve collections from Medusa's default service
|
|
27
|
-
const [collections, count] = await productModuleService.listAndCountProductCollections(filters, {
|
|
28
|
-
skip: offset,
|
|
29
|
-
take: limit,
|
|
30
|
-
order: { created_at: "DESC" },
|
|
31
|
-
});
|
|
32
|
-
// Get all collection IDs
|
|
33
|
-
const collectionIds = collections.map(c => c.id);
|
|
34
|
-
// Retrieve custom data (thumbnails) for all collections
|
|
35
|
-
let customDataMap = {};
|
|
36
|
-
if (collectionIds.length > 0) {
|
|
37
|
-
const customData = await collectionCustomService.listProductCollectionCustoms({
|
|
38
|
-
collection_id: collectionIds,
|
|
39
|
-
});
|
|
40
|
-
// Create a map for quick lookup
|
|
41
|
-
customDataMap = customData.reduce((acc, custom) => {
|
|
42
|
-
acc[custom.collection_id] = custom.thumbnail;
|
|
43
|
-
return acc;
|
|
44
|
-
}, {});
|
|
45
|
-
}
|
|
46
|
-
// Enrich collections with thumbnails
|
|
47
|
-
const enrichedCollections = collections.map(collection => ({
|
|
48
|
-
id: collection.id,
|
|
49
|
-
title: collection.title,
|
|
50
|
-
handle: collection.handle,
|
|
51
|
-
thumbnail: customDataMap[collection.id] || null,
|
|
52
|
-
created_at: collection.created_at,
|
|
53
|
-
updated_at: collection.updated_at,
|
|
54
|
-
}));
|
|
55
|
-
return res.json({
|
|
56
|
-
collections: enrichedCollections,
|
|
57
|
-
count,
|
|
58
|
-
offset,
|
|
59
|
-
limit,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
console.error("Error fetching collections:", error);
|
|
64
|
-
return res.status(500).json({
|
|
65
|
-
error: "Failed to fetch collections",
|
|
66
|
-
message: error.message
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
exports.GET = GET;
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2NvbGxlY3Rpb25zL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHFEQUFvRDtBQUc3QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLG9CQUFvQixHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FDbkUsZUFBTyxDQUFDLE9BQU8sQ0FDaEIsQ0FBQztJQUNGLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQVEsQ0FBQztJQUU3RSxJQUFJLENBQUM7UUFDSCx5QkFBeUI7UUFDekIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFnQixDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBaUIsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQWlCLENBQUM7UUFFL0MsZ0NBQWdDO1FBQ2hDLE1BQU0sT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUN4QixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxxREFBcUQ7UUFDckQsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLDhCQUE4QixDQUNwRixPQUFPLEVBQ1A7WUFDRSxJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTtTQUM5QixDQUNGLENBQUM7UUFFRix5QkFBeUI7UUFDekIsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVqRCx3REFBd0Q7UUFDeEQsSUFBSSxhQUFhLEdBQWtDLEVBQUUsQ0FBQztRQUN0RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxVQUFVLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQyw0QkFBNEIsQ0FBQztnQkFDNUUsYUFBYSxFQUFFLGFBQWE7YUFDN0IsQ0FBQyxDQUFDO1lBRUgsZ0NBQWdDO1lBQ2hDLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNoRCxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQzdDLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLEVBQW1DLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQscUNBQXFDO1FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ2pCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztZQUN2QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07WUFDekIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSTtZQUMvQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7WUFDakMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1NBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBRUosT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2QsV0FBVyxFQUFFLG1CQUFtQjtZQUNoQyxLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUs7U0FDTixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLEVBQUUsNkJBQTZCO1lBQ3BDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBL0VXLFFBQUEsR0FBRyxPQStFZCJ9
|
package/.medusa/server/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = collectionThumbnailPlugin;
|
|
4
|
-
async function collectionThumbnailPlugin(container, options) {
|
|
5
|
-
// Plugin initialization logic
|
|
6
|
-
console.log("Collection Thumbnail Plugin loaded");
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSw0Q0FNQztBQU5jLEtBQUssVUFBVSx5QkFBeUIsQ0FDckQsU0FBMEIsRUFDMUIsT0FBZ0M7SUFFaEMsOEJBQThCO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztBQUNwRCxDQUFDIn0=
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
-
const product_1 = __importDefault(require("@medusajs/medusa/product"));
|
|
8
|
-
const collection_1 = __importDefault(require("../modules/collection"));
|
|
9
|
-
exports.default = (0, utils_1.defineLink)({
|
|
10
|
-
linkable: product_1.default.linkable.productCollection,
|
|
11
|
-
deleteCascade: true,
|
|
12
|
-
}, {
|
|
13
|
-
linkable: collection_1.default.linkable.productCollectionCustom,
|
|
14
|
-
deleteCascade: true,
|
|
15
|
-
});
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi10aHVtYm5haWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGlua3MvY29sbGVjdGlvbi10aHVtYm5haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBdUQ7QUFDdkQsdUVBQXFEO0FBQ3JELHVFQUFxRDtBQUVyRCxrQkFBZSxJQUFBLGtCQUFVLEVBQ3ZCO0lBQ0UsUUFBUSxFQUFFLGlCQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQjtJQUNsRCxhQUFhLEVBQUUsSUFBSTtDQUNwQixFQUNEO0lBQ0UsUUFBUSxFQUFFLG9CQUFnQixDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7SUFDM0QsYUFBYSxFQUFFLElBQUk7Q0FDcEIsQ0FDRixDQUFDIn0=
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import CollectionModuleService from "./service";
|
|
2
|
-
export declare const COLLECTION_MODULE = "collectionCustom";
|
|
3
|
-
declare const _default: import("@medusajs/types").ModuleExports<typeof CollectionModuleService> & {
|
|
4
|
-
linkable: {
|
|
5
|
-
readonly productCollectionCustom: {
|
|
6
|
-
id: {
|
|
7
|
-
serviceName: "collectionCustom";
|
|
8
|
-
field: "productCollectionCustom";
|
|
9
|
-
linkable: "product_collection_custom_id";
|
|
10
|
-
primaryKey: "id";
|
|
11
|
-
};
|
|
12
|
-
toJSON: () => {
|
|
13
|
-
serviceName: "collectionCustom";
|
|
14
|
-
field: "productCollectionCustom";
|
|
15
|
-
linkable: "product_collection_custom_id";
|
|
16
|
-
primaryKey: "id";
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
};
|
|
21
|
-
export default _default;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export declare const ProductCollectionCustom: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
|
|
2
|
-
id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
|
|
3
|
-
collection_id: import("@medusajs/framework/utils").TextProperty;
|
|
4
|
-
thumbnail: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
|
|
5
|
-
}>, "product_collection_custom">;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare const CollectionModuleService_base: import("@medusajs/framework/utils").MedusaServiceReturnType<import("@medusajs/framework/utils").ModelConfigurationsToConfigTemplate<{
|
|
2
|
-
readonly ProductCollectionCustom: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
|
|
3
|
-
id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
|
|
4
|
-
collection_id: import("@medusajs/framework/utils").TextProperty;
|
|
5
|
-
thumbnail: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
|
|
6
|
-
}>, "product_collection_custom">;
|
|
7
|
-
}>>;
|
|
8
|
-
export default class CollectionModuleService extends CollectionModuleService_base {
|
|
9
|
-
}
|
|
10
|
-
export {};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GcsDirectUploadService = void 0;
|
|
4
|
-
const storage_1 = require("@google-cloud/storage");
|
|
5
|
-
class GcsDirectUploadService {
|
|
6
|
-
storage;
|
|
7
|
-
bucketName;
|
|
8
|
-
baseUrl;
|
|
9
|
-
constructor() {
|
|
10
|
-
// Initialize GCS client with credentials from env
|
|
11
|
-
this.storage = new storage_1.Storage({
|
|
12
|
-
credentials: {
|
|
13
|
-
client_email: process.env.CLIENT_EMAIL,
|
|
14
|
-
private_key: process.env.PRIVATE_KEY.replace(/\\n/g, '\n'),
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
this.bucketName = process.env.BUCKET_NAME || 'sangaroon';
|
|
18
|
-
this.baseUrl = process.env.GCP_STORAGE_BASE_PUBLIC_URL || 'https://storage.googleapis.com';
|
|
19
|
-
}
|
|
20
|
-
async uploadFile(filename, buffer, mimeType) {
|
|
21
|
-
try {
|
|
22
|
-
const bucket = this.storage.bucket(this.bucketName);
|
|
23
|
-
const file = bucket.file(filename);
|
|
24
|
-
await file.save(buffer, {
|
|
25
|
-
metadata: {
|
|
26
|
-
contentType: mimeType,
|
|
27
|
-
},
|
|
28
|
-
public: true,
|
|
29
|
-
resumable: false,
|
|
30
|
-
});
|
|
31
|
-
// Return the public URL
|
|
32
|
-
return `${this.baseUrl}/${this.bucketName}/${filename}`;
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
console.error('Error uploading to GCS:', error);
|
|
36
|
-
throw new Error(`Failed to upload file to GCS: ${error.message}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
async deleteFile(filename) {
|
|
40
|
-
try {
|
|
41
|
-
const bucket = this.storage.bucket(this.bucketName);
|
|
42
|
-
const file = bucket.file(filename);
|
|
43
|
-
const [exists] = await file.exists();
|
|
44
|
-
if (exists) {
|
|
45
|
-
await file.delete();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
console.error('Error deleting from GCS:', error);
|
|
50
|
-
// Don't throw on delete errors
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
exports.GcsDirectUploadService = GcsDirectUploadService;
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2NzLWRpcmVjdC11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZ2NzLWRpcmVjdC11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBRWhELE1BQWEsc0JBQXNCO0lBQ3pCLE9BQU8sQ0FBVTtJQUNqQixVQUFVLENBQVM7SUFDbkIsT0FBTyxDQUFTO0lBRXhCO1FBQ0Usa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFhO2dCQUN2QyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7YUFDNUQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksZ0NBQWdDLENBQUM7SUFDN0YsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7UUFDakUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsUUFBUSxFQUFFO29CQUNSLFdBQVcsRUFBRSxRQUFRO2lCQUN0QjtnQkFDRCxNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDLENBQUM7WUFFSCx3QkFBd0I7WUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsK0JBQStCO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFyREQsd0RBcURDIn0=
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
interface UploadThumbnailInput {
|
|
2
|
-
collectionId: string;
|
|
3
|
-
fileData: {
|
|
4
|
-
filename: string;
|
|
5
|
-
mimeType: string;
|
|
6
|
-
content: string;
|
|
7
|
-
};
|
|
8
|
-
}
|
|
9
|
-
export declare const uploadCollectionThumbnailWorkflow: import("@medusajs/framework/workflows-sdk").ReturnWorkflow<UploadThumbnailInput, {
|
|
10
|
-
collectionId: string;
|
|
11
|
-
thumbnailUrl: string;
|
|
12
|
-
}, []>;
|
|
13
|
-
export {};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.uploadCollectionThumbnailWorkflow = void 0;
|
|
4
|
-
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
-
const gcs_direct_upload_1 = require("../services/gcs-direct-upload");
|
|
6
|
-
const uploadThumbnailStep = (0, workflows_sdk_1.createStep)("upload-thumbnail-step", async ({ collectionId, fileData }, { container }) => {
|
|
7
|
-
const collectionCustomService = container.resolve("collectionCustom");
|
|
8
|
-
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
9
|
-
// Generate unique filename for direct upload (no UUID folders)
|
|
10
|
-
const timestamp = Date.now();
|
|
11
|
-
const ext = fileData.filename.split('.').pop() || 'jpg';
|
|
12
|
-
const filename = `collections/thumbnail-${collectionId}-${timestamp}.${ext}`;
|
|
13
|
-
// Convert base64 to buffer
|
|
14
|
-
const buffer = Buffer.from(fileData.content, "base64");
|
|
15
|
-
// Upload directly to GCS without UUID folder
|
|
16
|
-
const publicUrl = await gcsUploadService.uploadFile(filename, buffer, fileData.mimeType);
|
|
17
|
-
const existingCustom = await collectionCustomService
|
|
18
|
-
.listProductCollectionCustoms({ collection_id: collectionId })
|
|
19
|
-
.then((result) => result[0]);
|
|
20
|
-
// Delete old thumbnail if it exists
|
|
21
|
-
if (existingCustom?.thumbnail) {
|
|
22
|
-
try {
|
|
23
|
-
// Extract filename from the URL
|
|
24
|
-
const oldUrl = existingCustom.thumbnail;
|
|
25
|
-
if (oldUrl.includes('storage.googleapis.com')) {
|
|
26
|
-
const parts = oldUrl.split('/');
|
|
27
|
-
const bucketIndex = parts.indexOf('sangaroon');
|
|
28
|
-
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
29
|
-
const oldFilename = parts.slice(bucketIndex + 1).join('/');
|
|
30
|
-
await gcsUploadService.deleteFile(oldFilename);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
console.error('Failed to delete old thumbnail:', error);
|
|
36
|
-
// Continue even if deletion fails
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
if (existingCustom) {
|
|
40
|
-
await collectionCustomService.updateProductCollectionCustoms([{ id: existingCustom.id, thumbnail: publicUrl }]);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
await collectionCustomService.createProductCollectionCustoms([{
|
|
44
|
-
collection_id: collectionId,
|
|
45
|
-
thumbnail: publicUrl,
|
|
46
|
-
}]);
|
|
47
|
-
}
|
|
48
|
-
return new workflows_sdk_1.StepResponse({
|
|
49
|
-
collectionId,
|
|
50
|
-
thumbnailUrl: publicUrl,
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
exports.uploadCollectionThumbnailWorkflow = (0, workflows_sdk_1.createWorkflow)("upload-collection-thumbnail", (input) => {
|
|
54
|
-
const result = uploadThumbnailStep(input);
|
|
55
|
-
return new workflows_sdk_1.WorkflowResponse(result);
|
|
56
|
-
});
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWNvbGxlY3Rpb24tdGh1bWJuYWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dvcmtmbG93cy91cGxvYWQtY29sbGVjdGlvbi10aHVtYm5haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBTTJDO0FBQzNDLHFFQUF1RTtBQVd2RSxNQUFNLG1CQUFtQixHQUFHLElBQUEsMEJBQVUsRUFDcEMsdUJBQXVCLEVBQ3ZCLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQXdCLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hFLE1BQU0sdUJBQXVCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBUSxDQUFDO0lBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSwwQ0FBc0IsRUFBRSxDQUFDO0lBRXRELCtEQUErRDtJQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLHlCQUF5QixZQUFZLElBQUksU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdFLDJCQUEyQjtJQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdkQsNkNBQTZDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXpGLE1BQU0sY0FBYyxHQUFHLE1BQU0sdUJBQXVCO1NBQ2pELDRCQUE0QixDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxDQUFDO1NBQzdELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFL0Isb0NBQW9DO0lBQ3BDLElBQUksY0FBYyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILGdDQUFnQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9DLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6RCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNELE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxrQ0FBa0M7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sdUJBQXVCLENBQUMsOEJBQThCLENBQzFELENBQUMsRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2dCQUM1RCxhQUFhLEVBQUUsWUFBWTtnQkFDM0IsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQUM7UUFDdEIsWUFBWTtRQUNaLFlBQVksRUFBRSxTQUFTO0tBQ3hCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FDRixDQUFDO0FBRVcsUUFBQSxpQ0FBaUMsR0FBRyxJQUFBLDhCQUFjLEVBQzdELDZCQUE2QixFQUM3QixDQUFDLEtBQXlDLEVBQUUsRUFBRTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxPQUFPLElBQUksZ0NBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUNGLENBQUMifQ==
|