@lodashventure/medusa-collection-thumbnail 1.1.5 → 1.1.7
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 +2 -177
- package/.medusa/server/src/admin/index.mjs +4 -179
- 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 +32 -34
- package/package.json +16 -16
- package/.medusa/server/api/admin/collections/[id]/thumbnail/route.d.ts +0 -8
- package/.medusa/server/api/admin/collections/[id]/thumbnail/route.js +0 -211
- 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 -59
- package/.medusa/server/workflows/upload-collection-thumbnail.d.ts +0 -13
- package/.medusa/server/workflows/upload-collection-thumbnail.js +0 -59
|
@@ -1,211 +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 collection_1 = require("../../../../../modules/collection");
|
|
6
|
-
const upload_collection_thumbnail_1 = require("../../../../../workflows/upload-collection-thumbnail");
|
|
7
|
-
const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
|
|
8
|
-
const resolveLogger = (req) => {
|
|
9
|
-
try {
|
|
10
|
-
return req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return console;
|
|
14
|
-
}
|
|
15
|
-
};
|
|
16
|
-
const normalizeCustomRecord = (record) => {
|
|
17
|
-
if (!record) {
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
if (Array.isArray(record)) {
|
|
21
|
-
for (const entry of record) {
|
|
22
|
-
const normalized = normalizeCustomRecord(entry);
|
|
23
|
-
if (normalized) {
|
|
24
|
-
return normalized;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
if (typeof record === "object") {
|
|
30
|
-
return record;
|
|
31
|
-
}
|
|
32
|
-
return undefined;
|
|
33
|
-
};
|
|
34
|
-
const GET = async (req, res) => {
|
|
35
|
-
const { id } = req.params;
|
|
36
|
-
const logger = resolveLogger(req);
|
|
37
|
-
try {
|
|
38
|
-
const collectionCustomService = req.scope.resolve(collection_1.COLLECTION_MODULE);
|
|
39
|
-
const customRecords = await collectionCustomService.listProductCollectionCustoms({
|
|
40
|
-
collection_id: id,
|
|
41
|
-
});
|
|
42
|
-
const customData = normalizeCustomRecord(customRecords);
|
|
43
|
-
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
44
|
-
return res.json({
|
|
45
|
-
thumbnail: customData?.thumbnail ?? null,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
const err = error;
|
|
50
|
-
logger.error("Error fetching collection thumbnail:", err);
|
|
51
|
-
if (err?.name === "AwilixResolutionError") {
|
|
52
|
-
return res.status(500).json({
|
|
53
|
-
error: "Collection thumbnail module is not registered",
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return res.status(500).json({ error: "Failed to fetch thumbnail" });
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
exports.GET = GET;
|
|
60
|
-
const POST = async (req, res) => {
|
|
61
|
-
const { id } = req.params;
|
|
62
|
-
const logger = resolveLogger(req);
|
|
63
|
-
try {
|
|
64
|
-
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
65
|
-
const collection = await productModuleService.retrieveProductCollection(id);
|
|
66
|
-
if (!collection) {
|
|
67
|
-
return res.status(404).json({ error: "Collection not found" });
|
|
68
|
-
}
|
|
69
|
-
const payload = prepareFilePayload(req);
|
|
70
|
-
if (!isFilePayloadSuccess(payload)) {
|
|
71
|
-
const failurePayload = payload;
|
|
72
|
-
return res
|
|
73
|
-
.status(failurePayload.status)
|
|
74
|
-
.json({ error: failurePayload.error });
|
|
75
|
-
}
|
|
76
|
-
const { filename, mimeType, base64 } = payload.data;
|
|
77
|
-
const { result: workflowResult } = await (0, upload_collection_thumbnail_1.uploadCollectionThumbnailWorkflow)(req.scope).run({
|
|
78
|
-
input: {
|
|
79
|
-
collectionId: id,
|
|
80
|
-
fileData: {
|
|
81
|
-
filename,
|
|
82
|
-
mimeType,
|
|
83
|
-
content: base64,
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
if (!workflowResult?.thumbnailUrl) {
|
|
88
|
-
throw new Error("Thumbnail URL missing from workflow result");
|
|
89
|
-
}
|
|
90
|
-
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
91
|
-
return res.json({
|
|
92
|
-
collection: {
|
|
93
|
-
id,
|
|
94
|
-
thumbnail: workflowResult.thumbnailUrl,
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
logger.error("Error uploading collection thumbnail:", error);
|
|
100
|
-
return res.status(500).json({ error: "Failed to upload thumbnail" });
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
exports.POST = POST;
|
|
104
|
-
const DELETE = async (req, res) => {
|
|
105
|
-
const { id } = req.params;
|
|
106
|
-
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
107
|
-
const logger = resolveLogger(req);
|
|
108
|
-
try {
|
|
109
|
-
const collectionCustomService = req.scope.resolve(collection_1.COLLECTION_MODULE);
|
|
110
|
-
const customRecords = await collectionCustomService.listProductCollectionCustoms({
|
|
111
|
-
collection_id: id,
|
|
112
|
-
});
|
|
113
|
-
const existingCustom = normalizeCustomRecord(customRecords);
|
|
114
|
-
if (!existingCustom?.thumbnail) {
|
|
115
|
-
return res
|
|
116
|
-
.status(404)
|
|
117
|
-
.json({ error: "No thumbnail found for this collection" });
|
|
118
|
-
}
|
|
119
|
-
// Delete the file from GCS
|
|
120
|
-
try {
|
|
121
|
-
const url = existingCustom.thumbnail;
|
|
122
|
-
const isGcsUrl = url.includes("storage.googleapis.com") ||
|
|
123
|
-
url.includes("storage.cloud.google.com");
|
|
124
|
-
if (isGcsUrl) {
|
|
125
|
-
const parts = url.split("/");
|
|
126
|
-
const bucketIndex = parts.indexOf("sangaroon");
|
|
127
|
-
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
128
|
-
const filename = parts.slice(bucketIndex + 1).join("/");
|
|
129
|
-
await gcsUploadService.deleteFile(filename);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (deleteError) {
|
|
134
|
-
logger.error("Error deleting file from GCS:", deleteError);
|
|
135
|
-
// Continue even if file deletion fails
|
|
136
|
-
}
|
|
137
|
-
await collectionCustomService.updateProductCollectionCustoms([
|
|
138
|
-
{ id: existingCustom.id, thumbnail: null },
|
|
139
|
-
]);
|
|
140
|
-
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
141
|
-
return res.json({
|
|
142
|
-
message: "Thumbnail deleted successfully",
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
const err = error;
|
|
147
|
-
logger.error("Error deleting collection thumbnail:", err);
|
|
148
|
-
if (err?.name === "AwilixResolutionError") {
|
|
149
|
-
return res.status(500).json({
|
|
150
|
-
error: "Collection thumbnail module is not registered",
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
return res.status(500).json({ error: "Failed to delete thumbnail" });
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
exports.DELETE = DELETE;
|
|
157
|
-
const isFilePayloadSuccess = (payload) => payload.success === true;
|
|
158
|
-
const prepareFilePayload = (req) => {
|
|
159
|
-
if (req.file) {
|
|
160
|
-
return {
|
|
161
|
-
success: true,
|
|
162
|
-
data: {
|
|
163
|
-
filename: req.file.originalname,
|
|
164
|
-
mimeType: req.file.mimetype,
|
|
165
|
-
base64: req.file.buffer.toString("base64"),
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
const body = req.body;
|
|
170
|
-
if (!body || typeof body !== "object") {
|
|
171
|
-
return {
|
|
172
|
-
success: false,
|
|
173
|
-
status: 400,
|
|
174
|
-
error: "Invalid payload",
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
const { filename, mimeType, content } = body;
|
|
178
|
-
if (!filename || !mimeType || !content) {
|
|
179
|
-
return {
|
|
180
|
-
success: false,
|
|
181
|
-
status: 400,
|
|
182
|
-
error: "Missing file data",
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
try {
|
|
186
|
-
const buffer = Buffer.from(content, "base64");
|
|
187
|
-
if (!buffer.length) {
|
|
188
|
-
return {
|
|
189
|
-
success: false,
|
|
190
|
-
status: 400,
|
|
191
|
-
error: "Invalid file content",
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
return {
|
|
195
|
-
success: true,
|
|
196
|
-
data: {
|
|
197
|
-
filename,
|
|
198
|
-
mimeType,
|
|
199
|
-
base64: content,
|
|
200
|
-
},
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
catch {
|
|
204
|
-
return {
|
|
205
|
-
success: false,
|
|
206
|
-
status: 400,
|
|
207
|
-
error: "Failed to decode file",
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NvbGxlY3Rpb25zL1tpZF0vdGh1bWJuYWlsL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUErRTtBQUcvRSxrRUFBc0U7QUFDdEUsc0dBQXlHO0FBQ3pHLGlGQUFtRjtBQVVuRixNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQWtCLEVBQWMsRUFBRTtJQUN2RCxJQUFJLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUM1QixNQUFlLEVBQ3lDLEVBQUU7SUFDMUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE9BQU8sTUFBb0QsQ0FBQztJQUM5RCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUssTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUs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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,59 +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.cloud.google.com').replace(/\/+$/, '');
|
|
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
|
-
const sanitizedFilename = filename.replace(/^\/+/, '');
|
|
33
|
-
const baseWithBucket = this.baseUrl.endsWith(`/${this.bucketName}`)
|
|
34
|
-
? this.baseUrl
|
|
35
|
-
: `${this.baseUrl}/${this.bucketName}`;
|
|
36
|
-
return `${baseWithBucket}/${sanitizedFilename}`;
|
|
37
|
-
}
|
|
38
|
-
catch (error) {
|
|
39
|
-
console.error('Error uploading to GCS:', error);
|
|
40
|
-
throw new Error(`Failed to upload file to GCS: ${error.message}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
async deleteFile(filename) {
|
|
44
|
-
try {
|
|
45
|
-
const bucket = this.storage.bucket(this.bucketName);
|
|
46
|
-
const file = bucket.file(filename);
|
|
47
|
-
const [exists] = await file.exists();
|
|
48
|
-
if (exists) {
|
|
49
|
-
await file.delete();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
console.error('Error deleting from GCS:', error);
|
|
54
|
-
// Don't throw on delete errors
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
exports.GcsDirectUploadService = GcsDirectUploadService;
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2NzLWRpcmVjdC11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZ2NzLWRpcmVjdC11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBRWhELE1BQWEsc0JBQXNCO0lBQ3pCLE9BQU8sQ0FBVTtJQUNqQixVQUFVLENBQVM7SUFDbkIsT0FBTyxDQUFTO0lBRXhCO1FBQ0Usa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFhO2dCQUN2QyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7YUFDNUQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxrQ0FBa0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckgsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7UUFDakUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsUUFBUSxFQUFFO29CQUNSLFdBQVcsRUFBRSxRQUFRO2lCQUN0QjtnQkFDRCxNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDLENBQUM7WUFFSCx3QkFBd0I7WUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO2dCQUNkLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sR0FBRyxjQUFjLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsK0JBQStCO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF6REQsd0RBeURDIn0=
|
|
@@ -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,59 +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
|
-
const isGcsUrl = oldUrl.includes("storage.googleapis.com") ||
|
|
26
|
-
oldUrl.includes("storage.cloud.google.com");
|
|
27
|
-
if (isGcsUrl) {
|
|
28
|
-
const parts = oldUrl.split('/');
|
|
29
|
-
const bucketIndex = parts.indexOf('sangaroon');
|
|
30
|
-
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
31
|
-
const oldFilename = parts.slice(bucketIndex + 1).join('/');
|
|
32
|
-
await gcsUploadService.deleteFile(oldFilename);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
console.error('Failed to delete old thumbnail:', error);
|
|
38
|
-
// Continue even if deletion fails
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (existingCustom) {
|
|
42
|
-
await collectionCustomService.updateProductCollectionCustoms([{ id: existingCustom.id, thumbnail: publicUrl }]);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
await collectionCustomService.createProductCollectionCustoms([{
|
|
46
|
-
collection_id: collectionId,
|
|
47
|
-
thumbnail: publicUrl,
|
|
48
|
-
}]);
|
|
49
|
-
}
|
|
50
|
-
return new workflows_sdk_1.StepResponse({
|
|
51
|
-
collectionId,
|
|
52
|
-
thumbnailUrl: publicUrl,
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
exports.uploadCollectionThumbnailWorkflow = (0, workflows_sdk_1.createWorkflow)("upload-collection-thumbnail", (input) => {
|
|
56
|
-
const result = uploadThumbnailStep(input);
|
|
57
|
-
return new workflows_sdk_1.WorkflowResponse(result);
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWNvbGxlY3Rpb24tdGh1bWJuYWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dvcmtmbG93cy91cGxvYWQtY29sbGVjdGlvbi10aHVtYm5haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBTTJDO0FBQzNDLHFFQUF1RTtBQVd2RSxNQUFNLG1CQUFtQixHQUFHLElBQUEsMEJBQVUsRUFDcEMsdUJBQXVCLEVBQ3ZCLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQXdCLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3hFLE1BQU0sdUJBQXVCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBUSxDQUFDO0lBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSwwQ0FBc0IsRUFBRSxDQUFDO0lBRXRELCtEQUErRDtJQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLHlCQUF5QixZQUFZLElBQUksU0FBUyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdFLDJCQUEyQjtJQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdkQsNkNBQTZDO0lBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXpGLE1BQU0sY0FBYyxHQUFHLE1BQU0sdUJBQXVCO1NBQ2pELDRCQUE0QixDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxDQUFDO1NBQzdELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFL0Isb0NBQW9DO0lBQ3BDLElBQUksY0FBYyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILGdDQUFnQztZQUNoQyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQ3hDLE1BQU0sUUFBUSxHQUNaLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUM5QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9DLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6RCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNELE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxrQ0FBa0M7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25CLE1BQU0sdUJBQXVCLENBQUMsOEJBQThCLENBQzFELENBQUMsRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2dCQUM1RCxhQUFhLEVBQUUsWUFBWTtnQkFDM0IsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTyxJQUFJLDRCQUFZLENBQUM7UUFDdEIsWUFBWTtRQUNaLFlBQVksRUFBRSxTQUFTO0tBQ3hCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FDRixDQUFDO0FBRVcsUUFBQSxpQ0FBaUMsR0FBRyxJQUFBLDhCQUFjLEVBQzdELDZCQUE2QixFQUM3QixDQUFDLEtBQXlDLEVBQUUsRUFBRTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxPQUFPLElBQUksZ0NBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUNGLENBQUMifQ==
|