@lodashventure/medusa-hero 1.0.1
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 +5418 -0
- package/.medusa/server/src/admin/index.mjs +5416 -0
- package/.medusa/server/src/api/admin/categories/[id]/hero/route.js +129 -0
- package/.medusa/server/src/api/admin/categories/[id]/thumbnail/route.js +129 -0
- package/.medusa/server/src/api/admin/heroes/reorder/route.js +18 -0
- package/.medusa/server/src/api/admin/heroes/route.js +62 -0
- package/.medusa/server/src/api/admin/heroes/update-link/route.js +19 -0
- package/.medusa/server/src/api/middlewares.js +49 -0
- package/.medusa/server/src/api/store/hero/route.js +19 -0
- package/.medusa/server/src/modules/hero/index.js +13 -0
- package/.medusa/server/src/modules/hero/migrations/Migration20250414070000.js +15 -0
- package/.medusa/server/src/modules/hero/migrations/Migration20251024170000.js +14 -0
- package/.medusa/server/src/modules/hero/models/hero.js +11 -0
- package/.medusa/server/src/modules/hero/service.js +13 -0
- package/.medusa/server/src/services/gcs-direct-upload.js +53 -0
- package/.medusa/server/src/workflows/delete-heroes.js +95 -0
- package/.medusa/server/src/workflows/reorder-heroes.js +23 -0
- package/.medusa/server/src/workflows/upload-category-image.js +64 -0
- package/.medusa/server/src/workflows/upload-heroes.js +54 -0
- package/README.md +68 -0
- package/package.json +67 -0
|
@@ -0,0 +1,129 @@
|
|
|
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_category_image_1 = require("../../../../../workflows/upload-category-image");
|
|
6
|
+
const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
|
|
7
|
+
// GET - Get category hero image
|
|
8
|
+
const GET = async (req, res) => {
|
|
9
|
+
const { id } = req.params;
|
|
10
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
+
try {
|
|
12
|
+
const { data: categories } = await query.graph({
|
|
13
|
+
entity: "product_category",
|
|
14
|
+
fields: ["id", "name", "metadata"],
|
|
15
|
+
filters: { id },
|
|
16
|
+
});
|
|
17
|
+
if (!categories || categories.length === 0) {
|
|
18
|
+
return res.status(404).json({ error: "Category not found" });
|
|
19
|
+
}
|
|
20
|
+
return res.json({
|
|
21
|
+
hero: categories[0].metadata?.hero || null,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error("Error fetching category hero:", error);
|
|
26
|
+
return res.status(500).json({ error: "Failed to fetch category hero" });
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.GET = GET;
|
|
30
|
+
// POST - Upload category hero image
|
|
31
|
+
const POST = async (req, res) => {
|
|
32
|
+
const { id } = req.params;
|
|
33
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
34
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
35
|
+
try {
|
|
36
|
+
const { data: categories } = await query.graph({
|
|
37
|
+
entity: "product_category",
|
|
38
|
+
fields: ["id", "metadata"],
|
|
39
|
+
filters: { id },
|
|
40
|
+
});
|
|
41
|
+
if (!categories || categories.length === 0) {
|
|
42
|
+
return res.status(404).json({ error: "Category not found" });
|
|
43
|
+
}
|
|
44
|
+
const file = req.file;
|
|
45
|
+
if (!file) {
|
|
46
|
+
return res.status(400).json({ error: "No file uploaded" });
|
|
47
|
+
}
|
|
48
|
+
// Validate file type
|
|
49
|
+
const allowedMimeTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
|
|
50
|
+
if (!allowedMimeTypes.includes(file.mimetype)) {
|
|
51
|
+
return res.status(400).json({
|
|
52
|
+
error: "Invalid file type. Only JPEG, PNG, GIF, and WebP images are allowed."
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Validate file size (max 5MB)
|
|
56
|
+
if (file.size > 5 * 1024 * 1024) {
|
|
57
|
+
return res.status(400).json({
|
|
58
|
+
error: "File size too large. Maximum allowed size is 5MB."
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const result = await (0, upload_category_image_1.uploadCategoryImageWorkflow)(req.scope).run({
|
|
62
|
+
input: {
|
|
63
|
+
categoryId: id,
|
|
64
|
+
imageType: "hero",
|
|
65
|
+
fileData: {
|
|
66
|
+
filename: file.originalname,
|
|
67
|
+
mimeType: file.mimetype,
|
|
68
|
+
content: file.buffer.toString("base64"),
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return res.json({
|
|
73
|
+
category: {
|
|
74
|
+
id,
|
|
75
|
+
hero: result.result.imageUrl,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger.error("Error uploading category hero:", error);
|
|
81
|
+
return res.status(500).json({ error: "Failed to upload category hero" });
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
exports.POST = POST;
|
|
85
|
+
// DELETE - Delete category hero image
|
|
86
|
+
const DELETE = async (req, res) => {
|
|
87
|
+
const { id } = req.params;
|
|
88
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
89
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
90
|
+
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
91
|
+
try {
|
|
92
|
+
const { data: categories } = await query.graph({
|
|
93
|
+
entity: "product_category",
|
|
94
|
+
fields: ["id", "metadata"],
|
|
95
|
+
filters: { id },
|
|
96
|
+
});
|
|
97
|
+
if (!categories || categories.length === 0) {
|
|
98
|
+
return res.status(404).json({ error: "Category not found" });
|
|
99
|
+
}
|
|
100
|
+
const heroUrl = categories[0].metadata?.hero;
|
|
101
|
+
if (!heroUrl) {
|
|
102
|
+
return res.status(404).json({ error: "No hero image found for this category" });
|
|
103
|
+
}
|
|
104
|
+
// Delete the file from GCS
|
|
105
|
+
if (heroUrl.includes('storage.googleapis.com')) {
|
|
106
|
+
try {
|
|
107
|
+
const parts = heroUrl.split('/');
|
|
108
|
+
const bucketIndex = parts.indexOf('sangaroon');
|
|
109
|
+
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
110
|
+
const filename = parts.slice(bucketIndex + 1).join('/');
|
|
111
|
+
await gcsUploadService.deleteFile(filename);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (deleteError) {
|
|
115
|
+
logger.error("Error deleting file from GCS:", deleteError);
|
|
116
|
+
// Continue even if file deletion fails
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return res.json({
|
|
120
|
+
message: "Category hero image deleted successfully",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error("Error deleting category hero:", error);
|
|
125
|
+
return res.status(500).json({ error: "Failed to delete category hero" });
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
exports.DELETE = DELETE;
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhdGVnb3JpZXMvW2lkXS9oZXJvL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHFEQUFzRTtBQUN0RSwwRkFBNkY7QUFDN0YsaUZBQW1GO0FBR25GLGdDQUFnQztBQUN6QixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQTBCLEVBQzFCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMxQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqRSxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM3QyxNQUFNLEVBQUUsa0JBQWtCO1lBQzFCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxJQUFJO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFB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
|
|
@@ -0,0 +1,129 @@
|
|
|
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_category_image_1 = require("../../../../../workflows/upload-category-image");
|
|
6
|
+
const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
|
|
7
|
+
// GET - Get category thumbnail
|
|
8
|
+
const GET = async (req, res) => {
|
|
9
|
+
const { id } = req.params;
|
|
10
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
11
|
+
try {
|
|
12
|
+
const { data: categories } = await query.graph({
|
|
13
|
+
entity: "product_category",
|
|
14
|
+
fields: ["id", "name", "metadata"],
|
|
15
|
+
filters: { id },
|
|
16
|
+
});
|
|
17
|
+
if (!categories || categories.length === 0) {
|
|
18
|
+
return res.status(404).json({ error: "Category not found" });
|
|
19
|
+
}
|
|
20
|
+
return res.json({
|
|
21
|
+
thumbnail: categories[0].metadata?.thumbnail || null,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error("Error fetching category thumbnail:", error);
|
|
26
|
+
return res.status(500).json({ error: "Failed to fetch category thumbnail" });
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.GET = GET;
|
|
30
|
+
// POST - Upload category thumbnail
|
|
31
|
+
const POST = async (req, res) => {
|
|
32
|
+
const { id } = req.params;
|
|
33
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
34
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
35
|
+
try {
|
|
36
|
+
const { data: categories } = await query.graph({
|
|
37
|
+
entity: "product_category",
|
|
38
|
+
fields: ["id", "metadata"],
|
|
39
|
+
filters: { id },
|
|
40
|
+
});
|
|
41
|
+
if (!categories || categories.length === 0) {
|
|
42
|
+
return res.status(404).json({ error: "Category not found" });
|
|
43
|
+
}
|
|
44
|
+
const file = req.file;
|
|
45
|
+
if (!file) {
|
|
46
|
+
return res.status(400).json({ error: "No file uploaded" });
|
|
47
|
+
}
|
|
48
|
+
// Validate file type
|
|
49
|
+
const allowedMimeTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
|
|
50
|
+
if (!allowedMimeTypes.includes(file.mimetype)) {
|
|
51
|
+
return res.status(400).json({
|
|
52
|
+
error: "Invalid file type. Only JPEG, PNG, GIF, and WebP images are allowed."
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Validate file size (max 5MB)
|
|
56
|
+
if (file.size > 5 * 1024 * 1024) {
|
|
57
|
+
return res.status(400).json({
|
|
58
|
+
error: "File size too large. Maximum allowed size is 5MB."
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const result = await (0, upload_category_image_1.uploadCategoryImageWorkflow)(req.scope).run({
|
|
62
|
+
input: {
|
|
63
|
+
categoryId: id,
|
|
64
|
+
imageType: "thumbnail",
|
|
65
|
+
fileData: {
|
|
66
|
+
filename: file.originalname,
|
|
67
|
+
mimeType: file.mimetype,
|
|
68
|
+
content: file.buffer.toString("base64"),
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return res.json({
|
|
73
|
+
category: {
|
|
74
|
+
id,
|
|
75
|
+
thumbnail: result.result.imageUrl,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger.error("Error uploading category thumbnail:", error);
|
|
81
|
+
return res.status(500).json({ error: "Failed to upload category thumbnail" });
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
exports.POST = POST;
|
|
85
|
+
// DELETE - Delete category thumbnail
|
|
86
|
+
const DELETE = async (req, res) => {
|
|
87
|
+
const { id } = req.params;
|
|
88
|
+
const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
89
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
90
|
+
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
91
|
+
try {
|
|
92
|
+
const { data: categories } = await query.graph({
|
|
93
|
+
entity: "product_category",
|
|
94
|
+
fields: ["id", "metadata"],
|
|
95
|
+
filters: { id },
|
|
96
|
+
});
|
|
97
|
+
if (!categories || categories.length === 0) {
|
|
98
|
+
return res.status(404).json({ error: "Category not found" });
|
|
99
|
+
}
|
|
100
|
+
const thumbnailUrl = categories[0].metadata?.thumbnail;
|
|
101
|
+
if (!thumbnailUrl) {
|
|
102
|
+
return res.status(404).json({ error: "No thumbnail found for this category" });
|
|
103
|
+
}
|
|
104
|
+
// Delete the file from GCS
|
|
105
|
+
if (thumbnailUrl.includes('storage.googleapis.com')) {
|
|
106
|
+
try {
|
|
107
|
+
const parts = thumbnailUrl.split('/');
|
|
108
|
+
const bucketIndex = parts.indexOf('sangaroon');
|
|
109
|
+
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
110
|
+
const filename = parts.slice(bucketIndex + 1).join('/');
|
|
111
|
+
await gcsUploadService.deleteFile(filename);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (deleteError) {
|
|
115
|
+
logger.error("Error deleting file from GCS:", deleteError);
|
|
116
|
+
// Continue even if file deletion fails
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return res.json({
|
|
120
|
+
message: "Category thumbnail deleted successfully",
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error("Error deleting category thumbnail:", error);
|
|
125
|
+
return res.status(500).json({ error: "Failed to delete category thumbnail" });
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
exports.DELETE = DELETE;
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2NhdGVnb3JpZXMvW2lkXS90aHVtYm5haWwvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EscURBQXNFO0FBQ3RFLDBGQUE2RjtBQUM3RixpRkFBbUY7QUFHbkYsK0JBQStCO0FBQ3hCLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFDdEIsR0FBMEIsRUFDMUIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzdDLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDbEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2QsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxJQUFJLElBQUk7U0FDckQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FB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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const reorder_heroes_1 = require("../../../../workflows/reorder-heroes");
|
|
5
|
+
const POST = async (req, res) => {
|
|
6
|
+
const { ids } = req.body;
|
|
7
|
+
const { result: reorderedHeroes } = await (0, reorder_heroes_1.reorderHeroesWorkflow)(req.scope).run({
|
|
8
|
+
input: {
|
|
9
|
+
ids,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
13
|
+
res.json({
|
|
14
|
+
reorderedHeroes,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
exports.POST = POST;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2hlcm9lcy9yZW9yZGVyL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHlFQUE2RTtBQUV0RSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQWtELEVBQ2xELEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUV6QixNQUFNLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sSUFBQSxzQ0FBcUIsRUFDN0QsR0FBRyxDQUFDLEtBQUssQ0FDVixDQUFDLEdBQUcsQ0FBQztRQUNKLEtBQUssRUFBRTtZQUNMLEdBQUc7U0FDSjtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLGVBQWU7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBbEJXLFFBQUEsSUFBSSxRQWtCZiJ9
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DELETE = exports.POST = void 0;
|
|
4
|
+
exports.GET = GET;
|
|
5
|
+
const upload_heroes_1 = require("../../../workflows/upload-heroes");
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const framework_1 = require("@medusajs/framework");
|
|
8
|
+
const hero_1 = require("../../../modules/hero");
|
|
9
|
+
const delete_heroes_1 = require("../../../workflows/delete-heroes");
|
|
10
|
+
const POST = async (req, res) => {
|
|
11
|
+
const inputFiles = req.files;
|
|
12
|
+
if (!inputFiles?.length) {
|
|
13
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No files were uploaded");
|
|
14
|
+
}
|
|
15
|
+
const { result: files } = await (0, upload_heroes_1.uploadHeroesWorkflow)(req.scope).run({
|
|
16
|
+
input: {
|
|
17
|
+
files: inputFiles?.map((f) => ({
|
|
18
|
+
/**
|
|
19
|
+
* docs: https://github.com/expressjs/multer/issues/1104#issuecomment-1152987772
|
|
20
|
+
*/
|
|
21
|
+
filename: Buffer
|
|
22
|
+
.from(f.originalname, "latin1")
|
|
23
|
+
.toString("utf-8"),
|
|
24
|
+
mimeType: f.mimetype,
|
|
25
|
+
content: f.buffer.toString("binary"),
|
|
26
|
+
access: "public",
|
|
27
|
+
})),
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
31
|
+
res.json({
|
|
32
|
+
files,
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
exports.POST = POST;
|
|
36
|
+
async function GET(req, res) {
|
|
37
|
+
const heroService = framework_1.container.resolve(hero_1.HERO_MODULE);
|
|
38
|
+
const [heroes, count] = await heroService.listAndCountHeroes({}, {
|
|
39
|
+
order: {
|
|
40
|
+
order: "DESC",
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
44
|
+
res.json({
|
|
45
|
+
heroes,
|
|
46
|
+
count,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const DELETE = async (req, res) => {
|
|
50
|
+
const { ids } = req.body;
|
|
51
|
+
const { result: deletedHeroes } = await (0, delete_heroes_1.deleteHeroesWorkflow)(req.scope).run({
|
|
52
|
+
input: {
|
|
53
|
+
ids,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
57
|
+
res.json({
|
|
58
|
+
deletedHeroes,
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
exports.DELETE = DELETE;
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2hlcm9lcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErQ0Esa0JBbUJDO0FBOURELG9FQUF3RTtBQUN4RSxxREFBd0Q7QUFDeEQsbURBQWdEO0FBQ2hELGdEQUFvRDtBQUNwRCxvRUFBd0U7QUFPakUsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFFN0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix3QkFBd0IsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBQSxvQ0FBb0IsRUFBQyxHQUFHLENBQUMsS0FBWSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3pFLEtBQUssRUFBRTtZQUNMLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3Qjs7bUJBRUc7Z0JBQ0gsUUFBUSxFQUFHLE1BQWM7cUJBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztxQkFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDcEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO2dCQUNwQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUNwQyxNQUFNLEVBQUUsUUFBUTthQUNqQixDQUFDLENBQUM7U0FDSjtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLEtBQUs7S0FDTixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUE5QlcsUUFBQSxJQUFJLFFBOEJmO0FBRUssS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBK0IsRUFDL0IsR0FBbUI7SUFFbkIsTUFBTSxXQUFXLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQW9CLGtCQUFXLENBQUMsQ0FBQztJQUN0RSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sV0FBVyxDQUFDLGtCQUFrQixDQUMxRCxFQUFFLEVBQ0Y7UUFDRSxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsTUFBTTtTQUNkO0tBQ0YsQ0FDRixDQUFDO0lBRUYsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztJQUNqRSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ1AsTUFBTTtRQUNOLEtBQUs7S0FDTixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRU0sTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUN6QixHQUFrRCxFQUNsRCxHQUFtQixFQUNuQixFQUFFO0lBQ0YsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFFekIsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxNQUFNLElBQUEsb0NBQW9CLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDekU7UUFDRSxLQUFLLEVBQUU7WUFDTCxHQUFHO1NBQ0o7S0FDRixDQUNGLENBQUM7SUFFRixHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ2pFLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDUCxhQUFhO0tBQ2QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBbEJXLFFBQUEsTUFBTSxVQWtCakIifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const framework_1 = require("@medusajs/framework");
|
|
5
|
+
const hero_1 = require("../../../../modules/hero");
|
|
6
|
+
const POST = async (req, res) => {
|
|
7
|
+
const { id, link } = req.body;
|
|
8
|
+
const heroService = framework_1.container.resolve(hero_1.HERO_MODULE);
|
|
9
|
+
const updatedHero = await heroService.updateHeroes({
|
|
10
|
+
id,
|
|
11
|
+
link,
|
|
12
|
+
});
|
|
13
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
14
|
+
res.json({
|
|
15
|
+
hero: updatedHero,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
exports.POST = POST;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2hlcm9lcy91cGRhdGUtbGluay9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxtREFBZ0Q7QUFDaEQsbURBQXVEO0FBR2hELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBb0UsRUFDcEUsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUU5QixNQUFNLFdBQVcsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBb0Isa0JBQVcsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksQ0FBQztRQUNqRCxFQUFFO1FBQ0YsSUFBSTtLQUNMLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLElBQUksRUFBRSxXQUFXO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQWpCVyxRQUFBLElBQUksUUFpQmYifQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
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 http_1 = require("@medusajs/framework/http");
|
|
7
|
+
const multer_1 = __importDefault(require("multer"));
|
|
8
|
+
const upload = (0, multer_1.default)({
|
|
9
|
+
storage: multer_1.default.memoryStorage(),
|
|
10
|
+
limits: {
|
|
11
|
+
fileSize: 10 * 1024 * 1024, // 10MB
|
|
12
|
+
},
|
|
13
|
+
fileFilter: (req, file, cb) => {
|
|
14
|
+
const allowedMimeTypes = [
|
|
15
|
+
"image/jpeg",
|
|
16
|
+
"image/jpg",
|
|
17
|
+
"image/png",
|
|
18
|
+
"image/gif",
|
|
19
|
+
"image/webp",
|
|
20
|
+
];
|
|
21
|
+
if (allowedMimeTypes.includes(file.mimetype)) {
|
|
22
|
+
cb(null, true);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
cb(new Error("Invalid file type. Only JPEG, PNG, GIF, and WebP are allowed."));
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
exports.default = (0, http_1.defineMiddlewares)({
|
|
30
|
+
routes: [
|
|
31
|
+
{
|
|
32
|
+
method: "POST",
|
|
33
|
+
matcher: "/admin/heroes",
|
|
34
|
+
middlewares: [
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
upload.array("files"),
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
method: "POST",
|
|
41
|
+
matcher: "/admin/categories/:id/hero",
|
|
42
|
+
middlewares: [
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
upload.single("file"),
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbURBQTZEO0FBQzdELG9EQUE0QjtBQUU1QixNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFNLEVBQUM7SUFDcEIsT0FBTyxFQUFFLGdCQUFNLENBQUMsYUFBYSxFQUFFO0lBQy9CLE1BQU0sRUFBRTtRQUNOLFFBQVEsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxPQUFPO0tBQ3BDO0lBQ0QsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUM1QixNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLFlBQVk7WUFDWixXQUFXO1lBQ1gsV0FBVztZQUNYLFdBQVc7WUFDWCxZQUFZO1NBQ2IsQ0FBQztRQUNGLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLENBQ0EsSUFBSSxLQUFLLENBQ1AsK0RBQStELENBQ2hFLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBQSx3QkFBaUIsRUFBQztJQUMvQixNQUFNLEVBQUU7UUFDTjtZQUNFLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFLGVBQWU7WUFDeEIsV0FBVyxFQUFFO2dCQUNYLGFBQWE7Z0JBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7YUFDdEI7U0FDRjtRQUNEO1lBQ0UsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLFdBQVcsRUFBRTtnQkFDWCxhQUFhO2dCQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ3RCO1NBQ0Y7S0FDRjtDQUNGLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const framework_1 = require("@medusajs/framework");
|
|
5
|
+
const hero_1 = require("../../../modules/hero");
|
|
6
|
+
async function GET(req, res) {
|
|
7
|
+
const heroService = await framework_1.container.resolve(hero_1.HERO_MODULE);
|
|
8
|
+
const [heroes, count] = await heroService.listAndCountHeroes({}, {
|
|
9
|
+
order: {
|
|
10
|
+
order: "DESC",
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
14
|
+
res.json({
|
|
15
|
+
heroes,
|
|
16
|
+
count,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2hlcm8vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxrQkFvQkM7QUF0QkQsbURBQWdEO0FBQ2hELGdEQUFvRDtBQUM3QyxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUErQixFQUMvQixHQUFtQjtJQUVuQixNQUFNLFdBQVcsR0FDZixNQUFNLHFCQUFTLENBQUMsT0FBTyxDQUFvQixrQkFBVyxDQUFDLENBQUM7SUFDMUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDMUQsRUFBRSxFQUNGO1FBQ0UsS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLE1BQU07U0FDZDtLQUNGLENBQ0YsQ0FBQztJQUVGLEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDakUsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNQLE1BQU07UUFDTixLQUFLO0tBQ04sQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
exports.HERO_MODULE = void 0;
|
|
7
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
8
|
+
const service_1 = __importDefault(require("./service"));
|
|
9
|
+
exports.HERO_MODULE = "hero";
|
|
10
|
+
exports.default = (0, utils_1.Module)(exports.HERO_MODULE, {
|
|
11
|
+
service: service_1.default,
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9oZXJvL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUFtRDtBQUNuRCx3REFBMEM7QUFFN0IsUUFBQSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBRWxDLGtCQUFlLElBQUEsY0FBTSxFQUFDLG1CQUFXLEVBQUU7SUFDakMsT0FBTyxFQUFFLGlCQUFpQjtDQUMzQixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20250414070000 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20250414070000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`create table if not exists "hero" ("id" text not null, "url" text not null, "order" integer not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "hero_pkey" primary key ("id"));`);
|
|
8
|
+
this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_hero_deleted_at" ON "hero" (deleted_at) WHERE deleted_at IS NULL;`);
|
|
9
|
+
}
|
|
10
|
+
async down() {
|
|
11
|
+
this.addSql(`drop table if exists "hero" cascade;`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.Migration20250414070000 = Migration20250414070000;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA0MTQwNzAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9oZXJvL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTA0MTQwNzAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFFM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLG9SQUFvUixDQUFDLENBQUM7UUFDbFMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtR0FBbUcsQ0FBQyxDQUFDO0lBQ25ILENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUVGO0FBWEQsMERBV0MifQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Migration20251024170000 = void 0;
|
|
4
|
+
const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
|
|
5
|
+
class Migration20251024170000 extends migrations_1.Migration {
|
|
6
|
+
async up() {
|
|
7
|
+
this.addSql(`alter table if exists "hero" add column if not exists "link" text null;`);
|
|
8
|
+
}
|
|
9
|
+
async down() {
|
|
10
|
+
this.addSql(`alter table if exists "hero" drop column if exists "link";`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.Migration20251024170000 = Migration20251024170000;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMjQxNzAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9oZXJvL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMjQxNzAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUNULHlFQUF5RSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsNERBQTRELENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0Y7QUFWRCwwREFVQyJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const Hero = utils_1.model.define("hero", {
|
|
5
|
+
id: utils_1.model.id().primaryKey(),
|
|
6
|
+
url: utils_1.model.text(),
|
|
7
|
+
link: utils_1.model.text().nullable(),
|
|
8
|
+
order: utils_1.model.number(),
|
|
9
|
+
});
|
|
10
|
+
exports.default = Hero;
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVyby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2hlcm8vbW9kZWxzL2hlcm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBa0Q7QUFFbEQsTUFBTSxJQUFJLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7SUFDaEMsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsR0FBRyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDakIsSUFBSSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsS0FBSyxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUU7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsa0JBQWUsSUFBSSxDQUFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
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 hero_1 = __importDefault(require("./models/hero"));
|
|
8
|
+
class HeroModuleService extends (0, utils_1.MedusaService)({
|
|
9
|
+
Hero: hero_1.default,
|
|
10
|
+
}) {
|
|
11
|
+
}
|
|
12
|
+
exports.default = HeroModuleService;
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2hlcm8vc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUEwRDtBQUMxRCx5REFBaUM7QUFFakMsTUFBTSxpQkFBa0IsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDNUMsSUFBSSxFQUFKLGNBQUk7Q0FDTCxDQUFDO0NBQUc7QUFFTCxrQkFBZSxpQkFBaUIsQ0FBQyJ9
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
constructor() {
|
|
7
|
+
// Initialize GCS client with credentials from env
|
|
8
|
+
this.storage = new storage_1.Storage({
|
|
9
|
+
credentials: {
|
|
10
|
+
client_email: process.env.CLIENT_EMAIL,
|
|
11
|
+
private_key: process.env.PRIVATE_KEY.replace(/\\n/g, '\n'),
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
this.bucketName = process.env.BUCKET_NAME || 'sangaroon';
|
|
15
|
+
this.baseUrl = process.env.GCP_STORAGE_BASE_PUBLIC_URL || 'https://storage.googleapis.com';
|
|
16
|
+
}
|
|
17
|
+
async uploadFile(filename, buffer, mimeType) {
|
|
18
|
+
try {
|
|
19
|
+
const bucket = this.storage.bucket(this.bucketName);
|
|
20
|
+
const file = bucket.file(filename);
|
|
21
|
+
await file.save(buffer, {
|
|
22
|
+
metadata: {
|
|
23
|
+
contentType: mimeType,
|
|
24
|
+
},
|
|
25
|
+
public: true,
|
|
26
|
+
resumable: false,
|
|
27
|
+
});
|
|
28
|
+
// Return the public URL
|
|
29
|
+
return `${this.baseUrl}/${this.bucketName}/${filename}`;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error('Error uploading to GCS:', error);
|
|
33
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
34
|
+
throw new Error(`Failed to upload file to GCS: ${message}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async deleteFile(filename) {
|
|
38
|
+
try {
|
|
39
|
+
const bucket = this.storage.bucket(this.bucketName);
|
|
40
|
+
const file = bucket.file(filename);
|
|
41
|
+
const [exists] = await file.exists();
|
|
42
|
+
if (exists) {
|
|
43
|
+
await file.delete();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error('Error deleting from GCS:', error);
|
|
48
|
+
// Don't throw on delete errors
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.GcsDirectUploadService = GcsDirectUploadService;
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2NzLWRpcmVjdC11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZ2NzLWRpcmVjdC11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBRWhELE1BQWEsc0JBQXNCO0lBS2pDO1FBQ0Usa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFhO2dCQUN2QyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7YUFDNUQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksZ0NBQWdDLENBQUM7SUFDN0YsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7UUFDakUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsUUFBUSxFQUFFO29CQUNSLFdBQVcsRUFBRSxRQUFRO2lCQUN0QjtnQkFDRCxNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsS0FBSzthQUNqQixDQUFDLENBQUM7WUFFSCx3QkFBd0I7WUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakQsK0JBQStCO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF0REQsd0RBc0RDIn0=
|