@lodashventure/medusa-brand 1.2.20 → 1.2.25
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,117 @@
|
|
|
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
|
+
// GET - Get brand for a product
|
|
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
|
+
// Verify product exists
|
|
13
|
+
const product = await productModuleService.retrieveProduct(id);
|
|
14
|
+
if (!product) {
|
|
15
|
+
return res.status(404).json({ error: "Product not found" });
|
|
16
|
+
}
|
|
17
|
+
// Get product-brand association
|
|
18
|
+
const productBrand = await brandService.listProductBrands({
|
|
19
|
+
product_id: id,
|
|
20
|
+
}).then((result) => result[0]);
|
|
21
|
+
if (!productBrand) {
|
|
22
|
+
return res.json({ brand: null });
|
|
23
|
+
}
|
|
24
|
+
// Get brand details
|
|
25
|
+
const brand = await brandService.retrieveBrand(productBrand.brand_id);
|
|
26
|
+
return res.json({ brand });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.error(`Error getting brand for product ${id}:`, error);
|
|
30
|
+
return res.status(500).json({ error: "Failed to get product brand" });
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.GET = GET;
|
|
34
|
+
// POST - Assign a brand to a product
|
|
35
|
+
const POST = async (req, res) => {
|
|
36
|
+
const { id } = req.params;
|
|
37
|
+
const { brand_id } = req.body;
|
|
38
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
39
|
+
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
40
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
41
|
+
try {
|
|
42
|
+
if (!brand_id) {
|
|
43
|
+
return res.status(400).json({ error: "brand_id is required" });
|
|
44
|
+
}
|
|
45
|
+
// Verify product exists
|
|
46
|
+
const product = await productModuleService.retrieveProduct(id);
|
|
47
|
+
if (!product) {
|
|
48
|
+
return res.status(404).json({ error: "Product not found" });
|
|
49
|
+
}
|
|
50
|
+
// Verify brand exists
|
|
51
|
+
const brand = await brandService.retrieveBrand(brand_id);
|
|
52
|
+
if (!brand) {
|
|
53
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
54
|
+
}
|
|
55
|
+
// Check if product already has a brand
|
|
56
|
+
const existingProductBrand = await brandService.listProductBrands({
|
|
57
|
+
product_id: id,
|
|
58
|
+
}).then((result) => result[0]);
|
|
59
|
+
if (existingProductBrand) {
|
|
60
|
+
// Update existing association
|
|
61
|
+
await brandService.updateProductBrands([{
|
|
62
|
+
id: existingProductBrand.id,
|
|
63
|
+
brand_id: brand_id,
|
|
64
|
+
}]);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Create new association
|
|
68
|
+
await brandService.createProductBrands([{
|
|
69
|
+
product_id: id,
|
|
70
|
+
brand_id: brand_id,
|
|
71
|
+
}]);
|
|
72
|
+
}
|
|
73
|
+
return res.json({
|
|
74
|
+
message: "Brand assigned successfully",
|
|
75
|
+
product_id: id,
|
|
76
|
+
brand_id: brand_id,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger.error(`Error assigning brand to product ${id}:`, error);
|
|
81
|
+
return res.status(500).json({ error: "Failed to assign brand to product" });
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
exports.POST = POST;
|
|
85
|
+
// DELETE - Remove brand from a product
|
|
86
|
+
const DELETE = async (req, res) => {
|
|
87
|
+
const { id } = req.params;
|
|
88
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
89
|
+
const productModuleService = req.scope.resolve(utils_1.Modules.PRODUCT);
|
|
90
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
91
|
+
try {
|
|
92
|
+
// Verify product exists
|
|
93
|
+
const product = await productModuleService.retrieveProduct(id);
|
|
94
|
+
if (!product) {
|
|
95
|
+
return res.status(404).json({ error: "Product not found" });
|
|
96
|
+
}
|
|
97
|
+
// Get product-brand association
|
|
98
|
+
const productBrand = await brandService.listProductBrands({
|
|
99
|
+
product_id: id,
|
|
100
|
+
}).then((result) => result[0]);
|
|
101
|
+
if (!productBrand) {
|
|
102
|
+
return res.status(404).json({ error: "Product has no brand assigned" });
|
|
103
|
+
}
|
|
104
|
+
// Delete the association
|
|
105
|
+
await brandService.deleteProductBrands([productBrand.id]);
|
|
106
|
+
return res.json({
|
|
107
|
+
message: "Brand removed from product successfully",
|
|
108
|
+
product_id: id,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
logger.error(`Error removing brand from product ${id}:`, error);
|
|
113
|
+
return res.status(500).json({ error: "Failed to remove brand from product" });
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
exports.DELETE = DELETE;
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Byb2R1Y3RzL1tpZF0vYnJhbmQvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSUEscURBQStFO0FBSS9FLGdDQUFnQztBQUN6QixNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLEVBQUU7SUFDRixNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMxQixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQVEsQ0FBQztJQUM3RCxNQUFNLG9CQUFvQixHQUEwQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkUsSUFBSSxDQUFDO1FBQ0gsd0JBQXdCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxZQUFZLENBQUMsaUJBQWlCLENBQUM7WUFDeEQsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztR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
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.attachBrandToProducts = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
// Middleware to attach brand information to product responses
|
|
6
|
+
const attachBrandToProducts = async (req, res, next) => {
|
|
7
|
+
// Store original json method
|
|
8
|
+
const originalJson = res.json.bind(res);
|
|
9
|
+
// Override json method to inject brand data
|
|
10
|
+
res.json = function (data) {
|
|
11
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
12
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
13
|
+
// Process asynchronously and then call original json
|
|
14
|
+
(async () => {
|
|
15
|
+
try {
|
|
16
|
+
// Handle single product response (admin and store)
|
|
17
|
+
if (data?.product?.id) {
|
|
18
|
+
try {
|
|
19
|
+
// Get product-brand association
|
|
20
|
+
const productBrand = await brandService
|
|
21
|
+
.listProductBrands({
|
|
22
|
+
product_id: data.product.id,
|
|
23
|
+
})
|
|
24
|
+
.then((result) => result[0]);
|
|
25
|
+
if (productBrand) {
|
|
26
|
+
// Get brand details
|
|
27
|
+
const brand = await brandService.retrieveBrand(productBrand.brand_id);
|
|
28
|
+
data.product.brand = brand;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
data.product.brand = null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logger.error(`Error attaching brand to product ${data.product.id}:`, error);
|
|
36
|
+
data.product.brand = null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Handle multiple products response
|
|
40
|
+
if (data?.products && Array.isArray(data.products)) {
|
|
41
|
+
const productIds = data.products.map((p) => p.id);
|
|
42
|
+
try {
|
|
43
|
+
// Get all product-brand associations for these products
|
|
44
|
+
const productBrands = await brandService.listProductBrands({
|
|
45
|
+
product_id: { $in: productIds },
|
|
46
|
+
});
|
|
47
|
+
// Create a map for quick lookup
|
|
48
|
+
const brandMap = new Map();
|
|
49
|
+
const productBrandMap = new Map();
|
|
50
|
+
// Map product brands for quick lookup
|
|
51
|
+
productBrands.forEach((pb) => {
|
|
52
|
+
productBrandMap.set(pb.product_id, pb.brand_id);
|
|
53
|
+
});
|
|
54
|
+
// Fetch all unique brand IDs
|
|
55
|
+
const brandIds = [
|
|
56
|
+
...new Set(productBrands.map((pb) => pb.brand_id)),
|
|
57
|
+
];
|
|
58
|
+
if (brandIds.length > 0) {
|
|
59
|
+
// Fetch all brands at once
|
|
60
|
+
const brands = await Promise.all(brandIds.map((id) => brandService.retrieveBrand(id).catch(() => null)));
|
|
61
|
+
// Map brands by ID
|
|
62
|
+
brands.forEach((brand) => {
|
|
63
|
+
if (brand) {
|
|
64
|
+
brandMap.set(brand.id, brand);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
// Attach brands to products
|
|
68
|
+
data.products = data.products.map((product) => {
|
|
69
|
+
const brandId = productBrandMap.get(product.id);
|
|
70
|
+
if (brandId && brandMap.has(brandId)) {
|
|
71
|
+
product.brand = brandMap.get(brandId);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
product.brand = null;
|
|
75
|
+
}
|
|
76
|
+
return product;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// No brands found, set all to null
|
|
81
|
+
data.products = data.products.map((product) => {
|
|
82
|
+
product.brand = null;
|
|
83
|
+
return product;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.error("Error attaching brands to products:", error);
|
|
89
|
+
// On error, set all brands to null
|
|
90
|
+
data.products = data.products.map((product) => {
|
|
91
|
+
product.brand = null;
|
|
92
|
+
return product;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
// Silently fail and continue without brand data
|
|
99
|
+
console.error("Brand middleware error:", error);
|
|
100
|
+
}
|
|
101
|
+
// Call original json method with potentially modified data
|
|
102
|
+
originalJson(data);
|
|
103
|
+
})();
|
|
104
|
+
// Return the response object synchronously
|
|
105
|
+
return res;
|
|
106
|
+
};
|
|
107
|
+
next();
|
|
108
|
+
};
|
|
109
|
+
exports.attachBrandToProducts = attachBrandToProducts;
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoLWJyYW5kLXRvLXByb2R1Y3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlcy9hdHRhY2gtYnJhbmQtdG8tcHJvZHVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQXNFO0FBRXRFLDhEQUE4RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLEtBQUssRUFDeEMsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsSUFBd0IsRUFDeEIsRUFBRTtJQUNGLDZCQUE2QjtJQUM3QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTJCLENBQUM7SUFFbEUsNENBQTRDO0lBQzVDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFTO1FBQzVCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBUSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5FLHFEQUFxRDtRQUNyRCxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ1YsSUFBSSxDQUFDO2dCQUNILG1EQUFtRDtnQkFDbkQsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUM7d0JBQ0gsZ0NBQWdDO3dCQUNoQyxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVk7NkJBQ3BDLGlCQUFpQixDQUFDOzRCQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO3lCQUM1QixDQUFDOzZCQUNELElBQUksQ0FBQyxDQUFDLE1BQWEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBRXRDLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ2pCLG9CQUFv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
|
|
@@ -0,0 +1,53 @@
|
|
|
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 medusa_1 = require("@medusajs/medusa");
|
|
7
|
+
const multer_1 = __importDefault(require("multer"));
|
|
8
|
+
const attach_brand_to_products_1 = require("./middlewares/attach-brand-to-products");
|
|
9
|
+
const upload = (0, multer_1.default)({
|
|
10
|
+
storage: multer_1.default.memoryStorage(),
|
|
11
|
+
limits: {
|
|
12
|
+
fileSize: 10 * 1024 * 1024, // 10MB max
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
const rawSingleBrandAssetUpload = upload.single("file");
|
|
16
|
+
const singleBrandAssetUpload = (req, res, next) => {
|
|
17
|
+
rawSingleBrandAssetUpload(req, res, next);
|
|
18
|
+
};
|
|
19
|
+
exports.default = (0, medusa_1.defineMiddlewares)({
|
|
20
|
+
routes: [
|
|
21
|
+
{
|
|
22
|
+
method: ["GET"],
|
|
23
|
+
matcher: "/admin/products",
|
|
24
|
+
middlewares: [attach_brand_to_products_1.attachBrandToProducts],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
method: ["GET"],
|
|
28
|
+
matcher: "/admin/products/:id",
|
|
29
|
+
middlewares: [attach_brand_to_products_1.attachBrandToProducts],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
method: ["GET"],
|
|
33
|
+
matcher: "/store/products",
|
|
34
|
+
middlewares: [attach_brand_to_products_1.attachBrandToProducts],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
method: ["GET"],
|
|
38
|
+
matcher: "/store/products/:id",
|
|
39
|
+
middlewares: [attach_brand_to_products_1.attachBrandToProducts],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
method: ["POST"],
|
|
43
|
+
matcher: "/admin/brands/:id/image",
|
|
44
|
+
middlewares: [singleBrandAssetUpload],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
method: ["POST"],
|
|
48
|
+
matcher: "/admin/brands/:id/logo",
|
|
49
|
+
middlewares: [singleBrandAssetUpload],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXFEO0FBRXJELG9EQUE0QjtBQUM1QixxRkFBK0U7QUFFL0UsTUFBTSxNQUFNLEdBQUcsSUFBQSxnQkFBTSxFQUFDO0lBQ3BCLE9BQU8sRUFBRSxnQkFBTSxDQUFDLGFBQWEsRUFBRTtJQUMvQixNQUFNLEVBQUU7UUFDTixRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsV0FBVztLQUN4QztDQUNGLENBQUMsQ0FBQztBQUVILE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUl4RCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLEdBQWtCLEVBQ2xCLEdBQW1CLEVBQ25CLElBQVksRUFDWixFQUFFO0lBQ0YseUJBQXlCLENBQUMsR0FBVSxFQUFFLEdBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUM7QUFFRixrQkFBZSxJQUFBLDBCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2YsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsQ0FBQyxnREFBcUIsQ0FBQztTQUNyQztRQUNEO1lBQ0UsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2YsT0FBTyxFQUFFLHFCQUFxQjtZQUM5QixXQUFXLEVBQUUsQ0FBQyxnREFBcUIsQ0FBQztTQUNyQztRQUNEO1lBQ0UsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2YsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsQ0FBQyxnREFBcUIsQ0FBQztTQUNyQztRQUNEO1lBQ0UsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2YsT0FBTyxFQUFFLHFCQUFxQjtZQUM5QixXQUFXLEVBQUUsQ0FBQyxnREFBcUIsQ0FBQztTQUNyQztRQUNEO1lBQ0UsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2hCLE9BQU8sRUFBRSx5QkFBeUI7WUFDbEMsV0FBVyxFQUFFLENBQUMsc0JBQXNCLENBQUM7U0FDdEM7UUFDRDtZQUNFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLFdBQVcsRUFBRSxDQUFDLHNCQUFzQixDQUFDO1NBQ3RDO0tBQ0Y7Q0FDRixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
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 brandService = req.scope.resolve("brandCustom");
|
|
8
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
9
|
+
try {
|
|
10
|
+
let brand = await brandService
|
|
11
|
+
.listBrands({ id, is_active: true })
|
|
12
|
+
.then((result) => result[0]);
|
|
13
|
+
if (!brand) {
|
|
14
|
+
brand = await brandService
|
|
15
|
+
.listBrands({ slug: id, is_active: true })
|
|
16
|
+
.then((result) => result[0]);
|
|
17
|
+
}
|
|
18
|
+
if (!brand) {
|
|
19
|
+
return res.status(404).json({ error: "Brand not found" });
|
|
20
|
+
}
|
|
21
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
22
|
+
return res.json({ brand });
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
logger.error(`Error retrieving brand ${id}:`, error);
|
|
26
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
27
|
+
return res.status(500).json({ error: "Failed to retrieve brand" });
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.GET = GET;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2JyYW5kcy9baWRdL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFzRTtBQUUvRCxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDMUIsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFRLENBQUM7SUFDN0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkUsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEdBQUcsTUFBTSxZQUFZO2FBQzNCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDbkMsSUFBSSxDQUFDLENBQUMsTUFBYSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxLQUFLLEdBQUcsTUFBTSxZQUFZO2lCQUN2QixVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDekMsSUFBSSxDQUFDLENBQUMsTUFBYSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDakUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDakUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztBQUNILENBQUMsQ0FBQztBQTNCVyxRQUFBLEdBQUcsT0EyQmQifQ==
|
|
@@ -0,0 +1,99 @@
|
|
|
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 ensureSingleValue = (value) => {
|
|
6
|
+
if (Array.isArray(value)) {
|
|
7
|
+
return ensureSingleValue(value[0]);
|
|
8
|
+
}
|
|
9
|
+
return typeof value === "string" ? value : undefined;
|
|
10
|
+
};
|
|
11
|
+
const parseNumber = (value, fallback) => {
|
|
12
|
+
if (!value) {
|
|
13
|
+
return fallback;
|
|
14
|
+
}
|
|
15
|
+
const parsed = Number(value);
|
|
16
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
17
|
+
};
|
|
18
|
+
const SORTABLE_FIELDS = new Set(["name", "created_at", "updated_at"]);
|
|
19
|
+
// GET - List all active brands for store
|
|
20
|
+
const GET = async (req, res) => {
|
|
21
|
+
const brandService = req.scope.resolve("brandCustom");
|
|
22
|
+
const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
23
|
+
try {
|
|
24
|
+
const searchTerm = ensureSingleValue(req.query.q);
|
|
25
|
+
const sortByQuery = ensureSingleValue(req.query.sort_by) || "name";
|
|
26
|
+
const sortOrderQuery = ensureSingleValue(req.query.sort_order) || "asc";
|
|
27
|
+
const limit = Math.min(Math.max(parseNumber(ensureSingleValue(req.query.limit), 10), 1), 100);
|
|
28
|
+
const offset = Math.max(parseNumber(ensureSingleValue(req.query.offset), 0), 0);
|
|
29
|
+
const filters = {
|
|
30
|
+
is_active: true,
|
|
31
|
+
};
|
|
32
|
+
if (searchTerm) {
|
|
33
|
+
filters.$or = [
|
|
34
|
+
{ name: { $ilike: `%${searchTerm}%` } },
|
|
35
|
+
{ slug: { $ilike: `%${searchTerm}%` } },
|
|
36
|
+
{ description: { $ilike: `%${searchTerm}%` } },
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
const orderField = SORTABLE_FIELDS.has(sortByQuery)
|
|
40
|
+
? sortByQuery
|
|
41
|
+
: "name";
|
|
42
|
+
const orderDirection = sortOrderQuery.toLowerCase() === "desc" ? "DESC" : "ASC";
|
|
43
|
+
if (typeof brandService.listAndCountBrands === "function") {
|
|
44
|
+
const [brands, count] = await brandService.listAndCountBrands(filters, {
|
|
45
|
+
limit,
|
|
46
|
+
offset,
|
|
47
|
+
order: { [orderField]: orderDirection },
|
|
48
|
+
select: [
|
|
49
|
+
"id",
|
|
50
|
+
"name",
|
|
51
|
+
"slug",
|
|
52
|
+
"description",
|
|
53
|
+
"image",
|
|
54
|
+
"logo",
|
|
55
|
+
"website",
|
|
56
|
+
"metadata",
|
|
57
|
+
],
|
|
58
|
+
});
|
|
59
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
60
|
+
return res.json({ brands, count, offset, limit });
|
|
61
|
+
}
|
|
62
|
+
const [brands, count] = await Promise.all([
|
|
63
|
+
brandService.listBrands(filters, {
|
|
64
|
+
limit,
|
|
65
|
+
offset,
|
|
66
|
+
order: { [orderField]: orderDirection },
|
|
67
|
+
select: [
|
|
68
|
+
"id",
|
|
69
|
+
"name",
|
|
70
|
+
"slug",
|
|
71
|
+
"description",
|
|
72
|
+
"image",
|
|
73
|
+
"logo",
|
|
74
|
+
"website",
|
|
75
|
+
"metadata",
|
|
76
|
+
],
|
|
77
|
+
}),
|
|
78
|
+
typeof brandService.countBrands === "function"
|
|
79
|
+
? brandService.countBrands(filters)
|
|
80
|
+
: brandService
|
|
81
|
+
.listBrands(filters)
|
|
82
|
+
.then((result) => result.length),
|
|
83
|
+
]);
|
|
84
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
85
|
+
return res.json({
|
|
86
|
+
brands,
|
|
87
|
+
count,
|
|
88
|
+
offset,
|
|
89
|
+
limit,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
logger.error("Error listing brands for store:", error);
|
|
94
|
+
res.setHeader("Content-Type", "application/json; charset=utf-8");
|
|
95
|
+
return res.status(500).json({ error: "Failed to list brands" });
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
exports.GET = GET;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2JyYW5kcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBc0U7QUFFdEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQWMsRUFBc0IsRUFBRTtJQUMvRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUF5QixFQUFFLFFBQWdCLEVBQUUsRUFBRTtJQUNsRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFdEUseUNBQXlDO0FBQ2xDLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQVEsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVuRSxJQUFJLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDO1FBQ25FLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDO1FBRXhFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2hFLEdBQUcsQ0FDSixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDckIsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25ELENBQUMsQ0FDRixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQTRCO1lBQ3ZDLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEdBQUcsR0FBRztnQkFDWixFQUFFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLFVBQVUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3ZDLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksVUFBVSxHQUFHLEVBQUUsRUFBRTtnQkFDdkMsRUFBRSxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxVQUFVLEdBQUcsRUFBRSxFQUFFO2FBQy9DLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDakQsQ0FBQyxDQUFFLFdBQW9EO1lBQ3ZELENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDWCxNQUFNLGNBQWMsR0FDbEIsY0FBYyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFM0QsSUFBSSxPQUFPLFlBQVksQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sWUFBWSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRTtnQkFDckUsS0FBSztnQkFDTCxNQUFNO2dCQUNOLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsY0FBYyxFQUFFO2dCQUN2QyxNQUFNLEVBQUU7b0JBQ04sSUFBSTtvQkFDSixNQUFNO29CQUNOLE1BQU07b0JBQ04sYUFBYTtvQkFDYixPQUFPO29CQUNQLE1BQU07b0JBQ04sU0FBUztvQkFDVCxVQUFVO2lCQUNYO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztZQUNqRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN4QyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDL0IsS0FBSztnQkFDTCxNQUFNO2dCQUNOLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsY0FBYyxFQUFFO2dCQUN2QyxNQUFNLEVBQUU7b0JBQ04sSUFBSTtvQkFDSixNQUFNO29CQUNOLE1BQU07b0JBQ04sYUFBYTtvQkFDYixPQUFPO29CQUNQLE1BQU07b0JBQ04sU0FBUztvQkFDVCxVQUFVO2lCQUNYO2FBQ0YsQ0FBQztZQUNGLE9BQU8sWUFBWSxDQUFDLFdBQVcsS0FBSyxVQUFVO2dCQUM1QyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxZQUFZO3FCQUNULFVBQVUsQ0FBQyxPQUFPLENBQUM7cUJBQ25CLElBQUksQ0FBQyxDQUFDLE1BQWlCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNqRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDZCxNQUFNO1lBQ04sS0FBSztZQUNMLE1BQU07WUFDTixLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDakUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUMsQ0FBQztBQTVGVyxRQUFBLEdBQUcsT0E0RmQifQ==
|
|
@@ -4,4 +4,4 @@ exports.BRAND_MODULE = void 0;
|
|
|
4
4
|
// Export the module name for use in medusa-config
|
|
5
5
|
var brand_1 = require("./modules/brand");
|
|
6
6
|
Object.defineProperty(exports, "BRAND_MODULE", { enumerable: true, get: function () { return brand_1.BRAND_MODULE; } });
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0RBQWtEO0FBQ2xELHlDQUErQztBQUF0QyxxR0FBQSxZQUFZLE9BQUEifQ==
|
|
@@ -10,4 +10,4 @@ exports.BRAND_MODULE = "brandCustom";
|
|
|
10
10
|
exports.default = (0, utils_1.Module)(exports.BRAND_MODULE, {
|
|
11
11
|
service: service_1.default,
|
|
12
12
|
});
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9icmFuZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBbUQ7QUFDbkQsd0RBQTJDO0FBRTlCLFFBQUEsWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUUxQyxrQkFBZSxJQUFBLGNBQU0sRUFBQyxvQkFBWSxFQUFFO0lBQ2xDLE9BQU8sRUFBRSxpQkFBa0I7Q0FDNUIsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProductBrand = exports.Brand = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
exports.Brand = utils_1.model
|
|
6
|
+
.define("brand", {
|
|
7
|
+
id: utils_1.model.id().primaryKey(),
|
|
8
|
+
name: utils_1.model.text().unique(),
|
|
9
|
+
slug: utils_1.model.text().unique(),
|
|
10
|
+
description: utils_1.model.text().nullable(),
|
|
11
|
+
image: utils_1.model.text().nullable(),
|
|
12
|
+
logo: utils_1.model.text().nullable(),
|
|
13
|
+
website: utils_1.model.text().nullable(),
|
|
14
|
+
is_active: utils_1.model.boolean().default(true),
|
|
15
|
+
metadata: utils_1.model.json().nullable(),
|
|
16
|
+
})
|
|
17
|
+
.indexes([
|
|
18
|
+
{
|
|
19
|
+
on: ["slug"],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
on: ["is_active"],
|
|
23
|
+
},
|
|
24
|
+
]);
|
|
25
|
+
exports.ProductBrand = utils_1.model
|
|
26
|
+
.define("product_brand", {
|
|
27
|
+
id: utils_1.model.id().primaryKey(),
|
|
28
|
+
product_id: utils_1.model.text(),
|
|
29
|
+
brand_id: utils_1.model.text(),
|
|
30
|
+
})
|
|
31
|
+
.indexes([
|
|
32
|
+
{
|
|
33
|
+
on: ["product_id"],
|
|
34
|
+
unique: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
on: ["brand_id"],
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9icmFuZC9tb2RlbHMvYnJhbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWtEO0FBRXJDLFFBQUEsS0FBSyxHQUFHLGFBQUs7S0FDdkIsTUFBTSxDQUFDLE9BQU8sRUFBRTtJQUNmLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFO0lBQzNCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFO0lBQzNCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdCLE9BQU8sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLFNBQVMsRUFBRSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN4QyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNsQyxDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1A7UUFDRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7S0FDYjtJQUNEO1FBQ0UsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDO0tBQ2xCO0NBQ0YsQ0FBQyxDQUFDO0FBRVEsUUFBQSxZQUFZLEdBQUcsYUFBSztLQUM5QixNQUFNLENBQUMsZUFBZSxFQUFFO0lBQ3ZCLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLFVBQVUsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3hCLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0NBQ3ZCLENBQUM7S0FDRCxPQUFPLENBQUM7SUFDUDtRQUNFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQztRQUNsQixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUM7S0FDakI7Q0FDRixDQUFDLENBQUMifQ==
|
|
@@ -8,4 +8,4 @@ class BrandModuleService extends (0, utils_1.MedusaService)({
|
|
|
8
8
|
}) {
|
|
9
9
|
}
|
|
10
10
|
exports.default = BrandModuleService;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2JyYW5kL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBMEQ7QUFDMUQsMENBQXFEO0FBRXJELE1BQXFCLGtCQUFtQixTQUFRLElBQUEscUJBQWEsRUFBQztJQUM1RCxLQUFLLEVBQUwsYUFBSztJQUNMLFlBQVksRUFBWixvQkFBWTtDQUNiLENBQUM7Q0FBRztBQUhMLHFDQUdLIn0=
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
const clientEmail = process.env.MEDUSA_BRAND_GCP_CLIENT_EMAIL || process.env.CLIENT_EMAIL;
|
|
8
|
+
const privateKeyRaw = process.env.MEDUSA_BRAND_GCP_PRIVATE_KEY || process.env.PRIVATE_KEY;
|
|
9
|
+
const projectId = process.env.MEDUSA_BRAND_GCP_PROJECT_ID || process.env.GCP_PROJECT_ID;
|
|
10
|
+
if (!clientEmail || !privateKeyRaw) {
|
|
11
|
+
throw new Error("Missing Google Cloud Storage credentials. Set MEDUSA_BRAND_GCP_CLIENT_EMAIL and MEDUSA_BRAND_GCP_PRIVATE_KEY or CLIENT_EMAIL and PRIVATE_KEY.");
|
|
12
|
+
}
|
|
13
|
+
const credentials = {
|
|
14
|
+
client_email: clientEmail,
|
|
15
|
+
private_key: privateKeyRaw.replace(/\\n/g, "\n"),
|
|
16
|
+
};
|
|
17
|
+
const storageConfig = {
|
|
18
|
+
credentials,
|
|
19
|
+
};
|
|
20
|
+
if (projectId) {
|
|
21
|
+
storageConfig.projectId = projectId;
|
|
22
|
+
}
|
|
23
|
+
this.storage = new storage_1.Storage(storageConfig);
|
|
24
|
+
this.bucketName =
|
|
25
|
+
process.env.MEDUSA_BRAND_GCP_BUCKET ||
|
|
26
|
+
process.env.BUCKET_NAME ||
|
|
27
|
+
"sangaroon";
|
|
28
|
+
this.baseUrl =
|
|
29
|
+
process.env.MEDUSA_BRAND_GCP_PUBLIC_BASE_URL ||
|
|
30
|
+
process.env.GCP_STORAGE_BASE_PUBLIC_URL ||
|
|
31
|
+
"https://storage.googleapis.com";
|
|
32
|
+
}
|
|
33
|
+
async uploadFile(filename, buffer, mimeType) {
|
|
34
|
+
try {
|
|
35
|
+
const bucket = this.storage.bucket(this.bucketName);
|
|
36
|
+
const file = bucket.file(filename);
|
|
37
|
+
await file.save(buffer, {
|
|
38
|
+
metadata: {
|
|
39
|
+
contentType: mimeType,
|
|
40
|
+
},
|
|
41
|
+
public: true,
|
|
42
|
+
resumable: false,
|
|
43
|
+
});
|
|
44
|
+
// Return the public URL
|
|
45
|
+
const sanitizedFilename = filename.replace(/^\/+/, "");
|
|
46
|
+
return `${this.baseUrl.replace(/\/+$/, "")}/${this.bucketName}/${sanitizedFilename}`;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error("Error uploading to GCS:", error);
|
|
50
|
+
const message = error instanceof Error ? error.message : "Unknown upload failure";
|
|
51
|
+
throw new Error(`Failed to upload file to GCS: ${message}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async deleteFile(filename) {
|
|
55
|
+
try {
|
|
56
|
+
const bucket = this.storage.bucket(this.bucketName);
|
|
57
|
+
const file = bucket.file(filename);
|
|
58
|
+
const [exists] = await file.exists();
|
|
59
|
+
if (exists) {
|
|
60
|
+
await file.delete();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error("Error deleting from GCS:", error);
|
|
65
|
+
// Don't throw on delete errors
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
getObjectKeyFromUrl(url) {
|
|
69
|
+
if (!url) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const normalizedBase = `${this.baseUrl.replace(/\/+$/, "")}/${this.bucketName}/`;
|
|
74
|
+
if (url.startsWith(normalizedBase)) {
|
|
75
|
+
return url.slice(normalizedBase.length);
|
|
76
|
+
}
|
|
77
|
+
const parsed = new URL(url);
|
|
78
|
+
const pathname = parsed.pathname.startsWith("/")
|
|
79
|
+
? parsed.pathname.slice(1)
|
|
80
|
+
: parsed.pathname;
|
|
81
|
+
if (pathname.startsWith(`${this.bucketName}/`)) {
|
|
82
|
+
return pathname.slice(this.bucketName.length + 1);
|
|
83
|
+
}
|
|
84
|
+
return pathname || null;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error("Failed to derive object key from URL:", error);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.GcsDirectUploadService = GcsDirectUploadService;
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2NzLWRpcmVjdC11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZ2NzLWRpcmVjdC11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBRWhELE1BQWEsc0JBQXNCO0lBS2pDO1FBQ0UsTUFBTSxXQUFXLEdBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztRQUN4RSxNQUFNLGFBQWEsR0FDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBRXhFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLCtJQUErSSxDQUNoSixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHO1lBQ2xCLFlBQVksRUFBRSxXQUFXO1lBQ3pCLFdBQVcsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7U0FDakQsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUE0QjtZQUM3QyxXQUFXO1NBQ1osQ0FBQztRQUVGLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxhQUFhLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLFVBQVU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QjtnQkFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXO2dCQUN2QixX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
|