@lodashventure/medusa-brand 1.2.19 → 1.2.23
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 +1191 -556
- package/.medusa/server/src/admin/index.mjs +1165 -530
- package/.medusa/server/src/api/admin/brands/[id]/image/route.js +178 -0
- package/.medusa/server/src/api/admin/brands/[id]/logo/route.js +179 -0
- package/.medusa/server/src/api/admin/brands/[id]/products/route.js +55 -0
- package/.medusa/server/src/api/admin/brands/[id]/route.js +251 -0
- package/.medusa/server/src/api/admin/brands/route.js +276 -0
- package/.medusa/server/src/api/admin/products/[id]/brand/route.js +117 -0
- package/.medusa/server/src/api/middlewares/attach-brand-to-products.js +110 -0
- package/.medusa/server/src/api/middlewares.js +53 -0
- package/.medusa/server/src/api/store/brands/[id]/route.js +31 -0
- package/.medusa/server/src/api/store/brands/route.js +99 -0
- package/.medusa/server/{index.js → src/index.js} +1 -1
- package/.medusa/server/{modules → src/modules}/brand/index.js +1 -1
- package/.medusa/server/src/modules/brand/models/brand.js +40 -0
- package/.medusa/server/{modules → src/modules}/brand/service.js +1 -1
- package/.medusa/server/src/services/gcs-direct-upload.js +93 -0
- package/.medusa/server/src/workflows/upload-brand-image.js +66 -0
- package/package.json +11 -10
- package/.medusa/server/api/admin/brands/[id]/image/route.d.ts +0 -5
- package/.medusa/server/api/admin/brands/[id]/image/route.js +0 -119
- package/.medusa/server/api/admin/brands/[id]/logo/route.d.ts +0 -5
- package/.medusa/server/api/admin/brands/[id]/logo/route.js +0 -119
- package/.medusa/server/api/admin/brands/[id]/products/route.d.ts +0 -2
- package/.medusa/server/api/admin/brands/[id]/products/route.js +0 -52
- package/.medusa/server/api/admin/brands/[id]/route.d.ts +0 -5
- package/.medusa/server/api/admin/brands/[id]/route.js +0 -112
- package/.medusa/server/api/admin/brands/route.d.ts +0 -4
- package/.medusa/server/api/admin/brands/route.js +0 -76
- package/.medusa/server/api/admin/products/[id]/brand/route.d.ts +0 -5
- package/.medusa/server/api/admin/products/[id]/brand/route.js +0 -117
- package/.medusa/server/api/middlewares/attach-brand-to-products.d.ts +0 -2
- package/.medusa/server/api/middlewares/attach-brand-to-products.js +0 -105
- package/.medusa/server/api/middlewares.d.ts +0 -6
- package/.medusa/server/api/middlewares.js +0 -27
- package/.medusa/server/api/store/brands/route.d.ts +0 -2
- package/.medusa/server/api/store/brands/route.js +0 -53
- package/.medusa/server/index.d.ts +0 -1
- package/.medusa/server/modules/brand/index.d.ts +0 -35
- package/.medusa/server/modules/brand/migrations/Migration20251021070648.d.ts +0 -5
- package/.medusa/server/modules/brand/migrations/Migration20251021070648.js +0 -28
- package/.medusa/server/modules/brand/models/brand.d.ts +0 -16
- package/.medusa/server/modules/brand/models/brand.js +0 -43
- package/.medusa/server/modules/brand/service.d.ts +0 -21
- 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-brand-image.d.ts +0 -15
- package/.medusa/server/workflows/upload-brand-image.js +0 -57
|
@@ -0,0 +1,178 @@
|
|
|
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_brand_image_1 = require("../../../../../workflows/upload-brand-image");
|
|
6
|
+
const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
|
|
7
|
+
// GET - Get brand image
|
|
8
|
+
const GET = async (req, res) => {
|
|
9
|
+
const { id } = req.params;
|
|
10
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
11
|
+
try {
|
|
12
|
+
const brand = await brandService.retrieveBrand(id);
|
|
13
|
+
if (!brand) {
|
|
14
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
15
|
+
}
|
|
16
|
+
return res.json({
|
|
17
|
+
image: brand.image || null,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error("Error fetching brand image:", error);
|
|
22
|
+
return res.status(500).json({ error: "Failed to fetch brand image" });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.GET = GET;
|
|
26
|
+
// POST - Upload brand image
|
|
27
|
+
const POST = async (req, res) => {
|
|
28
|
+
const { id } = req.params;
|
|
29
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
30
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
31
|
+
try {
|
|
32
|
+
const brand = await brandService.retrieveBrand(id);
|
|
33
|
+
if (!brand) {
|
|
34
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
35
|
+
}
|
|
36
|
+
const payload = prepareFilePayload(req);
|
|
37
|
+
if (!payload.success) {
|
|
38
|
+
return res.status(payload.status).json({ error: payload.error });
|
|
39
|
+
}
|
|
40
|
+
const { filename, mimeType, buffer, base64 } = payload.data;
|
|
41
|
+
// Validate file type
|
|
42
|
+
const allowedMimeTypes = [
|
|
43
|
+
"image/jpeg",
|
|
44
|
+
"image/jpg",
|
|
45
|
+
"image/png",
|
|
46
|
+
"image/webp",
|
|
47
|
+
];
|
|
48
|
+
if (!allowedMimeTypes.includes(mimeType)) {
|
|
49
|
+
return res.status(400).json({
|
|
50
|
+
error: "Invalid file type. Only JPEG, PNG, and WebP images are allowed.",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// Validate file size (max 10MB)
|
|
54
|
+
if (buffer.length > 10 * 1024 * 1024) {
|
|
55
|
+
return res.status(400).json({
|
|
56
|
+
error: "File size too large. Maximum allowed size is 10MB.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const result = await (0, upload_brand_image_1.uploadBrandImageWorkflow)(req.scope).run({
|
|
60
|
+
input: {
|
|
61
|
+
brandId: id,
|
|
62
|
+
imageType: "image",
|
|
63
|
+
fileData: {
|
|
64
|
+
filename,
|
|
65
|
+
mimeType,
|
|
66
|
+
content: base64,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
return res.json({
|
|
71
|
+
brand: {
|
|
72
|
+
id,
|
|
73
|
+
image: result.result.imageUrl,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.error("Error uploading brand image:", error);
|
|
79
|
+
return res.status(500).json({ error: "Failed to upload brand image" });
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
exports.POST = POST;
|
|
83
|
+
const prepareFilePayload = (req) => {
|
|
84
|
+
if (req.file) {
|
|
85
|
+
return {
|
|
86
|
+
success: true,
|
|
87
|
+
data: {
|
|
88
|
+
filename: req.file.originalname,
|
|
89
|
+
mimeType: req.file.mimetype,
|
|
90
|
+
buffer: req.file.buffer,
|
|
91
|
+
base64: req.file.buffer.toString("base64"),
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const body = req.body;
|
|
96
|
+
if (!body || typeof body !== "object") {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
status: 400,
|
|
100
|
+
error: "Invalid payload",
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const { filename, mimeType, content } = body;
|
|
104
|
+
if (!filename || !mimeType || !content) {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
status: 400,
|
|
108
|
+
error: "Missing file data",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const buffer = Buffer.from(content, "base64");
|
|
113
|
+
if (!buffer.length) {
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
status: 400,
|
|
117
|
+
error: "Invalid file content",
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
success: true,
|
|
122
|
+
data: {
|
|
123
|
+
filename,
|
|
124
|
+
mimeType,
|
|
125
|
+
buffer,
|
|
126
|
+
base64: content,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
status: 400,
|
|
134
|
+
error: "Failed to decode file",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
// DELETE - Delete brand image
|
|
139
|
+
const DELETE = async (req, res) => {
|
|
140
|
+
const { id } = req.params;
|
|
141
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
142
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
143
|
+
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
144
|
+
try {
|
|
145
|
+
const brand = await brandService.retrieveBrand(id);
|
|
146
|
+
if (!brand) {
|
|
147
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
148
|
+
}
|
|
149
|
+
if (!brand.image) {
|
|
150
|
+
return res.status(404).json({ error: "No image found for this brand" });
|
|
151
|
+
}
|
|
152
|
+
// Delete the file from GCS
|
|
153
|
+
if (brand.image.includes("storage.googleapis.com")) {
|
|
154
|
+
try {
|
|
155
|
+
const parts = brand.image.split("/");
|
|
156
|
+
const bucketIndex = parts.indexOf("sangaroon");
|
|
157
|
+
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
158
|
+
const filename = parts.slice(bucketIndex + 1).join("/");
|
|
159
|
+
await gcsUploadService.deleteFile(filename);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (deleteError) {
|
|
163
|
+
logger.error("Error deleting file from GCS:", deleteError);
|
|
164
|
+
// Continue even if file deletion fails
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
await brandService.updateBrands([{ id: brand.id, image: null }]);
|
|
168
|
+
return res.json({
|
|
169
|
+
message: "Brand image deleted successfully",
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
logger.error("Error deleting brand image:", error);
|
|
174
|
+
return res.status(500).json({ error: "Failed to delete brand image" });
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
exports.DELETE = DELETE;
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JyYW5kcy9baWRdL2ltYWdlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFzRTtBQUN0RSxvRkFBdUY7QUFDdkYsaUZBQW1GO0FBR25GLHdCQUF3QjtBQUNqQixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBMEIsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDM0UsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDMUIsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFRLENBQUM7SUFFN0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJO1NBQzNCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLDZCQUE2QixFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBbEJXLFFBQUEsR0FBRyxPQWtC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
|
|
@@ -0,0 +1,179 @@
|
|
|
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_brand_image_1 = require("../../../../../workflows/upload-brand-image");
|
|
6
|
+
const gcs_direct_upload_1 = require("../../../../../services/gcs-direct-upload");
|
|
7
|
+
// GET - Get brand logo
|
|
8
|
+
const GET = async (req, res) => {
|
|
9
|
+
const { id } = req.params;
|
|
10
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
11
|
+
try {
|
|
12
|
+
const brand = await brandService.retrieveBrand(id);
|
|
13
|
+
if (!brand) {
|
|
14
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
15
|
+
}
|
|
16
|
+
return res.json({
|
|
17
|
+
logo: brand.logo || null,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error("Error fetching brand logo:", error);
|
|
22
|
+
return res.status(500).json({ error: "Failed to fetch brand logo" });
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.GET = GET;
|
|
26
|
+
// POST - Upload brand logo
|
|
27
|
+
const POST = async (req, res) => {
|
|
28
|
+
const { id } = req.params;
|
|
29
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
30
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
31
|
+
try {
|
|
32
|
+
const brand = await brandService.retrieveBrand(id);
|
|
33
|
+
if (!brand) {
|
|
34
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
35
|
+
}
|
|
36
|
+
const payload = prepareFilePayload(req);
|
|
37
|
+
if (!payload.success) {
|
|
38
|
+
return res.status(payload.status).json({ error: payload.error });
|
|
39
|
+
}
|
|
40
|
+
const { filename, mimeType, buffer, base64 } = payload.data;
|
|
41
|
+
// Validate file type
|
|
42
|
+
const allowedMimeTypes = [
|
|
43
|
+
"image/jpeg",
|
|
44
|
+
"image/jpg",
|
|
45
|
+
"image/png",
|
|
46
|
+
"image/webp",
|
|
47
|
+
"image/svg+xml",
|
|
48
|
+
];
|
|
49
|
+
if (!allowedMimeTypes.includes(mimeType)) {
|
|
50
|
+
return res.status(400).json({
|
|
51
|
+
error: "Invalid file type. Only JPEG, PNG, WebP, and SVG images are allowed.",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Validate file size (max 5MB for logos)
|
|
55
|
+
if (buffer.length > 5 * 1024 * 1024) {
|
|
56
|
+
return res.status(400).json({
|
|
57
|
+
error: "File size too large. Maximum allowed size is 5MB.",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const result = await (0, upload_brand_image_1.uploadBrandImageWorkflow)(req.scope).run({
|
|
61
|
+
input: {
|
|
62
|
+
brandId: id,
|
|
63
|
+
imageType: "logo",
|
|
64
|
+
fileData: {
|
|
65
|
+
filename,
|
|
66
|
+
mimeType,
|
|
67
|
+
content: base64,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
return res.json({
|
|
72
|
+
brand: {
|
|
73
|
+
id,
|
|
74
|
+
logo: result.result.imageUrl,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
logger.error("Error uploading brand logo:", error);
|
|
80
|
+
return res.status(500).json({ error: "Failed to upload brand logo" });
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
exports.POST = POST;
|
|
84
|
+
const prepareFilePayload = (req) => {
|
|
85
|
+
if (req.file) {
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
data: {
|
|
89
|
+
filename: req.file.originalname,
|
|
90
|
+
mimeType: req.file.mimetype,
|
|
91
|
+
buffer: req.file.buffer,
|
|
92
|
+
base64: req.file.buffer.toString("base64"),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const body = req.body;
|
|
97
|
+
if (!body || typeof body !== "object") {
|
|
98
|
+
return {
|
|
99
|
+
success: false,
|
|
100
|
+
status: 400,
|
|
101
|
+
error: "Invalid payload",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const { filename, mimeType, content } = body;
|
|
105
|
+
if (!filename || !mimeType || !content) {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
status: 400,
|
|
109
|
+
error: "Missing file data",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const buffer = Buffer.from(content, "base64");
|
|
114
|
+
if (!buffer.length) {
|
|
115
|
+
return {
|
|
116
|
+
success: false,
|
|
117
|
+
status: 400,
|
|
118
|
+
error: "Invalid file content",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
data: {
|
|
124
|
+
filename,
|
|
125
|
+
mimeType,
|
|
126
|
+
buffer,
|
|
127
|
+
base64: content,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
status: 400,
|
|
135
|
+
error: "Failed to decode file",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
// DELETE - Delete brand logo
|
|
140
|
+
const DELETE = async (req, res) => {
|
|
141
|
+
const { id } = req.params;
|
|
142
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
143
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
144
|
+
const gcsUploadService = new gcs_direct_upload_1.GcsDirectUploadService();
|
|
145
|
+
try {
|
|
146
|
+
const brand = await brandService.retrieveBrand(id);
|
|
147
|
+
if (!brand) {
|
|
148
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
149
|
+
}
|
|
150
|
+
if (!brand.logo) {
|
|
151
|
+
return res.status(404).json({ error: "No logo found for this brand" });
|
|
152
|
+
}
|
|
153
|
+
// Delete the file from GCS
|
|
154
|
+
if (brand.logo.includes("storage.googleapis.com")) {
|
|
155
|
+
try {
|
|
156
|
+
const parts = brand.logo.split("/");
|
|
157
|
+
const bucketIndex = parts.indexOf("sangaroon");
|
|
158
|
+
if (bucketIndex !== -1 && bucketIndex < parts.length - 1) {
|
|
159
|
+
const filename = parts.slice(bucketIndex + 1).join("/");
|
|
160
|
+
await gcsUploadService.deleteFile(filename);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (deleteError) {
|
|
164
|
+
logger.error("Error deleting file from GCS:", deleteError);
|
|
165
|
+
// Continue even if file deletion fails
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
await brandService.updateBrands([{ id: brand.id, logo: null }]);
|
|
169
|
+
return res.json({
|
|
170
|
+
message: "Brand logo deleted successfully",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
logger.error("Error deleting brand logo:", error);
|
|
175
|
+
return res.status(500).json({ error: "Failed to delete brand logo" });
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
exports.DELETE = DELETE;
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JyYW5kcy9baWRdL2xvZ28vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXNFO0FBQ3RFLG9GQUF1RjtBQUN2RixpRkFBbUY7QUFHbkYsdUJBQXVCO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUEwQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUMzRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMxQixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQVEsQ0FBQztJQUU3RCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztZQUNkLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUk7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7QUFDSCxDQUFDLENBQUM7QUFsQlcsUUFBQSxHQUFHLE9Ba0Jk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
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
// GET - Get all products for a brand
|
|
6
|
+
const GET = async (req, res) => {
|
|
7
|
+
const { id } = req.params;
|
|
8
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
9
|
+
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
10
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
11
|
+
try {
|
|
12
|
+
const parsedLimit = Number(req.query.limit);
|
|
13
|
+
const parsedOffset = Number(req.query.offset);
|
|
14
|
+
const limit = Math.min(Math.max(Number.isFinite(parsedLimit) ? parsedLimit : 20, 1), 100);
|
|
15
|
+
const offset = Math.max(Number.isFinite(parsedOffset) ? parsedOffset : 0, 0);
|
|
16
|
+
// Verify brand exists
|
|
17
|
+
const brand = await brandService.retrieveBrand(id);
|
|
18
|
+
if (!brand) {
|
|
19
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
20
|
+
}
|
|
21
|
+
// Get all product-brand associations for this brand
|
|
22
|
+
const productBrands = await brandService.listProductBrands({
|
|
23
|
+
brand_id: id,
|
|
24
|
+
});
|
|
25
|
+
const total = productBrands.length;
|
|
26
|
+
if (total === 0) {
|
|
27
|
+
return res.json({
|
|
28
|
+
products: [],
|
|
29
|
+
count: 0,
|
|
30
|
+
offset,
|
|
31
|
+
limit,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const paginatedAssociations = productBrands.slice(offset, offset + limit);
|
|
35
|
+
// Get product IDs
|
|
36
|
+
const productIds = paginatedAssociations.map((pb) => pb.product_id);
|
|
37
|
+
// Fetch products from product module
|
|
38
|
+
const products = await productModuleService.listProducts({
|
|
39
|
+
id: productIds,
|
|
40
|
+
});
|
|
41
|
+
const count = total;
|
|
42
|
+
return res.json({
|
|
43
|
+
products,
|
|
44
|
+
count,
|
|
45
|
+
offset,
|
|
46
|
+
limit,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.error(`Error getting products for brand ${id}:`, error);
|
|
51
|
+
return res.status(500).json({ error: "Failed to get brand products" });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.GET = GET;
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2JyYW5kcy9baWRdL3Byb2R1Y3RzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUErRTtBQUcvRSxxQ0FBcUM7QUFDOUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzFCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBUSxDQUFDO0lBQzdELE1BQU0sb0JBQW9CLEdBQTBCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNuRSxlQUFPLENBQUMsT0FBTyxDQUNoQixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDNUQsR0FBRyxDQUNKLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDaEQsQ0FBQyxDQUNGLENBQUM7UUFFRixzQkFBc0I7UUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxZQUFZLENBQUMsaUJBQWlCLENBQUM7WUFDekQsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ25DLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDZCxRQUFRLEVBQUUsRUFBRTtnQkFDWixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNO2dCQUNOLEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFMUUsa0JBQWtCO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBFLHFDQUFxQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFlBQVksQ0FBQztZQUN2RCxFQUFFLEVBQUUsVUFBVTtTQUNmLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVwQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxRQUFRO1lBQ1IsS0FBSztZQUNMLE1BQU07WUFDTixLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLDhCQUE4QixFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBaEVXLFFBQUEsR0FBRyxPQWdFZCJ9
|