@lodashventure/medusa-brand 1.2.20 → 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.
Files changed (48) hide show
  1. package/.medusa/server/src/admin/index.js +1191 -556
  2. package/.medusa/server/src/admin/index.mjs +1165 -530
  3. package/.medusa/server/src/api/admin/brands/[id]/image/route.js +178 -0
  4. package/.medusa/server/src/api/admin/brands/[id]/logo/route.js +179 -0
  5. package/.medusa/server/src/api/admin/brands/[id]/products/route.js +55 -0
  6. package/.medusa/server/src/api/admin/brands/[id]/route.js +251 -0
  7. package/.medusa/server/src/api/admin/brands/route.js +276 -0
  8. package/.medusa/server/src/api/admin/products/[id]/brand/route.js +117 -0
  9. package/.medusa/server/src/api/middlewares/attach-brand-to-products.js +110 -0
  10. package/.medusa/server/src/api/middlewares.js +53 -0
  11. package/.medusa/server/src/api/store/brands/[id]/route.js +31 -0
  12. package/.medusa/server/src/api/store/brands/route.js +99 -0
  13. package/.medusa/server/{index.js → src/index.js} +1 -1
  14. package/.medusa/server/{modules → src/modules}/brand/index.js +1 -1
  15. package/.medusa/server/src/modules/brand/models/brand.js +40 -0
  16. package/.medusa/server/{modules → src/modules}/brand/service.js +1 -1
  17. package/.medusa/server/src/services/gcs-direct-upload.js +93 -0
  18. package/.medusa/server/src/workflows/upload-brand-image.js +66 -0
  19. package/package.json +11 -10
  20. package/.medusa/server/api/admin/brands/[id]/image/route.d.ts +0 -5
  21. package/.medusa/server/api/admin/brands/[id]/image/route.js +0 -119
  22. package/.medusa/server/api/admin/brands/[id]/logo/route.d.ts +0 -5
  23. package/.medusa/server/api/admin/brands/[id]/logo/route.js +0 -119
  24. package/.medusa/server/api/admin/brands/[id]/products/route.d.ts +0 -2
  25. package/.medusa/server/api/admin/brands/[id]/products/route.js +0 -52
  26. package/.medusa/server/api/admin/brands/[id]/route.d.ts +0 -5
  27. package/.medusa/server/api/admin/brands/[id]/route.js +0 -112
  28. package/.medusa/server/api/admin/brands/route.d.ts +0 -4
  29. package/.medusa/server/api/admin/brands/route.js +0 -76
  30. package/.medusa/server/api/admin/products/[id]/brand/route.d.ts +0 -5
  31. package/.medusa/server/api/admin/products/[id]/brand/route.js +0 -117
  32. package/.medusa/server/api/middlewares/attach-brand-to-products.d.ts +0 -2
  33. package/.medusa/server/api/middlewares/attach-brand-to-products.js +0 -105
  34. package/.medusa/server/api/middlewares.d.ts +0 -6
  35. package/.medusa/server/api/middlewares.js +0 -27
  36. package/.medusa/server/api/store/brands/route.d.ts +0 -2
  37. package/.medusa/server/api/store/brands/route.js +0 -53
  38. package/.medusa/server/index.d.ts +0 -1
  39. package/.medusa/server/modules/brand/index.d.ts +0 -35
  40. package/.medusa/server/modules/brand/migrations/Migration20251021070648.d.ts +0 -5
  41. package/.medusa/server/modules/brand/migrations/Migration20251021070648.js +0 -28
  42. package/.medusa/server/modules/brand/models/brand.d.ts +0 -16
  43. package/.medusa/server/modules/brand/models/brand.js +0 -43
  44. package/.medusa/server/modules/brand/service.d.ts +0 -21
  45. package/.medusa/server/services/gcs-direct-upload.d.ts +0 -8
  46. package/.medusa/server/services/gcs-direct-upload.js +0 -55
  47. package/.medusa/server/workflows/upload-brand-image.d.ts +0 -15
  48. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoLWJyYW5kLXRvLXByb2R1Y3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlcy9hdHRhY2gtYnJhbmQtdG8tcHJvZHVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQXNFO0FBRXRFLDhEQUE4RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLEtBQUssRUFDeEMsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsSUFBd0IsRUFDeEIsRUFBRTtJQUNGLDZCQUE2QjtJQUM3QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTJCLENBQUM7SUFFbEUsNENBQTRDO0lBQzVDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsVUFBVSxJQUFTO1FBQzVCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBUSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5FLHFEQUFxRDtRQUNyRCxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ1YsSUFBSSxDQUFDO2dCQUNILG1EQUFtRDtnQkFDbkQsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUM7d0JBQ0gsZ0NBQWdDO3dCQUNoQyxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVk7NkJBQ3BDLGlCQUFpQixDQUFDOzRCQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO3lCQUM1QixDQUFDOzZCQUNELElBQUksQ0FBQyxDQUFDLE1BQWEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBRXRDLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ2pCLG9CQUFvQjs0QkFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUM1QyxZQUFZLENBQUMsUUFBUSxDQUN0QixDQUFDOzRCQUNGLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt3QkFDN0IsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzt3QkFDNUIsQ0FBQztvQkFDSCxDQUFDO29CQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7d0JBQ2YsTUFBTSxDQUFDLEtBQUssQ0FDVixvQ0FBb0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFDdEQsS0FBSyxDQUNOLENBQUM7d0JBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7Z0JBRUQsb0NBQW9DO2dCQUNwQyxJQUFJLElBQUksRUFBRSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDbkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFdkQsSUFBSSxDQUFDO3dCQUNILHdEQUF3RDt3QkFDeEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxZQUFZLENBQUMsaUJBQWlCLENBQUM7NEJBQ3pELFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUU7eUJBQ2hDLENBQUMsQ0FBQzt3QkFFSCxnQ0FBZ0M7d0JBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7d0JBQzNCLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7d0JBRWxDLHNDQUFzQzt3QkFDdEMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFOzRCQUNoQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNsRCxDQUFDLENBQUMsQ0FBQzt3QkFFSCw2QkFBNkI7d0JBQzdCLE1BQU0sUUFBUSxHQUFHOzRCQUNmLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUN4RCxDQUFDO3dCQUVGLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDeEIsMkJBQTJCOzRCQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUMxQixZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDakQsQ0FDRixDQUFDOzRCQUVGLG1CQUFtQjs0QkFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dDQUM1QixJQUFJLEtBQUssRUFBRSxDQUFDO29DQUNWLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQ0FDaEMsQ0FBQzs0QkFDSCxDQUFDLENBQUMsQ0FBQzs0QkFFSCw0QkFBNEI7NEJBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQ0FDakQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQ2hELElBQUksT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQ0FDckMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dDQUN4QyxDQUFDO3FDQUFNLENBQUM7b0NBQ04sT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0NBQ3ZCLENBQUM7Z0NBQ0QsT0FBTyxPQUFPLENBQUM7NEJBQ2pCLENBQUMsQ0FBQyxDQUFDO3dCQUNMLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixtQ0FBbUM7NEJBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQ0FDakQsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0NBQ3JCLE9BQU8sT0FBTyxDQUFDOzRCQUNqQixDQUFDLENBQUMsQ0FBQzt3QkFDTCxDQUFDO29CQUNILENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMzRCxtQ0FBbUM7d0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTs0QkFDakQsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7NEJBQ3JCLE9BQU8sT0FBTyxDQUFDO3dCQUNqQixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixnREFBZ0Q7Z0JBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUVELDJEQUEyRDtZQUMzRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVMLDJDQUEyQztRQUMzQyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGLElBQUksRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDO0FBM0hXLFFBQUEscUJBQXFCLHlCQTJIaEMifQ==
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2JyYW5kcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBc0U7QUFFdEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQWMsRUFBc0IsRUFBRTtJQUMvRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUF5QixFQUFFLFFBQWdCLEVBQUUsRUFBRTtJQUNsRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFdEUseUNBQXlDO0FBQ2xDLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQVEsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxHQUFH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
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0RBQWtEO0FBQ2xELHlDQUErQztBQUF0QyxxR0FBQSxZQUFZLE9BQUEifQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9icmFuZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBbUQ7QUFDbkQsd0RBQTJDO0FBRTlCLFFBQUEsWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUUxQyxrQkFBZSxJQUFBLGNBQU0sRUFBQyxvQkFBWSxFQUFFO0lBQ2xDLE9BQU8sRUFBRSxpQkFBa0I7Q0FDNUIsQ0FBQyxDQUFDIn0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2JyYW5kL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBMEQ7QUFDMUQsMENBQXFEO0FBRXJELE1BQXFCLGtCQUFtQixTQUFRLElBQUEscUJBQWEsRUFBQztJQUM1RCxLQUFLLEVBQUwsYUFBSztJQUNMLFlBQVksRUFBWixvQkFBWTtDQUNiLENBQUM7Q0FBRztBQUhMLHFDQUdLIn0=
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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