@devx-commerce/plugin-product-reviews-svaraa 3.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/.medusa/server/plugins/product-reviews/src/api/store/product-reviews/middlewares.d.ts +175 -0
  2. package/.medusa/server/plugins/product-reviews/src/api/store/product-reviews/middlewares.js +75 -0
  3. package/.medusa/server/src/admin/index.js +20 -0
  4. package/.medusa/server/src/admin/index.mjs +21 -0
  5. package/.medusa/server/src/api/admin/product-review-stats/middlewares.d.ts +118 -0
  6. package/.medusa/server/src/api/admin/product-review-stats/middlewares.js +46 -0
  7. package/.medusa/server/src/api/admin/product-review-stats/refresh/route.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/product-review-stats/refresh/route.js +19 -0
  9. package/.medusa/server/src/api/admin/product-review-stats/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/product-review-stats/route.js +16 -0
  11. package/.medusa/server/src/api/admin/product-reviews/[id]/response/middlewares.d.ts +11 -0
  12. package/.medusa/server/src/api/admin/product-reviews/[id]/response/middlewares.js +26 -0
  13. package/.medusa/server/src/api/admin/product-reviews/[id]/response/route.d.ts +5 -0
  14. package/.medusa/server/src/api/admin/product-reviews/[id]/response/route.js +66 -0
  15. package/.medusa/server/src/api/admin/product-reviews/[id]/route.d.ts +3 -0
  16. package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +30 -0
  17. package/.medusa/server/src/api/admin/product-reviews/[id]/status/middlewares.d.ts +11 -0
  18. package/.medusa/server/src/api/admin/product-reviews/[id]/status/middlewares.js +16 -0
  19. package/.medusa/server/src/api/admin/product-reviews/[id]/status/route.d.ts +3 -0
  20. package/.medusa/server/src/api/admin/product-reviews/[id]/status/route.js +15 -0
  21. package/.medusa/server/src/api/admin/product-reviews/bulk-upload/route.d.ts +3 -0
  22. package/.medusa/server/src/api/admin/product-reviews/bulk-upload/route.js +28 -0
  23. package/.medusa/server/src/api/admin/product-reviews/config/route.d.ts +4 -0
  24. package/.medusa/server/src/api/admin/product-reviews/config/route.js +33 -0
  25. package/.medusa/server/src/api/admin/product-reviews/delete/route.d.ts +3 -0
  26. package/.medusa/server/src/api/admin/product-reviews/delete/route.js +14 -0
  27. package/.medusa/server/src/api/admin/product-reviews/middlewares.d.ts +149 -0
  28. package/.medusa/server/src/api/admin/product-reviews/middlewares.js +84 -0
  29. package/.medusa/server/src/api/admin/product-reviews/route.d.ts +4 -0
  30. package/.medusa/server/src/api/admin/product-reviews/route.js +62 -0
  31. package/.medusa/server/src/api/admin/product-reviews/validators.d.ts +87 -0
  32. package/.medusa/server/src/api/admin/product-reviews/validators.js +25 -0
  33. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  34. package/.medusa/server/src/api/middlewares.js +21 -0
  35. package/.medusa/server/src/api/store/product-review-stats/middlewares.d.ts +118 -0
  36. package/.medusa/server/src/api/store/product-review-stats/middlewares.js +44 -0
  37. package/.medusa/server/src/api/store/product-review-stats/route.d.ts +2 -0
  38. package/.medusa/server/src/api/store/product-review-stats/route.js +16 -0
  39. package/.medusa/server/src/api/store/product-reviews/[id]/route.d.ts +3 -0
  40. package/.medusa/server/src/api/store/product-reviews/[id]/route.js +20 -0
  41. package/.medusa/server/src/api/store/product-reviews/eligibility/route.d.ts +3 -0
  42. package/.medusa/server/src/api/store/product-reviews/eligibility/route.js +25 -0
  43. package/.medusa/server/src/api/store/product-reviews/middlewares.d.ts +322 -0
  44. package/.medusa/server/src/api/store/product-reviews/middlewares.js +139 -0
  45. package/.medusa/server/src/api/store/product-reviews/route.d.ts +4 -0
  46. package/.medusa/server/src/api/store/product-reviews/route.js +42 -0
  47. package/.medusa/server/src/jobs/refresh-all-product-review-stats.d.ts +9 -0
  48. package/.medusa/server/src/jobs/refresh-all-product-review-stats.js +43 -0
  49. package/.medusa/server/src/lib/api-response.d.ts +75 -0
  50. package/.medusa/server/src/lib/api-response.js +102 -0
  51. package/.medusa/server/src/links/product-review-product.d.ts +2 -0
  52. package/.medusa/server/src/links/product-review-product.js +14 -0
  53. package/.medusa/server/src/links/product-review-stats-product.d.ts +2 -0
  54. package/.medusa/server/src/links/product-review-stats-product.js +13 -0
  55. package/.medusa/server/src/modules/product-review/index.d.ts +77 -0
  56. package/.medusa/server/src/modules/product-review/index.js +13 -0
  57. package/.medusa/server/src/modules/product-review/migrations/Migration20250408075709.d.ts +5 -0
  58. package/.medusa/server/src/modules/product-review/migrations/Migration20250408075709.js +27 -0
  59. package/.medusa/server/src/modules/product-review/migrations/Migration20250425092433.d.ts +5 -0
  60. package/.medusa/server/src/modules/product-review/migrations/Migration20250425092433.js +31 -0
  61. package/.medusa/server/src/modules/product-review/migrations/Migration20250428134029.d.ts +5 -0
  62. package/.medusa/server/src/modules/product-review/migrations/Migration20250428134029.js +20 -0
  63. package/.medusa/server/src/modules/product-review/migrations/Migration20250430123125.d.ts +5 -0
  64. package/.medusa/server/src/modules/product-review/migrations/Migration20250430123125.js +25 -0
  65. package/.medusa/server/src/modules/product-review/migrations/Migration20250501112941.d.ts +5 -0
  66. package/.medusa/server/src/modules/product-review/migrations/Migration20250501112941.js +16 -0
  67. package/.medusa/server/src/modules/product-review/migrations/Migration20250612122020.d.ts +5 -0
  68. package/.medusa/server/src/modules/product-review/migrations/Migration20250612122020.js +14 -0
  69. package/.medusa/server/src/modules/product-review/models/index.d.ts +6 -0
  70. package/.medusa/server/src/modules/product-review/models/index.js +14 -0
  71. package/.medusa/server/src/modules/product-review/models/product-review-config.d.ts +5 -0
  72. package/.medusa/server/src/modules/product-review/models/product-review-config.js +10 -0
  73. package/.medusa/server/src/modules/product-review/models/product-review-response.d.ts +24 -0
  74. package/.medusa/server/src/modules/product-review/models/product-review-response.js +14 -0
  75. package/.medusa/server/src/modules/product-review/models/product-review-stats.d.ts +11 -0
  76. package/.medusa/server/src/modules/product-review/models/product-review-stats.js +16 -0
  77. package/.medusa/server/src/modules/product-review/models/product-review.d.ts +29 -0
  78. package/.medusa/server/src/modules/product-review/models/product-review.js +34 -0
  79. package/.medusa/server/src/modules/product-review/models/review-associated-media.d.ts +29 -0
  80. package/.medusa/server/src/modules/product-review/models/review-associated-media.js +14 -0
  81. package/.medusa/server/src/modules/product-review/service.d.ts +145 -0
  82. package/.medusa/server/src/modules/product-review/service.js +211 -0
  83. package/.medusa/server/src/modules/product-review/types/common.d.ts +7 -0
  84. package/.medusa/server/src/modules/product-review/types/common.js +3 -0
  85. package/.medusa/server/src/modules/product-review/types/index.d.ts +2 -0
  86. package/.medusa/server/src/modules/product-review/types/index.js +19 -0
  87. package/.medusa/server/src/modules/product-review/types/mutations.d.ts +36 -0
  88. package/.medusa/server/src/modules/product-review/types/mutations.js +3 -0
  89. package/.medusa/server/src/subscribers/product-review-bulk-upload.d.ts +8 -0
  90. package/.medusa/server/src/subscribers/product-review-bulk-upload.js +132 -0
  91. package/.medusa/server/src/utils/types/product-reviews.d.ts +110 -0
  92. package/.medusa/server/src/utils/types/product-reviews.js +3 -0
  93. package/.medusa/server/src/workflows/customer/find-or-create-customer.d.ts +14 -0
  94. package/.medusa/server/src/workflows/customer/find-or-create-customer.js +106 -0
  95. package/.medusa/server/src/workflows/order/steps/validate-order-item-exists.d.ts +12 -0
  96. package/.medusa/server/src/workflows/order/steps/validate-order-item-exists.js +37 -0
  97. package/.medusa/server/src/workflows/product/steps/validate-product-exists.d.ts +10 -0
  98. package/.medusa/server/src/workflows/product/steps/validate-product-exists.js +28 -0
  99. package/.medusa/server/src/workflows/product-reviews/steps/check-review-eligibility.d.ts +15 -0
  100. package/.medusa/server/src/workflows/product-reviews/steps/check-review-eligibility.js +78 -0
  101. package/.medusa/server/src/workflows/product-reviews/steps/create-product-review-response.d.ts +37 -0
  102. package/.medusa/server/src/workflows/product-reviews/steps/create-product-review-response.js +17 -0
  103. package/.medusa/server/src/workflows/product-reviews/steps/create-product-reviews.d.ts +40 -0
  104. package/.medusa/server/src/workflows/product-reviews/steps/create-product-reviews.js +79 -0
  105. package/.medusa/server/src/workflows/product-reviews/steps/delete-product-review-responses.d.ts +6 -0
  106. package/.medusa/server/src/workflows/product-reviews/steps/delete-product-review-responses.js +23 -0
  107. package/.medusa/server/src/workflows/product-reviews/steps/delete-review-step.d.ts +4 -0
  108. package/.medusa/server/src/workflows/product-reviews/steps/delete-review-step.js +13 -0
  109. package/.medusa/server/src/workflows/product-reviews/steps/download-and-parse-csv.d.ts +6 -0
  110. package/.medusa/server/src/workflows/product-reviews/steps/download-and-parse-csv.js +63 -0
  111. package/.medusa/server/src/workflows/product-reviews/steps/recalculate-product-review-stats.d.ts +16 -0
  112. package/.medusa/server/src/workflows/product-reviews/steps/recalculate-product-review-stats.js +15 -0
  113. package/.medusa/server/src/workflows/product-reviews/steps/throw-error-step.d.ts +3 -0
  114. package/.medusa/server/src/workflows/product-reviews/steps/throw-error-step.js +9 -0
  115. package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-config.d.ts +5 -0
  116. package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-config.js +38 -0
  117. package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-response.d.ts +3 -0
  118. package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-response.js +36 -0
  119. package/.medusa/server/src/workflows/product-reviews/steps/update-product-review.d.ts +53 -0
  120. package/.medusa/server/src/workflows/product-reviews/steps/update-product-review.js +65 -0
  121. package/.medusa/server/src/workflows/product-reviews/steps/validate-review-csv-headers.d.ts +10 -0
  122. package/.medusa/server/src/workflows/product-reviews/steps/validate-review-csv-headers.js +55 -0
  123. package/.medusa/server/src/workflows/product-reviews/steps/verify-purchase-history.d.ts +10 -0
  124. package/.medusa/server/src/workflows/product-reviews/steps/verify-purchase-history.js +70 -0
  125. package/.medusa/server/src/workflows/product-reviews/workflows/bulk-upload-product-reviews.d.ts +9 -0
  126. package/.medusa/server/src/workflows/product-reviews/workflows/bulk-upload-product-reviews.js +25 -0
  127. package/.medusa/server/src/workflows/product-reviews/workflows/check-review-eligibility.d.ts +2 -0
  128. package/.medusa/server/src/workflows/product-reviews/workflows/check-review-eligibility.js +10 -0
  129. package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review-response.d.ts +36 -0
  130. package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review-response.js +10 -0
  131. package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review.d.ts +51 -0
  132. package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review.js +43 -0
  133. package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review-responses.d.ts +5 -0
  134. package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review-responses.js +10 -0
  135. package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review.d.ts +3 -0
  136. package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review.js +10 -0
  137. package/.medusa/server/src/workflows/product-reviews/workflows/download-csv.d.ts +6 -0
  138. package/.medusa/server/src/workflows/product-reviews/workflows/download-csv.js +13 -0
  139. package/.medusa/server/src/workflows/product-reviews/workflows/refresh-product-review-stats.d.ts +17 -0
  140. package/.medusa/server/src/workflows/product-reviews/workflows/refresh-product-review-stats.js +10 -0
  141. package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-config.d.ts +6 -0
  142. package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-config.js +10 -0
  143. package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-responses.d.ts +2 -0
  144. package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-responses.js +10 -0
  145. package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review.d.ts +52 -0
  146. package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review.js +15 -0
  147. package/.medusa/server/src/workflows/product-reviews/workflows/verify-purchase-history.d.ts +12 -0
  148. package/.medusa/server/src/workflows/product-reviews/workflows/verify-purchase-history.js +10 -0
  149. package/README.md +205 -0
  150. package/package.json +104 -0
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const utils_1 = require("@medusajs/framework/utils");
16
+ const models_1 = require("./models");
17
+ const DEFAULT_CONFIGS = [
18
+ { key: "AUTO_PUBLISH", value: false },
19
+ { key: "VERIFIED_PURCHASES_ONLY", value: false },
20
+ ];
21
+ class ProductReviewService extends (0, utils_1.MedusaService)({
22
+ ProductReview: models_1.ProductReviewModel,
23
+ ProductReviewResponse: models_1.ProductReviewResponseModel,
24
+ ProductReviewStats: models_1.ProductReviewStatsModel,
25
+ ReviewAssociatedMedia: models_1.ReviewAssociatedMediaModel,
26
+ ProductReviewConfig: models_1.ProductReviewConfigModel,
27
+ }) {
28
+ constructor(container) {
29
+ super(container);
30
+ this.ensureDefaultConfigs();
31
+ }
32
+ async ensureDefaultConfigs() {
33
+ const existingConfigs = await this.listProductReviewConfigs();
34
+ for (const defaultConfig of DEFAULT_CONFIGS) {
35
+ const configExists = existingConfigs.some((config) => config.key === defaultConfig.key);
36
+ if (!configExists) {
37
+ await this.createProductReviewConfigs(defaultConfig);
38
+ }
39
+ }
40
+ }
41
+ async refreshProductReviewStats(productIds, sharedContext) {
42
+ const calculatedStats = await this.calculateProductReviewStats(productIds, sharedContext);
43
+ const foundStats = await this.listProductReviewStats({ product_id: productIds }, {});
44
+ // Group existing stats by product_id to handle duplicates
45
+ const statsByProduct = foundStats.reduce((acc, stat) => {
46
+ if (!acc[stat.product_id]) {
47
+ acc[stat.product_id] = [];
48
+ }
49
+ acc[stat.product_id].push(stat);
50
+ return acc;
51
+ }, {});
52
+ const updatedStats = await Promise.all(calculatedStats.map(async (calculatedStat) => {
53
+ const existingStats = statsByProduct[calculatedStat.product_id] || [];
54
+ // If there are multiple existing stats, set all of them to 0 first
55
+ if (existingStats.length > 1) {
56
+ await Promise.all(existingStats.map((stat) => this.updateProductReviewStats({
57
+ id: stat.id,
58
+ product_id: stat.product_id,
59
+ review_count: 0,
60
+ average_rating: 0,
61
+ rating_count_1: 0,
62
+ rating_count_2: 0,
63
+ rating_count_3: 0,
64
+ rating_count_4: 0,
65
+ rating_count_5: 0,
66
+ })));
67
+ }
68
+ if (existingStats.length > 0) {
69
+ // Use the first existing stat (or the only one after setting others to 0)
70
+ const foundStat = existingStats[0];
71
+ return await this.updateProductReviewStats({
72
+ id: foundStat.id,
73
+ ...calculatedStat,
74
+ });
75
+ }
76
+ return await this.createProductReviewStats(calculatedStat);
77
+ }));
78
+ // Handle products that have existing stats but no calculated stats (should be set to 0)
79
+ const calculatedProductIds = new Set(calculatedStats.map((stat) => stat.product_id));
80
+ const productsToDelete = Object.keys(statsByProduct).filter((productId) => !calculatedProductIds.has(productId));
81
+ if (productsToDelete.length > 0) {
82
+ for (const productId of productsToDelete) {
83
+ const existingStats = statsByProduct[productId];
84
+ await Promise.all(existingStats.map((stat) => this.updateProductReviewStats({
85
+ id: stat.id,
86
+ product_id: stat.product_id,
87
+ review_count: 0,
88
+ average_rating: 0,
89
+ rating_count_1: 0,
90
+ rating_count_2: 0,
91
+ rating_count_3: 0,
92
+ rating_count_4: 0,
93
+ rating_count_5: 0,
94
+ })));
95
+ }
96
+ }
97
+ return updatedStats;
98
+ }
99
+ async createProductReviewsWithTimestamps(data, sharedContext) {
100
+ const reviewDate = data.created_at || new Date();
101
+ const reviewId = `prev_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
102
+ const [newReview] = await sharedContext.manager.execute(`INSERT INTO product_review (
103
+ id, name, email, phone, rating, title, description,
104
+ product_id, is_verified_purchase, is_admin_verified,
105
+ created_at, updated_at
106
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`, [
107
+ reviewId,
108
+ data.name || null,
109
+ data.email || null,
110
+ data.phone || null,
111
+ data.rating,
112
+ data.title || "",
113
+ data.description || "",
114
+ data.product_id,
115
+ data.is_verified_purchase || false,
116
+ data.is_admin_verified || false,
117
+ reviewDate,
118
+ data.updated_at || reviewDate,
119
+ ]);
120
+ return newReview;
121
+ }
122
+ async updateProductReviewsWithTimestamps(data, sharedContext) {
123
+ const { id, created_at, updated_at, ...otherData } = data;
124
+ // First update the standard fields using the service's built-in mechanism if possible,
125
+ // or just use raw SQL for everything to be safe and consistent.
126
+ const fieldsToUpdate = [];
127
+ const values = [];
128
+ const fieldMap = {
129
+ name: "name",
130
+ email: "email",
131
+ phone: "phone",
132
+ rating: "rating",
133
+ title: "title",
134
+ description: "description",
135
+ is_verified_purchase: "is_verified_purchase",
136
+ is_admin_verified: "is_admin_verified",
137
+ created_at: "created_at",
138
+ updated_at: "updated_at",
139
+ };
140
+ for (const [key, columnName] of Object.entries(fieldMap)) {
141
+ if (data[key] !== undefined) {
142
+ fieldsToUpdate.push(`${columnName} = ?`);
143
+ values.push(data[key]);
144
+ }
145
+ }
146
+ if (fieldsToUpdate.length === 0) {
147
+ return;
148
+ }
149
+ values.push(id);
150
+ await sharedContext.manager.execute(`UPDATE product_review SET ${fieldsToUpdate.join(", ")} WHERE id = ?`, values);
151
+ // Refresh the identity map for this ID to ensure subsequent fetches see the DB changes
152
+ const freshReview = await this.retrieveProductReview(id, {
153
+ relations: ["associated_medias"],
154
+ }, sharedContext);
155
+ return freshReview;
156
+ }
157
+ async calculateProductReviewStats(productIds, sharedContext) {
158
+ let whereClause = `
159
+ pr.is_admin_verified = true
160
+ AND pr.deleted_at IS NULL
161
+ `;
162
+ if (productIds.length > 0) {
163
+ const ids = productIds.map((id) => `'${id}'`).join(", ");
164
+ whereClause = `
165
+ pr.product_id IN (${ids})
166
+ AND ${whereClause}
167
+ `;
168
+ }
169
+ const SQL = `
170
+ SELECT
171
+ pr.product_id,
172
+ COUNT(*) AS review_count,
173
+ CAST(AVG(pr.rating) AS DECIMAL(10, 2)) AS average_rating,
174
+ SUM(CASE WHEN pr.rating = 1 THEN 1 ELSE 0 END) AS rating_count_1,
175
+ SUM(CASE WHEN pr.rating = 2 THEN 1 ELSE 0 END) AS rating_count_2,
176
+ SUM(CASE WHEN pr.rating = 3 THEN 1 ELSE 0 END) AS rating_count_3,
177
+ SUM(CASE WHEN pr.rating = 4 THEN 1 ELSE 0 END) AS rating_count_4,
178
+ SUM(CASE WHEN pr.rating = 5 THEN 1 ELSE 0 END) AS rating_count_5
179
+ FROM product_review pr
180
+ WHERE ${whereClause}
181
+ GROUP BY pr.product_id`;
182
+ const productReviewStats = await sharedContext.manager.execute(SQL);
183
+ return productReviewStats.map((s) => ({
184
+ ...s,
185
+ average_rating: parseFloat(s.average_rating),
186
+ }));
187
+ }
188
+ }
189
+ __decorate([
190
+ (0, utils_1.InjectManager)(),
191
+ __param(1, (0, utils_1.MedusaContext)()),
192
+ __metadata("design:type", Function),
193
+ __metadata("design:paramtypes", [Object, Object]),
194
+ __metadata("design:returntype", Promise)
195
+ ], ProductReviewService.prototype, "createProductReviewsWithTimestamps", null);
196
+ __decorate([
197
+ (0, utils_1.InjectManager)(),
198
+ __param(1, (0, utils_1.MedusaContext)()),
199
+ __metadata("design:type", Function),
200
+ __metadata("design:paramtypes", [Object, Object]),
201
+ __metadata("design:returntype", Promise)
202
+ ], ProductReviewService.prototype, "updateProductReviewsWithTimestamps", null);
203
+ __decorate([
204
+ (0, utils_1.InjectManager)(),
205
+ __param(1, (0, utils_1.MedusaContext)()),
206
+ __metadata("design:type", Function),
207
+ __metadata("design:paramtypes", [Array, Object]),
208
+ __metadata("design:returntype", Promise)
209
+ ], ProductReviewService.prototype, "calculateProductReviewStats", null);
210
+ exports.default = ProductReviewService;
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3Byb2R1Y3QtcmV2aWV3L3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFDQSxxREFJbUM7QUFHbkMscUNBTWtCO0FBY2xCLE1BQU0sZUFBZSxHQUFHO0lBQ3RCLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQ3JDLEVBQUUsR0FBRyxFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7Q0FDakQsQ0FBQztBQUVGLE1BQU0sb0JBQXFCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQy9DLGFBQWEsRUFBRSwyQkFBa0I7SUFDakMscUJBQXFCLEVBQUUsbUNBQTBCO0lBQ2pELGtCQUFrQixFQUFFLGdDQUF1QjtJQUMzQyxxQkFBcUIsRUFBRSxtQ0FBMEI7SUFDakQsbUJBQW1CLEVBQUUsaUNBQXdCO0NBQzlDLENBQUM7SUFDQSxZQUFZLFNBQVM7UUFDbkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFUyxLQUFLLENBQUMsb0JBQW9CO1FBQ2xDLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFOUQsS0FBSyxNQUFNLGFBQWEsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUN2QyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxhQUFhLENBQUMsR0FBRyxDQUM3QyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQixNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gs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
@@ -0,0 +1,7 @@
1
+ import type { InferTypeOf } from "@medusajs/framework/types";
2
+ import type { ProductReviewModel } from "../models";
3
+ import { ProductReviewResponseModel } from "../models/product-review-response";
4
+ import { ProductReviewStatsModel } from "../models/product-review-stats";
5
+ export type ProductReview = InferTypeOf<typeof ProductReviewModel>;
6
+ export type ProductReviewStats = InferTypeOf<typeof ProductReviewStatsModel>;
7
+ export type ProductReviewResponse = InferTypeOf<typeof ProductReviewResponseModel>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcHJvZHVjdC1yZXZpZXcvdHlwZXMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,2 @@
1
+ export * from './common';
2
+ export * from './mutations';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./common"), exports);
18
+ __exportStar(require("./mutations"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy90eXBlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLDhDQUE0QiJ9
@@ -0,0 +1,36 @@
1
+ import type { ProductReview } from "./common";
2
+ export type CreateProductReviewInput = Partial<Omit<ProductReview, "id" | "created_at" | "updated_at" | "images">> & {
3
+ images?: {
4
+ key: string;
5
+ }[];
6
+ };
7
+ export type UpdateProductReviewInput = Partial<Omit<ProductReview, "id" | "created_at" | "updated_at" | "images">> & {
8
+ id: string;
9
+ images?: {
10
+ key: string;
11
+ }[];
12
+ };
13
+ export type CreateProductReviewsWorkflowInput = {
14
+ productReviews: CreateProductReviewInput[];
15
+ };
16
+ export type UpdateProductReviewsWorkflowInput = {
17
+ productReviews: UpdateProductReviewInput[];
18
+ };
19
+ export type DeleteProductReviewResponsesWorkflowInput = {
20
+ ids: string[];
21
+ };
22
+ export type CreateProductReviewResponseWorkflowInput = {
23
+ responses: CreateProductReviewResponseInput[];
24
+ };
25
+ export type UpdateProductReviewResponsesWorkflowInput = {
26
+ responses: UpdateProductReviewResponseInput[];
27
+ };
28
+ export type CreateProductReviewResponseInput = {
29
+ product_review_id: string;
30
+ content: string;
31
+ admin_user_id?: string;
32
+ };
33
+ export type UpdateProductReviewResponseInput = {
34
+ id: string;
35
+ content: string;
36
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXV0YXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcHJvZHVjdC1yZXZpZXcvdHlwZXMvbXV0YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,8 @@
1
+ import { type SubscriberArgs, type SubscriberConfig } from "@medusajs/framework";
2
+ type BulkUploadEventData = {
3
+ email: string;
4
+ csv_url: string;
5
+ };
6
+ export default function productReviewBulkUploadHandler({ event, container, }: SubscriberArgs<BulkUploadEventData>): Promise<void>;
7
+ export declare const config: SubscriberConfig;
8
+ export {};
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = productReviewBulkUploadHandler;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const product_review_1 = require("../modules/product-review");
7
+ const download_csv_1 = require("../workflows/product-reviews/workflows/download-csv");
8
+ async function productReviewBulkUploadHandler({ event, container, }) {
9
+ const logger = container.resolve("logger");
10
+ const productReviewService = container.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
11
+ const { csv_url } = event.data;
12
+ const { result: reviews } = await (0, download_csv_1.downloadCsvWorkflow)(container).run({
13
+ input: { csv_url },
14
+ });
15
+ // Prefetch product IDs for rows that provide style_code instead of product_id
16
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
17
+ const uniqueStyleCodes = Array.from(new Set(reviews
18
+ .map((r) => r?.style_code?.trim())
19
+ .filter((v) => !!v)));
20
+ let styleCodeToProductId = {};
21
+ if (uniqueStyleCodes.length) {
22
+ const { data: products } = await query.graph({
23
+ entity: "extended_product",
24
+ fields: ["id", "style_code", "product.id"],
25
+ filters: { style_code: uniqueStyleCodes },
26
+ });
27
+ styleCodeToProductId = (products || []).reduce((acc, p) => {
28
+ const code = p?.style_code;
29
+ if (code && p?.product?.id)
30
+ acc[code] = p.product.id;
31
+ return acc;
32
+ }, {});
33
+ }
34
+ // Process reviews in batches to avoid memory issues
35
+ const batchSize = 10;
36
+ const totalReviews = reviews.length;
37
+ let processedCount = 0;
38
+ let successCount = 0;
39
+ let failedCount = 0;
40
+ const errors = [];
41
+ logger.info(`Starting bulk upload of ${totalReviews} product reviews`);
42
+ for (let i = 0; i < totalReviews; i += batchSize) {
43
+ const batch = reviews.slice(i, i + batchSize);
44
+ const batchPromises = batch.map(async (review) => {
45
+ const productId = review.style_code && styleCodeToProductId[review.style_code];
46
+ if (!productId) {
47
+ return Promise.resolve({
48
+ review,
49
+ success: false,
50
+ error: `No product found for style_code: ${review.style_code || ""}`,
51
+ });
52
+ }
53
+ const { data: [config], } = await query.graph({
54
+ entity: "product_review_config",
55
+ fields: ["value"],
56
+ filters: { key: "AUTO_PUBLISH" },
57
+ });
58
+ try {
59
+ // Create review with custom timestamps
60
+ const reviewDate = review.date
61
+ ? new Date(review.date.split("-").reverse().join("-"))
62
+ : new Date();
63
+ const newReview = await productReviewService.createProductReviewsWithTimestamps({
64
+ ...(review.customer_name && {
65
+ name: review.customer_name,
66
+ }),
67
+ ...(review.customer_email && { email: review.customer_email }),
68
+ ...(review.customer_phone && { phone: review.customer_phone }),
69
+ rating: parseInt(review.rating, 10),
70
+ title: review.review || "",
71
+ description: review.review || "",
72
+ is_verified_purchase: false,
73
+ product_id: productId,
74
+ is_admin_verified: review.admin_verified === "true"
75
+ ? true
76
+ : review.admin_verified === "false"
77
+ ? false
78
+ : config?.value,
79
+ created_at: reviewDate,
80
+ updated_at: reviewDate,
81
+ });
82
+ if (review.image_medias || review.video_medias) {
83
+ await productReviewService.createReviewAssociatedMedias([
84
+ ...(review?.image_medias
85
+ ?.split(",")
86
+ ?.filter(Boolean)
87
+ .map((url) => ({
88
+ url,
89
+ type: "IMAGE",
90
+ })) || []),
91
+ ...(review?.video_medias
92
+ ?.split(",")
93
+ ?.filter(Boolean)
94
+ .map((url) => ({
95
+ url,
96
+ type: "VIDEO",
97
+ })) || []),
98
+ ].map((media) => ({
99
+ product_review_id: newReview.id,
100
+ url: media.url,
101
+ type: media.type,
102
+ })));
103
+ }
104
+ return { review, success: true, error: null };
105
+ }
106
+ catch (error) {
107
+ return { review, success: false, error };
108
+ }
109
+ });
110
+ const results = await Promise.all(batchPromises);
111
+ for (const result of results) {
112
+ if (result.success) {
113
+ successCount++;
114
+ }
115
+ else {
116
+ failedCount++;
117
+ errors.push({
118
+ ...result.review,
119
+ error: result.error || result.error?.message || "Unknown error",
120
+ });
121
+ }
122
+ processedCount++;
123
+ }
124
+ // Log progress after each batch
125
+ logger.info(`Processed ${processedCount}/${totalReviews} reviews. Success: ${successCount}, Failed: ${failedCount}`);
126
+ }
127
+ logger.info(`Processing bulk upload of ${reviews.length} product reviews completed. Success: ${successCount}, Failed: ${failedCount}`);
128
+ }
129
+ exports.config = {
130
+ event: "product_review.bulk_upload",
131
+ };
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1yZXZpZXctYnVsay11cGxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcHJvZHVjdC1yZXZpZXctYnVsay11cGxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZUEsaURBOEpDO0FBektELHFEQUFzRTtBQUN0RSw4REFBa0U7QUFFbEUsc0ZBQTBGO0FBUTNFLEtBQUssVUFBVSw4QkFBOEIsQ0FBQyxFQUMzRCxLQUFLLEVBQ0wsU0FBUyxHQUMyQjtJQUNwQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDNUMsc0NBQXFCLENBQ3RCLENBQUM7SUFDRixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUUvQixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sSUFBQSxrQ0FBbUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbkUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFO0tBQ25CLENBQUMsQ0FBQztJQUVILDhFQUE4RTtJQUM5RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDakMsSUFBSSxHQUFHLENBQ0wsT0FBTztTQUNKLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzFDLENBQ0YsQ0FBQztJQUVGLElBQUksb0JBQW9CLEdBQTJCLEVBQUUs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
@@ -0,0 +1,110 @@
1
+ export type AdminCreateProductReviewResponseDTO = {
2
+ content: string;
3
+ };
4
+ export type AdminUpdateProductReviewResponseDTO = {
5
+ content: string;
6
+ };
7
+ export type AdminListProductReviewsQuery = {
8
+ q?: string;
9
+ id?: string | string[];
10
+ product_id?: string | string[];
11
+ order_id?: string | string[];
12
+ order_item_id?: string | string[];
13
+ rating?: number | number[];
14
+ limit?: number;
15
+ offset?: number;
16
+ };
17
+ export type AdminListProductReviewsResponse = {
18
+ product_reviews: AdminProductReview[];
19
+ count: number;
20
+ offset: number;
21
+ limit: number;
22
+ };
23
+ export type AdminProductReview = {
24
+ id: string;
25
+ is_admin_verified: boolean;
26
+ content: string;
27
+ rating: number;
28
+ name: string;
29
+ email: string;
30
+ order_id?: string;
31
+ product_id?: string;
32
+ order_item_id?: string;
33
+ images: {
34
+ key: string;
35
+ }[];
36
+ created_at: string;
37
+ updated_at: string;
38
+ product: {
39
+ id: string;
40
+ thumbnail?: string;
41
+ title: string;
42
+ };
43
+ order: {
44
+ id: string;
45
+ display_id: string;
46
+ };
47
+ response?: AdminProductReviewResponse;
48
+ };
49
+ export type AdminProductReviewResponse = {
50
+ content: string;
51
+ product_review_id: string;
52
+ created_at: string;
53
+ updated_at: string;
54
+ };
55
+ export type StoreListProductReviewsQuery = {
56
+ offset: number;
57
+ limit: number;
58
+ fields?: string | undefined;
59
+ order?: string | undefined;
60
+ id?: string | string[] | undefined;
61
+ is_admin_verified?: boolean | undefined;
62
+ product_id?: string | string[] | undefined;
63
+ order_id?: string | string[] | undefined;
64
+ rating?: number | number[] | undefined;
65
+ created_at?: string | undefined;
66
+ updated_at?: string | undefined;
67
+ };
68
+ export type StoreListProductReviewsResponse = {
69
+ product_reviews: StoreProductReview[];
70
+ count: number;
71
+ offset: number;
72
+ limit: number;
73
+ };
74
+ export type StoreProductReviewResponse = {
75
+ id: string;
76
+ content: string;
77
+ created_at: string;
78
+ updated_at: string;
79
+ deleted_at: string | null;
80
+ product_review_id: string;
81
+ };
82
+ export type StoreProductReview = {
83
+ id: string;
84
+ content: string;
85
+ rating: number;
86
+ name: string;
87
+ email: string;
88
+ product_id?: string;
89
+ order_item_id?: string;
90
+ images: {
91
+ key: string;
92
+ }[];
93
+ created_at: string;
94
+ updated_at: string;
95
+ response?: StoreProductReviewResponse;
96
+ };
97
+ export type StoreUpsertProductReviewsDTO = {
98
+ reviews: {
99
+ order_id: string;
100
+ order_line_item_id: string;
101
+ rating: number;
102
+ content: string;
103
+ images: {
104
+ key: string;
105
+ }[];
106
+ }[];
107
+ };
108
+ export type StoreUpsertProductReviewsResponse = {
109
+ product_reviews: StoreProductReview[];
110
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1yZXZpZXdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3R5cGVzL3Byb2R1Y3QtcmV2aWV3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,14 @@
1
+ import { CustomerDTO } from "@medusajs/framework/types";
2
+ export interface FindOrCreateCustomerStepInput {
3
+ customerId?: string | null;
4
+ email?: string | null;
5
+ phone?: string | null;
6
+ name?: string | null;
7
+ }
8
+ export interface FindOrCreateCustomerOutputStepOutput {
9
+ customer: CustomerDTO;
10
+ email: string;
11
+ phone: string | null;
12
+ }
13
+ export declare const findOrCreateCustomerStepId = "find-or-create-customer-custom";
14
+ export declare const findOrCreateCustomerStep: import("@medusajs/framework/workflows-sdk").StepFunction<FindOrCreateCustomerStepInput, FindOrCreateCustomerOutputStepOutput>;