@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.
- package/.medusa/server/plugins/product-reviews/src/api/store/product-reviews/middlewares.d.ts +175 -0
- package/.medusa/server/plugins/product-reviews/src/api/store/product-reviews/middlewares.js +75 -0
- package/.medusa/server/src/admin/index.js +20 -0
- package/.medusa/server/src/admin/index.mjs +21 -0
- package/.medusa/server/src/api/admin/product-review-stats/middlewares.d.ts +118 -0
- package/.medusa/server/src/api/admin/product-review-stats/middlewares.js +46 -0
- package/.medusa/server/src/api/admin/product-review-stats/refresh/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/product-review-stats/refresh/route.js +19 -0
- package/.medusa/server/src/api/admin/product-review-stats/route.d.ts +2 -0
- package/.medusa/server/src/api/admin/product-review-stats/route.js +16 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/response/middlewares.d.ts +11 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/response/middlewares.js +26 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/response/route.d.ts +5 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/response/route.js +66 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +30 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/status/middlewares.d.ts +11 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/status/middlewares.js +16 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/status/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-reviews/[id]/status/route.js +15 -0
- package/.medusa/server/src/api/admin/product-reviews/bulk-upload/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-reviews/bulk-upload/route.js +28 -0
- package/.medusa/server/src/api/admin/product-reviews/config/route.d.ts +4 -0
- package/.medusa/server/src/api/admin/product-reviews/config/route.js +33 -0
- package/.medusa/server/src/api/admin/product-reviews/delete/route.d.ts +3 -0
- package/.medusa/server/src/api/admin/product-reviews/delete/route.js +14 -0
- package/.medusa/server/src/api/admin/product-reviews/middlewares.d.ts +149 -0
- package/.medusa/server/src/api/admin/product-reviews/middlewares.js +84 -0
- package/.medusa/server/src/api/admin/product-reviews/route.d.ts +4 -0
- package/.medusa/server/src/api/admin/product-reviews/route.js +62 -0
- package/.medusa/server/src/api/admin/product-reviews/validators.d.ts +87 -0
- package/.medusa/server/src/api/admin/product-reviews/validators.js +25 -0
- package/.medusa/server/src/api/middlewares.d.ts +2 -0
- package/.medusa/server/src/api/middlewares.js +21 -0
- package/.medusa/server/src/api/store/product-review-stats/middlewares.d.ts +118 -0
- package/.medusa/server/src/api/store/product-review-stats/middlewares.js +44 -0
- package/.medusa/server/src/api/store/product-review-stats/route.d.ts +2 -0
- package/.medusa/server/src/api/store/product-review-stats/route.js +16 -0
- package/.medusa/server/src/api/store/product-reviews/[id]/route.d.ts +3 -0
- package/.medusa/server/src/api/store/product-reviews/[id]/route.js +20 -0
- package/.medusa/server/src/api/store/product-reviews/eligibility/route.d.ts +3 -0
- package/.medusa/server/src/api/store/product-reviews/eligibility/route.js +25 -0
- package/.medusa/server/src/api/store/product-reviews/middlewares.d.ts +322 -0
- package/.medusa/server/src/api/store/product-reviews/middlewares.js +139 -0
- package/.medusa/server/src/api/store/product-reviews/route.d.ts +4 -0
- package/.medusa/server/src/api/store/product-reviews/route.js +42 -0
- package/.medusa/server/src/jobs/refresh-all-product-review-stats.d.ts +9 -0
- package/.medusa/server/src/jobs/refresh-all-product-review-stats.js +43 -0
- package/.medusa/server/src/lib/api-response.d.ts +75 -0
- package/.medusa/server/src/lib/api-response.js +102 -0
- package/.medusa/server/src/links/product-review-product.d.ts +2 -0
- package/.medusa/server/src/links/product-review-product.js +14 -0
- package/.medusa/server/src/links/product-review-stats-product.d.ts +2 -0
- package/.medusa/server/src/links/product-review-stats-product.js +13 -0
- package/.medusa/server/src/modules/product-review/index.d.ts +77 -0
- package/.medusa/server/src/modules/product-review/index.js +13 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250408075709.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250408075709.js +27 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250425092433.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250425092433.js +31 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250428134029.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250428134029.js +20 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250430123125.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250430123125.js +25 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250501112941.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250501112941.js +16 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250612122020.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/migrations/Migration20250612122020.js +14 -0
- package/.medusa/server/src/modules/product-review/models/index.d.ts +6 -0
- package/.medusa/server/src/modules/product-review/models/index.js +14 -0
- package/.medusa/server/src/modules/product-review/models/product-review-config.d.ts +5 -0
- package/.medusa/server/src/modules/product-review/models/product-review-config.js +10 -0
- package/.medusa/server/src/modules/product-review/models/product-review-response.d.ts +24 -0
- package/.medusa/server/src/modules/product-review/models/product-review-response.js +14 -0
- package/.medusa/server/src/modules/product-review/models/product-review-stats.d.ts +11 -0
- package/.medusa/server/src/modules/product-review/models/product-review-stats.js +16 -0
- package/.medusa/server/src/modules/product-review/models/product-review.d.ts +29 -0
- package/.medusa/server/src/modules/product-review/models/product-review.js +34 -0
- package/.medusa/server/src/modules/product-review/models/review-associated-media.d.ts +29 -0
- package/.medusa/server/src/modules/product-review/models/review-associated-media.js +14 -0
- package/.medusa/server/src/modules/product-review/service.d.ts +145 -0
- package/.medusa/server/src/modules/product-review/service.js +211 -0
- package/.medusa/server/src/modules/product-review/types/common.d.ts +7 -0
- package/.medusa/server/src/modules/product-review/types/common.js +3 -0
- package/.medusa/server/src/modules/product-review/types/index.d.ts +2 -0
- package/.medusa/server/src/modules/product-review/types/index.js +19 -0
- package/.medusa/server/src/modules/product-review/types/mutations.d.ts +36 -0
- package/.medusa/server/src/modules/product-review/types/mutations.js +3 -0
- package/.medusa/server/src/subscribers/product-review-bulk-upload.d.ts +8 -0
- package/.medusa/server/src/subscribers/product-review-bulk-upload.js +132 -0
- package/.medusa/server/src/utils/types/product-reviews.d.ts +110 -0
- package/.medusa/server/src/utils/types/product-reviews.js +3 -0
- package/.medusa/server/src/workflows/customer/find-or-create-customer.d.ts +14 -0
- package/.medusa/server/src/workflows/customer/find-or-create-customer.js +106 -0
- package/.medusa/server/src/workflows/order/steps/validate-order-item-exists.d.ts +12 -0
- package/.medusa/server/src/workflows/order/steps/validate-order-item-exists.js +37 -0
- package/.medusa/server/src/workflows/product/steps/validate-product-exists.d.ts +10 -0
- package/.medusa/server/src/workflows/product/steps/validate-product-exists.js +28 -0
- package/.medusa/server/src/workflows/product-reviews/steps/check-review-eligibility.d.ts +15 -0
- package/.medusa/server/src/workflows/product-reviews/steps/check-review-eligibility.js +78 -0
- package/.medusa/server/src/workflows/product-reviews/steps/create-product-review-response.d.ts +37 -0
- package/.medusa/server/src/workflows/product-reviews/steps/create-product-review-response.js +17 -0
- package/.medusa/server/src/workflows/product-reviews/steps/create-product-reviews.d.ts +40 -0
- package/.medusa/server/src/workflows/product-reviews/steps/create-product-reviews.js +79 -0
- package/.medusa/server/src/workflows/product-reviews/steps/delete-product-review-responses.d.ts +6 -0
- package/.medusa/server/src/workflows/product-reviews/steps/delete-product-review-responses.js +23 -0
- package/.medusa/server/src/workflows/product-reviews/steps/delete-review-step.d.ts +4 -0
- package/.medusa/server/src/workflows/product-reviews/steps/delete-review-step.js +13 -0
- package/.medusa/server/src/workflows/product-reviews/steps/download-and-parse-csv.d.ts +6 -0
- package/.medusa/server/src/workflows/product-reviews/steps/download-and-parse-csv.js +63 -0
- package/.medusa/server/src/workflows/product-reviews/steps/recalculate-product-review-stats.d.ts +16 -0
- package/.medusa/server/src/workflows/product-reviews/steps/recalculate-product-review-stats.js +15 -0
- package/.medusa/server/src/workflows/product-reviews/steps/throw-error-step.d.ts +3 -0
- package/.medusa/server/src/workflows/product-reviews/steps/throw-error-step.js +9 -0
- package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-config.d.ts +5 -0
- package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-config.js +38 -0
- package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-response.d.ts +3 -0
- package/.medusa/server/src/workflows/product-reviews/steps/update-product-review-response.js +36 -0
- package/.medusa/server/src/workflows/product-reviews/steps/update-product-review.d.ts +53 -0
- package/.medusa/server/src/workflows/product-reviews/steps/update-product-review.js +65 -0
- package/.medusa/server/src/workflows/product-reviews/steps/validate-review-csv-headers.d.ts +10 -0
- package/.medusa/server/src/workflows/product-reviews/steps/validate-review-csv-headers.js +55 -0
- package/.medusa/server/src/workflows/product-reviews/steps/verify-purchase-history.d.ts +10 -0
- package/.medusa/server/src/workflows/product-reviews/steps/verify-purchase-history.js +70 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/bulk-upload-product-reviews.d.ts +9 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/bulk-upload-product-reviews.js +25 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/check-review-eligibility.d.ts +2 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/check-review-eligibility.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review-response.d.ts +36 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review-response.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review.d.ts +51 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/create-product-review.js +43 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review-responses.d.ts +5 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review-responses.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review.d.ts +3 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/delete-product-review.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/download-csv.d.ts +6 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/download-csv.js +13 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/refresh-product-review-stats.d.ts +17 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/refresh-product-review-stats.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-config.d.ts +6 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-config.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-responses.d.ts +2 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review-responses.js +10 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review.d.ts +52 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/update-product-review.js +15 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/verify-purchase-history.d.ts +12 -0
- package/.medusa/server/src/workflows/product-reviews/workflows/verify-purchase-history.js +10 -0
- package/README.md +205 -0
- 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,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>;
|