@devx-commerce/plugin-gati 0.0.34-beta.1 → 0.0.34

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 (107) hide show
  1. package/.medusa/server/development/erp-order-payload-example.js +76 -0
  2. package/.medusa/server/src/api/admin/middlewares.js +2 -6
  3. package/.medusa/server/src/api/erp/webhook/config.js +6 -32
  4. package/.medusa/server/src/api/store/middleware.js +1 -3
  5. package/.medusa/server/src/modules/erp/service.js +1 -14
  6. package/.medusa/server/src/modules/extended-product/models/extended-product.js +9 -89
  7. package/.medusa/server/src/modules/extended-variant/models/extended-variant.js +12 -145
  8. package/.medusa/server/src/modules/raw-master/models/raw-master.js +1 -2
  9. package/.medusa/server/src/modules/shape-master/models/shape-master.js +1 -2
  10. package/.medusa/server/src/subscribers/cutomer-updated.js +2 -1
  11. package/.medusa/server/src/subscribers/party-master.js +2 -2
  12. package/.medusa/server/src/workflows/create-or-update-product-options/steps/create-update-product-options.js +2 -39
  13. package/.medusa/server/src/workflows/helpers/product-helper.js +106 -409
  14. package/.medusa/server/src/workflows/inward-master/helper/index.js +39 -88
  15. package/.medusa/server/src/workflows/party-master/steps/delete-party.js +7 -4
  16. package/.medusa/server/src/workflows/party-master/workflows/create-or-update-party-master.js +49 -1
  17. package/.medusa/server/src/workflows/party-master/workflows/index.js +1 -2
  18. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-deletion.js +189 -307
  19. package/.medusa/server/src/workflows/party-style-master/workflows/create-or-update-party-style-master.js +4 -120
  20. package/.medusa/server/src/workflows/raw-master/steps/delete-raw.js +11 -9
  21. package/.medusa/server/src/workflows/shape-master/steps/delete-shape.js +9 -9
  22. package/package.json +1 -1
  23. package/.medusa/server/src/api/admin/masters/[master]/[id]/route.js +0 -121
  24. package/.medusa/server/src/api/admin/masters/[master]/route.js +0 -33
  25. package/.medusa/server/src/api/admin/masters/middlewares.js +0 -35
  26. package/.medusa/server/src/api/admin/masters/query-config.js +0 -14
  27. package/.medusa/server/src/api/admin/masters/search-middleware.js +0 -16
  28. package/.medusa/server/src/api/admin/masters/utils.js +0 -108
  29. package/.medusa/server/src/api/admin/masters/validators.js +0 -28
  30. package/.medusa/server/src/api/admin/variant-options/sync/route.js +0 -313
  31. package/.medusa/server/src/api/store/gold-rate/current/route.js +0 -70
  32. package/.medusa/server/src/api/store/gold-rate/historical/route.js +0 -108
  33. package/.medusa/server/src/api/store/gold-rate/middleware.js +0 -19
  34. package/.medusa/server/src/api/store/gold-rate/validators.js +0 -37
  35. package/.medusa/server/src/jobs/process-variant-option-sync.js +0 -521
  36. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251031061116.js +0 -14
  37. package/.medusa/server/src/modules/category-group-master/migrations/Migration20251104045912.js +0 -14
  38. package/.medusa/server/src/modules/category-master/migrations/Migration20251031061327.js +0 -14
  39. package/.medusa/server/src/modules/category-master/migrations/Migration20251104045755.js +0 -14
  40. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251031061432.js +0 -14
  41. package/.medusa/server/src/modules/collection-group-master/migrations/Migration20251104050102.js +0 -14
  42. package/.medusa/server/src/modules/collection-master/migrations/Migration20251031060941.js +0 -14
  43. package/.medusa/server/src/modules/collection-master/migrations/Migration20251104050012.js +0 -14
  44. package/.medusa/server/src/modules/discount-master/migrations/Migration20251031061523.js +0 -14
  45. package/.medusa/server/src/modules/discount-master/migrations/Migration20251104050153.js +0 -14
  46. package/.medusa/server/src/modules/extended-product/migrations/Migration20251103182726.js +0 -14
  47. package/.medusa/server/src/modules/extended-product/migrations/Migration20251119062526.js +0 -16
  48. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202055742.js +0 -14
  49. package/.medusa/server/src/modules/extended-product/migrations/Migration20251202064200.js +0 -16
  50. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251119063328.js +0 -20
  51. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120045708.js +0 -14
  52. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120051832.js +0 -14
  53. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251120052514.js +0 -14
  54. package/.medusa/server/src/modules/extended-variant/migrations/Migration20251202055952.js +0 -14
  55. package/.medusa/server/src/modules/item-size-master/index.js +0 -13
  56. package/.medusa/server/src/modules/item-size-master/migrations/Migration20251031111036.js +0 -17
  57. package/.medusa/server/src/modules/item-size-master/models/item-size-master.js +0 -14
  58. package/.medusa/server/src/modules/item-size-master/service.js +0 -10
  59. package/.medusa/server/src/modules/party-master/migrations/Migration20251031061657.js +0 -14
  60. package/.medusa/server/src/modules/party-master/migrations/Migration20251104050242.js +0 -14
  61. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251031061829.js +0 -14
  62. package/.medusa/server/src/modules/promocode-master/migrations/Migration20251104050332.js +0 -14
  63. package/.medusa/server/src/modules/quality-master/index.js +0 -13
  64. package/.medusa/server/src/modules/quality-master/migrations/Migration20251031095211.js +0 -16
  65. package/.medusa/server/src/modules/quality-master/migrations/Migration20251105045114.js +0 -14
  66. package/.medusa/server/src/modules/quality-master/models/quality-master.js +0 -17
  67. package/.medusa/server/src/modules/quality-master/service.js +0 -10
  68. package/.medusa/server/src/modules/raw-master/migrations/Migration20251031061912.js +0 -14
  69. package/.medusa/server/src/modules/shape-master/migrations/Migration20251031062019.js +0 -14
  70. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251031062128.js +0 -14
  71. package/.medusa/server/src/modules/shipping-info-master/migrations/Migration20251104050501.js +0 -14
  72. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251031062303.js +0 -14
  73. package/.medusa/server/src/modules/sub-category-master/migrations/Migration20251104050743.js +0 -14
  74. package/.medusa/server/src/modules/tone-master/index.js +0 -13
  75. package/.medusa/server/src/modules/tone-master/migrations/Migration20251031104320.js +0 -16
  76. package/.medusa/server/src/modules/tone-master/models/tone-master.js +0 -15
  77. package/.medusa/server/src/modules/tone-master/service.js +0 -10
  78. package/.medusa/server/src/modules/variant-option-sync-queue/index.js +0 -13
  79. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251101082220.js +0 -19
  80. package/.medusa/server/src/modules/variant-option-sync-queue/migrations/Migration20251103123857.js +0 -16
  81. package/.medusa/server/src/modules/variant-option-sync-queue/models/variant-option-sync-queue.js +0 -23
  82. package/.medusa/server/src/modules/variant-option-sync-queue/service.js +0 -49
  83. package/.medusa/server/src/utils/build-redis-key.js +0 -30
  84. package/.medusa/server/src/workflows/helpers/update-variant-option-metadata.js +0 -105
  85. package/.medusa/server/src/workflows/helpers/variant-helper.js +0 -212
  86. package/.medusa/server/src/workflows/item-size-master/create-or-update-item-size-master.js +0 -51
  87. package/.medusa/server/src/workflows/item-size-master/index.js +0 -15
  88. package/.medusa/server/src/workflows/item-size-master/steps/create-item-size.js +0 -21
  89. package/.medusa/server/src/workflows/item-size-master/steps/delete-item-size.js +0 -23
  90. package/.medusa/server/src/workflows/item-size-master/steps/fetch-item-size-master.js +0 -55
  91. package/.medusa/server/src/workflows/item-size-master/steps/update-item-size.js +0 -36
  92. package/.medusa/server/src/workflows/party-master/workflows/delete-party-master.js +0 -60
  93. package/.medusa/server/src/workflows/party-style-master/steps/update-product-options-after-variant-update.js +0 -367
  94. package/.medusa/server/src/workflows/quality-master/create-or-update-quality-master.js +0 -58
  95. package/.medusa/server/src/workflows/quality-master/index.js +0 -30
  96. package/.medusa/server/src/workflows/quality-master/steps/create-quality.js +0 -22
  97. package/.medusa/server/src/workflows/quality-master/steps/delete-quality.js +0 -20
  98. package/.medusa/server/src/workflows/quality-master/steps/fetch-quality-master.js +0 -54
  99. package/.medusa/server/src/workflows/quality-master/steps/update-quality.js +0 -37
  100. package/.medusa/server/src/workflows/raw-master/create-or-update-raw-master.js +0 -58
  101. package/.medusa/server/src/workflows/shape-master/create-or-update-shape-master.js +0 -53
  102. package/.medusa/server/src/workflows/tone-master/create-or-update-tone-master.js +0 -52
  103. package/.medusa/server/src/workflows/tone-master/index.js +0 -30
  104. package/.medusa/server/src/workflows/tone-master/steps/create-tone.js +0 -22
  105. package/.medusa/server/src/workflows/tone-master/steps/delete-tone.js +0 -20
  106. package/.medusa/server/src/workflows/tone-master/steps/fetch-tone-master.js +0 -54
  107. package/.medusa/server/src/workflows/tone-master/steps/update-tone.js +0 -37
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handleMastersSearch = handleMastersSearch;
4
- const utils_1 = require("./utils");
5
- function handleMastersSearch(req, _res, next) {
6
- const { q } = req.validatedQuery || {};
7
- const { master } = req.params || {};
8
- const or = (0, utils_1.buildSearchOr)(master, q);
9
- if (or && or.length) {
10
- req.filterableFields = req.filterableFields || {};
11
- req.filterableFields.$or = or;
12
- delete req.validatedQuery.q;
13
- }
14
- next();
15
- }
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLW1pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL21hc3RlcnMvc2VhcmNoLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxrREFjQztBQWhCRCxtQ0FBd0M7QUFFeEMsU0FBZ0IsbUJBQW1CLENBQ2pDLEdBQWtCLEVBQ2xCLElBQW9CLEVBQ3BCLElBQXdCO0lBRXhCLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBSSxHQUFHLENBQUMsY0FBc0IsSUFBSSxFQUFFLENBQUM7SUFDaEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFJLEdBQUcsQ0FBQyxNQUFjLElBQUksRUFBRSxDQUFDO0lBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUEscUJBQWEsRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1FBQ2pELEdBQUcsQ0FBQyxnQkFBd0IsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLE9BQVEsR0FBRyxDQUFDLGNBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJLEVBQUUsQ0FBQztBQUNULENBQUMifQ==
@@ -1,108 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SEARCHABLE_FIELDS = exports.ALLOWED_ORDER_FIELDS = void 0;
4
- exports.getServiceForType = getServiceForType;
5
- exports.getUpdateMethodForType = getUpdateMethodForType;
6
- exports.parseOrderParam = parseOrderParam;
7
- exports.buildSearchOr = buildSearchOr;
8
- exports.parseDashOrder = parseDashOrder;
9
- const TYPE_TO_SERVICE = {
10
- CategoryMst: "category_master",
11
- SubCategoryMst: "sub_category_master",
12
- CollectionMst: "collection_master",
13
- CollectionGroupMst: "collection_group_master",
14
- CategoryGroupMst: "category_group_master",
15
- RawMst: "raw_master",
16
- ShapeMst: "shape_master",
17
- DiscountMst: "discount_master",
18
- PartyMst: "party_master",
19
- PromocodeMst: "promocode_master",
20
- PartyShippingInfo: "shipping_info_master",
21
- QualityMst: "quality_master",
22
- ToneMst: "tone_master",
23
- ItemSizeMst: "item_size_master",
24
- };
25
- function getServiceForType(type) {
26
- return TYPE_TO_SERVICE[type];
27
- }
28
- const TYPE_TO_UPDATE_METHOD = {
29
- CategoryMst: "updateCategoryMasters",
30
- SubCategoryMst: "updateSubCategoryMasters",
31
- CollectionMst: "updateCollectionMasters",
32
- CollectionGroupMst: "updateCollectionGroupMasters",
33
- CategoryGroupMst: "updateCategoryGroupMasters",
34
- RawMst: "updateRawMasters",
35
- ShapeMst: "updateShapeMasters",
36
- DiscountMst: "updateDiscountMasters",
37
- PartyMst: "updatePartyMasters",
38
- PromocodeMst: "updatePromocodeMasters",
39
- PartyShippingInfo: "updateShippingInfoMasters",
40
- QualityMst: "updateQualityMasters",
41
- ToneMst: "updateToneMasters",
42
- ItemSizeMst: "updateItemSizeMasters",
43
- };
44
- function getUpdateMethodForType(type) {
45
- return TYPE_TO_UPDATE_METHOD[type];
46
- }
47
- function parseOrderParam(order) {
48
- if (!order)
49
- return undefined;
50
- // expected format: field:asc or field:desc
51
- const [field, dirRaw] = order.split(":");
52
- if (!field)
53
- return undefined;
54
- const dir = (dirRaw || "asc").toLowerCase();
55
- return { [field]: dir === "desc" ? "DESC" : "ASC" };
56
- }
57
- // Allowed order fields per master; default to id only to avoid DB errors
58
- exports.ALLOWED_ORDER_FIELDS = {
59
- CategoryMst: ["id"],
60
- SubCategoryMst: ["id"],
61
- CollectionMst: ["id"],
62
- CollectionGroupMst: ["id"],
63
- CategoryGroupMst: ["id"],
64
- RawMst: ["id"],
65
- ShapeMst: ["id"],
66
- DiscountMst: ["id"],
67
- PartyMst: ["id"],
68
- PromocodeMst: ["id"],
69
- PartyShippingInfo: ["id"],
70
- QualityMst: ["id", "qly_code"],
71
- ToneMst: ["id", "tone_code"],
72
- ItemSizeMst: ["id", "item_size_code"],
73
- };
74
- // Searchable fields per master for building $or filters with q
75
- exports.SEARCHABLE_FIELDS = {
76
- CategoryMst: ["category_name", "category_code"],
77
- SubCategoryMst: ["sub_category_name", "sub_category_code"],
78
- CollectionMst: ["collection_name", "collection_code"],
79
- CollectionGroupMst: ["collection_group_name", "collection_group_code"],
80
- CategoryGroupMst: ["category_group_name", "category_group_code"],
81
- RawMst: ["raw_name", "raw_code"],
82
- ShapeMst: ["shape_name", "shape_code"],
83
- DiscountMst: ["discount_code", "discount_name"],
84
- PartyMst: ["party_name", "party_code"],
85
- PromocodeMst: ["promocode_name", "promocode_code"],
86
- PartyShippingInfo: ["shipping_info_name", "shipping_info_code"],
87
- QualityMst: ["qly_name", "qly_code"],
88
- ToneMst: ["tone_name", "tone_code"],
89
- ItemSizeMst: ["item_size_name", "item_size_code"],
90
- };
91
- function buildSearchOr(master, q) {
92
- if (!q)
93
- return undefined;
94
- const fields = exports.SEARCHABLE_FIELDS[master] || [];
95
- if (!fields.length)
96
- return undefined;
97
- return fields.map((f) => ({ [f]: { $ilike: `%${q}%` } }));
98
- }
99
- function parseDashOrder(order) {
100
- if (!order)
101
- return undefined;
102
- const isDesc = order.startsWith("-");
103
- const field = order.replace(/^-/, "");
104
- if (!field)
105
- return undefined;
106
- return { [field]: isDesc ? "DESC" : "ASC" };
107
- }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL21hc3RlcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0JBLDhDQUVDO0FBb0JELHdEQUVDO0FBRUQsMENBWUM7QUFzQ0Qsc0NBS0M7QUFFRCx3Q0FRQztBQTdHRCxNQUFNLGVBQWUsR0FBdUM7SUFDMUQsV0FBVyxFQUFFLGlCQUFpQjtJQUM5QixjQUFjLEVBQUUscUJBQXFCO0lBQ3JDLGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsa0JBQWtCLEVBQUUseUJBQXlCO0lBQzdDLGdCQUFnQixFQUFFLHVCQUF1QjtJQUN6QyxNQUFNLEVBQUUsWUFBWTtJQUNwQixRQUFRLEVBQUUsY0FBYztJQUN4QixXQUFXLEVBQUUsaUJBQWlCO0lBQzlCLFFBQVEsRUFBRSxjQUFjO0lBQ3hCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsaUJBQWlCLEVBQUUsc0JBQXNCO0lBRXpDLFVBQVUsRUFBRSxnQkFBZ0I7SUFDNUIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLGtCQUFrQjtDQUNoQyxDQUFDO0FBRUYsU0FBZ0IsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxxQkFBcUIsR0FBdUM7SUFDaEUsV0FBVyxFQUFFLHVCQUF1QjtJQUNwQyxjQUFjLEVBQUUsMEJBQTBCO0lBQzFDLGFBQWEsRUFBRSx5QkFBeUI7SUFDeEMsa0JBQWtCLEVBQUUsOEJBQThCO0lBQ2xELGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxNQUFNLEVBQUUsa0JBQWtCO0lBQzFCLFFBQVEsRUFBRSxvQkFBb0I7SUFDOUIsV0FBVyxFQUFFLHVCQUF1QjtJQUNwQyxRQUFRLEVBQUUsb0JBQW9CO0lBQzlCLFlBQVksRUFBRSx3QkFBd0I7SUFDdEMsaUJBQWlCLEVBQUUsMkJBQTJCO0lBRTlDLFVBQVUsRUFBRSxzQkFBc0I7SUFDbEMsT0FBTyxFQUFFLG1CQUFtQjtJQUM1QixXQUFXLEVBQUUsdUJBQXVCO0NBQ3JDLENBQUM7QUFFRixTQUFnQixzQkFBc0IsQ0FBQyxJQUFZO0lBQ2pELE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FDN0IsS0FBYztJQUVkLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsMkNBQTJDO0lBQzNDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUdoRCxDQUFDO0FBQ0osQ0FBQztBQUVELHlFQUF5RTtBQUM1RCxRQUFBLG9CQUFvQixHQUE2QjtJQUM1RCxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDbkIsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3RCLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQztJQUMxQixnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQztJQUN4QixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDZCxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDaEIsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNoQixZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDcEIsaUJBQWlCLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDekIsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQztJQUM5QixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO0lBQzVCLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQztDQUN0QyxDQUFDO0FBRUYsK0RBQStEO0FBQ2xELFFBQUEsaUJBQWlCLEdBQTZCO0lBQ3pELFdBQVcsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7SUFDL0MsY0FBYyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUM7SUFDMUQsYUFBYSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUM7SUFDckQsa0JBQWtCLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSx1QkFBdUIsQ0FBQztJQUN0RSxnQkFBZ0IsRUFBRSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO0lBQ2hFLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDaEMsUUFBUSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztJQUN0QyxXQUFXLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDO0lBQy9DLFFBQVEsRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDdEMsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDbEQsaUJBQWlCLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUMvRCxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7SUFDbkMsV0FBVyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7Q0FDbEQsQ0FBQztBQUVGLFNBQWdCLGFBQWEsQ0FBQyxNQUFjLEVBQUUsQ0FBVTtJQUN0RCxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLHlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUM1QixLQUFjO0lBRWQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBb0MsQ0FBQztBQUNoRixDQUFDIn0=
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AdminUpdateMasterBody = exports.AdminGetMasterParams = exports.AdminGetMastersParams = exports.ListDirectFields = void 0;
4
- const common_1 = require("@medusajs/medusa/api/utils/common-validators/common");
5
- const validators_1 = require("@medusajs/medusa/api/utils/validators");
6
- const zod_1 = require("zod");
7
- exports.ListDirectFields = (0, common_1.applyAndAndOrOperators)(zod_1.z.object({
8
- created_at: (0, validators_1.createOperatorMap)().optional(),
9
- updated_at: (0, validators_1.createOperatorMap)().optional(),
10
- }));
11
- exports.AdminGetMastersParams = (0, validators_1.createFindParams)({
12
- offset: 0,
13
- limit: 50,
14
- order: "-id",
15
- })
16
- .extend({
17
- q: zod_1.z.string().optional(),
18
- order: zod_1.z.string().optional(),
19
- })
20
- .merge(exports.ListDirectFields)
21
- .strict();
22
- exports.AdminGetMasterParams = zod_1.z.object({}).strict();
23
- exports.AdminUpdateMasterBody = zod_1.z
24
- .object({
25
- title: zod_1.z.string().nullable().optional(),
26
- })
27
- .strict();
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vbWFzdGVycy92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdGQUE2RjtBQUM3RixzRUFHK0M7QUFDL0MsNkJBQXdCO0FBRVgsUUFBQSxnQkFBZ0IsR0FBRyxJQUFBLCtCQUFzQixFQUNwRCxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ1AsVUFBVSxFQUFFLElBQUEsOEJBQWlCLEdBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDMUMsVUFBVSxFQUFFLElBQUEsOEJBQWlCLEdBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDM0MsQ0FBQyxDQUNILENBQUM7QUFHVyxRQUFBLHFCQUFxQixHQUFHLElBQUEsNkJBQWdCLEVBQUM7SUFDcEQsTUFBTSxFQUFFLENBQUM7SUFDVCxLQUFLLEVBQUUsRUFBRTtJQUNULEtBQUssRUFBRSxLQUFLO0NBQ2IsQ0FBQztLQUNDLE1BQU0sQ0FBQztJQUNOLENBQUMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3hCLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdCLENBQUM7S0FDRCxLQUFLLENBQUMsd0JBQWdCLENBQUM7S0FDdkIsTUFBTSxFQUFFLENBQUM7QUFHQyxRQUFBLG9CQUFvQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFHN0MsUUFBQSxxQkFBcUIsR0FBRyxPQUFDO0tBQ25DLE1BQU0sQ0FBQztJQUNOLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3hDLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQyJ9
@@ -1,313 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.POST = void 0;
4
- const utils_1 = require("@medusajs/framework/utils");
5
- const core_flows_1 = require("@medusajs/medusa/core-flows");
6
- const api_response_1 = require("../../../../lib/api-response");
7
- const POST = async (req, res) => {
8
- const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
9
- const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
10
- const { product_id: productIdInput, variant_id: variantIdInput } = (req.body || {});
11
- if (!productIdInput && !variantIdInput) {
12
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Provide either product_id or variant_id", api_response_1.HttpStatus.BAD_REQUEST, api_response_1.ErrorCode.VALIDATION_ERROR));
13
- }
14
- try {
15
- // Build master maps (same as job)
16
- const { data: rawMasterArr } = await query.graph({
17
- entity: "raw_master",
18
- fields: ["id", "title", "raw_code"],
19
- });
20
- const { data: qualityMasterArr } = await query.graph({
21
- entity: "quality_master",
22
- fields: ["id", "title", "qly_code"],
23
- });
24
- const { data: toneMasterArr } = await query.graph({
25
- entity: "tone_master",
26
- fields: ["id", "title", "tone_code"],
27
- });
28
- const { data: itemSizeMasterArr } = await query.graph({
29
- entity: "item_size_master",
30
- fields: ["id", "title", "item_size_code"],
31
- });
32
- const rawMasterMap = new Map();
33
- rawMasterArr?.forEach((x) => rawMasterMap.set(x.raw_code, x.title));
34
- const qualityMasterMap = new Map();
35
- qualityMasterArr?.forEach((x) => qualityMasterMap.set(x.qly_code, x.title));
36
- const toneMasterMap = new Map();
37
- toneMasterArr?.forEach((x) => toneMasterMap.set(x.tone_code, x.title));
38
- const itemSizeMasterMap = new Map();
39
- itemSizeMasterArr?.forEach((x) => itemSizeMasterMap.set(x.item_size_code, x.title));
40
- const masterMaps = {
41
- rawMasterMap,
42
- qualityMasterMap,
43
- toneMasterMap,
44
- itemSizeMasterMap,
45
- };
46
- // Determine target variants and products
47
- let productIds = [];
48
- let targetVariants = [];
49
- if (variantIdInput) {
50
- const { data: variantArr } = await query.graph({
51
- entity: "product_variant",
52
- fields: ["id", "product_id"],
53
- filters: { id: variantIdInput },
54
- });
55
- const variant = variantArr?.[0];
56
- if (!variant) {
57
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Variant not found", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
58
- }
59
- const { data: evArr } = await query.graph({
60
- entity: "extended_variant",
61
- fields: ["id", "mapping_id"],
62
- filters: { mapping_id: variant.id },
63
- });
64
- const ev = evArr?.[0];
65
- if (!ev) {
66
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Extended variant not found for mapping", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
67
- }
68
- productIds = [variant.product_id];
69
- targetVariants = [
70
- { variantId: variant.id, productId: variant.product_id, extendedVariantId: ev.id },
71
- ];
72
- }
73
- else if (productIdInput) {
74
- const { data: variantArr } = await query.graph({
75
- entity: "product_variant",
76
- fields: ["id", "product_id"],
77
- filters: { product_id: productIdInput },
78
- });
79
- if (!variantArr || variantArr.length === 0) {
80
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("No variants for product", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
81
- }
82
- const mappingIds = variantArr.map((v) => v.id);
83
- const { data: evArr } = await query.graph({
84
- entity: "extended_variant",
85
- fields: ["id", "mapping_id"],
86
- filters: { mapping_id: mappingIds },
87
- });
88
- const mappingToEv = new Map();
89
- evArr?.forEach((ev) => {
90
- if (ev.mapping_id)
91
- mappingToEv.set(ev.mapping_id, ev.id);
92
- });
93
- productIds = [productIdInput];
94
- targetVariants = variantArr
95
- .filter((v) => mappingToEv.has(v.id))
96
- .map((v) => ({
97
- variantId: v.id,
98
- productId: v.product_id,
99
- extendedVariantId: mappingToEv.get(v.id),
100
- }));
101
- if (targetVariants.length === 0) {
102
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("No extended variants found for product variants", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
103
- }
104
- }
105
- // Load products with options
106
- const { data: products } = await query.graph({
107
- entity: "product",
108
- fields: ["id", "external_id", "options.*"],
109
- filters: { id: productIds },
110
- });
111
- // Load extended variants for target list (include details needed for option generation)
112
- const evIds = targetVariants.map((v) => v.extendedVariantId);
113
- const { data: extendedVariants } = await query.graph({
114
- entity: "extended_variant",
115
- fields: [
116
- "id",
117
- "mapping_id",
118
- "party_style_id",
119
- "style_id",
120
- "item_size",
121
- "party_style_details.*",
122
- ],
123
- filters: { id: evIds },
124
- });
125
- const newOptionValuesByProduct = new Map();
126
- const variantsToUpdate = [];
127
- for (const tv of targetVariants) {
128
- const product = products?.find((p) => p.id === tv.productId);
129
- const extendedVariant = extendedVariants?.find((ev) => ev.id === tv.extendedVariantId);
130
- if (!product || !extendedVariant)
131
- continue;
132
- if (!newOptionValuesByProduct.has(tv.productId)) {
133
- newOptionValuesByProduct.set(tv.productId, new Map());
134
- }
135
- const productOptionMap = newOptionValuesByProduct.get(tv.productId);
136
- const variantOptions = {};
137
- // Size
138
- if (extendedVariant.item_size) {
139
- const sizeTitle = (masterMaps.itemSizeMasterMap.get(extendedVariant.item_size) ||
140
- String(extendedVariant.item_size)).trim();
141
- const sizeOption = product.options?.find((opt) => opt.title === "Size");
142
- if (sizeOption) {
143
- variantOptions["Size"] = sizeTitle;
144
- // Track this value for product options update
145
- if (!productOptionMap.has("Size")) {
146
- productOptionMap.set("Size", new Set());
147
- }
148
- productOptionMap.get("Size").add(sizeTitle);
149
- }
150
- }
151
- // Process party_style_details for metals, metal colors, and diamond qualities
152
- let hasMetalOption = false;
153
- let hasDiamondOption = false;
154
- if (extendedVariant.party_style_details) {
155
- for (const detail of extendedVariant.party_style_details) {
156
- // Metal options
157
- if (detail.raw_type === "Metal" && detail.is_base) {
158
- hasMetalOption = true;
159
- const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
160
- detail.qly_code).trim();
161
- const rawTitle = (masterMaps.rawMasterMap.get(detail.raw_code) ||
162
- detail.raw_code).trim();
163
- const metalValue = `${qualityTitle} ${rawTitle}`.trim();
164
- const metalOption = product.options?.find((opt) => opt.title === "Metal");
165
- if (metalOption) {
166
- variantOptions["Metal"] = metalValue;
167
- // Track this value for product options update
168
- if (!productOptionMap.has("Metal")) {
169
- productOptionMap.set("Metal", new Set());
170
- }
171
- productOptionMap.get("Metal").add(metalValue);
172
- }
173
- // Metal Color
174
- if (detail.tone_code) {
175
- let colorTitle = masterMaps.toneMasterMap.get(detail.tone_code) ||
176
- detail.tone_code;
177
- // Fallback to static mappings if not in master
178
- if (!masterMaps.toneMasterMap.has(detail.tone_code)) {
179
- if (detail.tone_code === "R")
180
- colorTitle = "Rose";
181
- else if (detail.tone_code === "Y")
182
- colorTitle = "Yellow";
183
- else if (detail.tone_code === "W")
184
- colorTitle = "White";
185
- else if (detail.tone_code === "YRW")
186
- colorTitle = "YELLOW/ROSE/WHITE";
187
- else if (detail.tone_code === "YW")
188
- colorTitle = "YELLOW/WHITE";
189
- else if (detail.tone_code === "RW")
190
- colorTitle = "ROSE/WHITE";
191
- else if (detail.tone_code === "BU")
192
- colorTitle = "BLUE";
193
- else if (detail.tone_code === "BL")
194
- colorTitle = "BLACK";
195
- }
196
- colorTitle = colorTitle.trim();
197
- const metalColorOption = product.options?.find((opt) => opt.title === "Metal Color");
198
- if (metalColorOption) {
199
- variantOptions["Metal Color"] = colorTitle;
200
- // Track this value for product options update
201
- if (!productOptionMap.has("Metal Color")) {
202
- productOptionMap.set("Metal Color", new Set());
203
- }
204
- productOptionMap.get("Metal Color").add(colorTitle);
205
- }
206
- }
207
- }
208
- // Diamond Quality
209
- if (detail.raw_type === "Diamond" &&
210
- detail.tone_code &&
211
- detail.qly_code &&
212
- detail.is_base) {
213
- hasDiamondOption = true;
214
- const toneTitle = (masterMaps.toneMasterMap.get(detail.tone_code) ||
215
- detail.tone_code).trim();
216
- const qualityTitle = (masterMaps.qualityMasterMap.get(detail.qly_code) ||
217
- detail.qly_code).trim();
218
- const diamondValue = `${toneTitle} ${qualityTitle}`.trim();
219
- const diamondOption = product.options?.find((opt) => opt.title === "Diamond Quality");
220
- if (diamondOption) {
221
- variantOptions["Diamond Quality"] = diamondValue;
222
- // Track this value for product options update
223
- if (!productOptionMap.has("Diamond Quality")) {
224
- productOptionMap.set("Diamond Quality", new Set());
225
- }
226
- productOptionMap.get("Diamond Quality").add(diamondValue);
227
- }
228
- }
229
- }
230
- }
231
- variantsToUpdate.push({
232
- variant: {
233
- id: tv.variantId,
234
- options: variantOptions,
235
- },
236
- });
237
- }
238
- // STEP 1: Update product options FIRST to include all new values
239
- // This ensures option values exist before assigning them to variants
240
- const productsToUpdate = [];
241
- for (const productId of productIds) {
242
- const { data: allVariants } = await query.graph({
243
- entity: "product_variant",
244
- fields: ["id", "options.*"],
245
- filters: { product_id: productId },
246
- });
247
- // Collect unique option values from existing variants
248
- const productOptionsMap = new Map();
249
- // First, collect from existing variants
250
- for (const variant of allVariants || []) {
251
- if (variant.options) {
252
- for (const opt of variant.options) {
253
- if (opt.title && opt.value) {
254
- if (!productOptionsMap.has(opt.title)) {
255
- productOptionsMap.set(opt.title, new Set());
256
- }
257
- productOptionsMap.get(opt.title).add(opt.value.trim());
258
- }
259
- }
260
- }
261
- }
262
- // Then, merge in the new option values we'll be using
263
- const newValuesForProduct = newOptionValuesByProduct.get(productId);
264
- if (newValuesForProduct) {
265
- for (const [optionTitle, newValues,] of newValuesForProduct.entries()) {
266
- if (!productOptionsMap.has(optionTitle)) {
267
- productOptionsMap.set(optionTitle, new Set());
268
- }
269
- // Merge new values into existing set
270
- for (const value of newValues) {
271
- productOptionsMap.get(optionTitle).add(value.trim());
272
- }
273
- }
274
- }
275
- // Convert to options format, filtering out empty strings
276
- const productOptions = Array.from(productOptionsMap.entries())
277
- .map(([title, values]) => ({
278
- title,
279
- values: Array.from(values).filter((v) => v.length > 0),
280
- }))
281
- .filter((opt) => opt.values.length > 0); // Only include options with values
282
- productsToUpdate.push({
283
- product: {
284
- id: productId,
285
- options: productOptions,
286
- },
287
- });
288
- }
289
- // Update products FIRST
290
- if (productsToUpdate.length > 0) {
291
- await (0, core_flows_1.updateProductsWorkflow)(req.scope).run({
292
- input: { products: productsToUpdate.map((p) => p.product) },
293
- });
294
- }
295
- // STEP 2: Now update variants with the new option values
296
- // The option values now exist in the products, so this will succeed
297
- if (variantsToUpdate.length > 0) {
298
- await (0, core_flows_1.updateProductVariantsWorkflow)(req.scope).run({
299
- input: { product_variants: variantsToUpdate.map((v) => v.variant) },
300
- });
301
- }
302
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)({
303
- updated_products: productsToUpdate.length,
304
- updated_variants: variantsToUpdate.length,
305
- }, "Variant options synced"));
306
- }
307
- catch (e) {
308
- logger.error("Error syncing variant options", e);
309
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(e?.message || "Internal error", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
310
- }
311
- };
312
- exports.POST = POST;
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3ZhcmlhbnQtb3B0aW9ucy9zeW5jL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFzRTtBQUN0RSw0REFHcUM7QUFFckMsK0RBTXNDO0FBRS9CLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBK0IsRUFDL0IsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRW5FLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUdqRixDQUFDO0lBRUYsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBQSw4QkFBZSxFQUNwQixHQUFHLEVBQ0gsSUFBQSxrQ0FBbUIsRUFDakIseUNBQXlDLEVBQ3pDLHlCQUFVLENBQUMsV0FBVyxFQUN0Qix3QkFBUyxDQUFDLGdCQUFnQixDQUMzQixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsa0NBQWtDO1FBQ2xDLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQy9DLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO1NBQ3BDLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdC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
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.POST = void 0;
4
- const utils_1 = require("@medusajs/framework/utils");
5
- const erp_1 = require("../../../../modules/erp");
6
- const api_response_1 = require("../../../../lib/api-response");
7
- const build_redis_key_1 = require("../../../../utils/build-redis-key");
8
- const POST = async (req, res) => {
9
- try {
10
- const { grams, purity } = req.validatedBody;
11
- const cacheService = req.scope.resolve(utils_1.Modules.CACHE);
12
- const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
13
- const erpService = req.scope.resolve(erp_1.ERP_MODULE);
14
- const logger = req.scope.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
15
- const calculationCacheKey = (0, build_redis_key_1.buildRedisKey)("gold-rate:calculation", {
16
- grams,
17
- purity,
18
- });
19
- const cachedResult = await cacheService.get(calculationCacheKey);
20
- if (cachedResult) {
21
- logger.info(`[CURRENT-GOLD-RATE] : Returning cached result for grams: ${grams}, purity: ${purity}`);
22
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(cachedResult, "Gold rate calculated successfully"));
23
- }
24
- const goldRateData = (await erpService.getGoldRateData());
25
- if (!goldRateData?.CurrentGoldRate?.length) {
26
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("No gold rate data available from ERP", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
27
- }
28
- const { data: qualityMasters } = await query.graph({
29
- entity: "quality_master",
30
- fields: ["id", "qly_code", "qly_mfg_clarity"],
31
- filters: {
32
- qly_code: purity.toString(),
33
- },
34
- });
35
- const qly = qualityMasters?.[0];
36
- if (!qly && purity !== 24) {
37
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(`Purity ${purity} not found in QualityMaster`, api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
38
- }
39
- if (!qly?.qly_mfg_clarity && purity !== 24) {
40
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(`Quality master for purity ${purity} does not have qly_mfg_clarity set`, api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
41
- }
42
- const baseGold = goldRateData.CurrentGoldRate.find((g) => g.RawName === "GOLD");
43
- if (!baseGold) {
44
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)("Base gold rate (GOLD) not found in ERP response", api_response_1.HttpStatus.NOT_FOUND, api_response_1.ErrorCode.NOT_FOUND));
45
- }
46
- let ratePerGram;
47
- if (purity === 24) {
48
- ratePerGram = baseGold.SaleRate;
49
- }
50
- else {
51
- ratePerGram = (baseGold.SaleRate * qly.qly_mfg_clarity) / 100.0;
52
- }
53
- const totalPrice = ratePerGram * grams;
54
- const result = {
55
- purity,
56
- grams,
57
- base_rate: baseGold.SaleRate,
58
- rate_per_gram: ratePerGram,
59
- total_price: totalPrice,
60
- };
61
- await cacheService.set(calculationCacheKey, result, build_redis_key_1.CACHE_VALIDATION_TIMES.GOLD_RATE);
62
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createSuccessResponse)(result, "Gold rate calculated successfully"));
63
- }
64
- catch (error) {
65
- console.error("Error fetching gold rate:", error);
66
- return (0, api_response_1.sendApiResponse)(res, (0, api_response_1.createErrorResponse)(error instanceof Error ? error.message : "Internal server error", api_response_1.HttpStatus.INTERNAL_SERVER_ERROR, api_response_1.ErrorCode.INTERNAL_ERROR));
67
- }
68
- };
69
- exports.POST = POST;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2dvbGQtcmF0ZS9jdXJyZW50L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUErRTtBQUMvRSxpREFBcUQ7QUFFckQsK0RBTXNDO0FBRXRDLHVFQUcyQztBQTBCcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ3BFLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQTJDLENBQUM7UUFFMUUsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFlLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFVLENBQUMsQ0FBQztRQUM3RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRSxNQUFNLG1CQUFtQixHQUFHLElBQUEsK0JBQWEsRUFBQyx1QkFBdUIsRUFBRTtZQUNqRSxLQUFLO1lBQ0wsTUFBTTtTQUNQLENBQUMsQ0FBQztRQUVILE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLEdBQUcsQ0FDekMsbUJBQW1CLENBQ3BCLENBQUM7UUFFRixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsNERBQTRELEtBQUssYUFBYSxNQUFNLEVBQUUsQ0FDdkYsQ0FBQztZQUNGLE9BQU8sSUFBQSw4QkFBZSxFQUNw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