@lodashventure/medusa-review 0.0.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 (26) hide show
  1. package/.medusa/server/src/admin/index.js +1633 -0
  2. package/.medusa/server/src/admin/index.mjs +1631 -0
  3. package/.medusa/server/src/admin/style.css +75 -0
  4. package/.medusa/server/src/api/admin/reviews/route.js +35 -0
  5. package/.medusa/server/src/api/admin/reviews/status/route.js +21 -0
  6. package/.medusa/server/src/api/middlewares.js +77 -0
  7. package/.medusa/server/src/api/store/reviews/[productId]/route.js +20 -0
  8. package/.medusa/server/src/api/store/reviews/[productId]/users/route.js +28 -0
  9. package/.medusa/server/src/api/store/reviews/route.js +57 -0
  10. package/.medusa/server/src/links/review-product.js +16 -0
  11. package/.medusa/server/src/modules/product-review/index.js +13 -0
  12. package/.medusa/server/src/modules/product-review/migrations/Migration20250514002111.js +16 -0
  13. package/.medusa/server/src/modules/product-review/migrations/Migration20250514010337.js +17 -0
  14. package/.medusa/server/src/modules/product-review/migrations/Migration20250514020039.js +14 -0
  15. package/.medusa/server/src/modules/product-review/migrations/Migration20250516011714.js +18 -0
  16. package/.medusa/server/src/modules/product-review/migrations/Migration20250516015055.js +16 -0
  17. package/.medusa/server/src/modules/product-review/migrations/Migration20250516022918.js +14 -0
  18. package/.medusa/server/src/modules/product-review/migrations/Migration20250517112618.js +14 -0
  19. package/.medusa/server/src/modules/product-review/models/review-media.js +18 -0
  20. package/.medusa/server/src/modules/product-review/models/review.js +40 -0
  21. package/.medusa/server/src/modules/product-review/service.js +15 -0
  22. package/.medusa/server/src/workflows/review/createReviewWorkflow.js +60 -0
  23. package/.medusa/server/src/workflows/review/getReviewsWorkflow.js +47 -0
  24. package/.medusa/server/src/workflows/review/updateReviewWorkflow.js +33 -0
  25. package/README.md +28 -0
  26. package/package.json +83 -0
@@ -0,0 +1,75 @@
1
+ .rc-mentions {
2
+ display: inline-block;
3
+ position: relative;
4
+ white-space: pre-wrap;
5
+ }
6
+ .rc-mentions > textarea,
7
+ .rc-mentions-measure {
8
+ font-size: inherit;
9
+ font-size-adjust: inherit;
10
+ font-style: inherit;
11
+ font-variant: inherit;
12
+ font-stretch: inherit;
13
+ font-weight: inherit;
14
+ font-family: inherit;
15
+ padding: 0;
16
+ margin: 0;
17
+ line-height: inherit;
18
+ vertical-align: top;
19
+ overflow: inherit;
20
+ word-break: inherit;
21
+ white-space: inherit;
22
+ word-wrap: break-word;
23
+ overflow-x: initial;
24
+ overflow-y: auto;
25
+ text-align: inherit;
26
+ letter-spacing: inherit;
27
+ tab-size: inherit;
28
+ direction: inherit;
29
+ }
30
+ .rc-mentions > textarea {
31
+ border: none;
32
+ width: 100%;
33
+ }
34
+ .rc-mentions-measure {
35
+ position: absolute;
36
+ left: 0;
37
+ right: 0;
38
+ top: 0;
39
+ bottom: 0;
40
+ pointer-events: none;
41
+ color: transparent;
42
+ z-index: -1;
43
+ }
44
+ .rc-mentions-dropdown {
45
+ position: absolute;
46
+ color: #000;
47
+ }
48
+ .rc-mentions-dropdown-menu {
49
+ list-style: none;
50
+ margin: 0;
51
+ padding: 0;
52
+ }
53
+ .rc-mentions-dropdown-menu-item {
54
+ cursor: pointer;
55
+ }
56
+ .rc-mentions {
57
+ font-size: 20px;
58
+ border: 1px solid #999;
59
+ border-radius: 3px;
60
+ overflow: hidden;
61
+ }
62
+ .rc-mentions-dropdown {
63
+ border: 1px solid #999;
64
+ border-radius: 3px;
65
+ background: #fff;
66
+ }
67
+ .rc-mentions-dropdown-menu-item {
68
+ padding: 4px 8px;
69
+ }
70
+ .rc-mentions-dropdown-menu-item-active {
71
+ background: #e6f7ff;
72
+ }
73
+ .rc-mentions-dropdown-menu-item-disabled {
74
+ opacity: 0.5;
75
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = exports.GET = void 0;
4
+ const getReviewsWorkflow_1 = require("../../../workflows/review/getReviewsWorkflow");
5
+ const createReviewWorkflow_1 = require("../../../workflows/review/createReviewWorkflow");
6
+ const GET = async (req, res) => {
7
+ const { result } = await (0, getReviewsWorkflow_1.getReviewsWorkflow)().run({
8
+ input: {
9
+ queryConfig: req.queryConfig,
10
+ filters: {
11
+ parent: null,
12
+ },
13
+ },
14
+ });
15
+ res.json(result);
16
+ };
17
+ exports.GET = GET;
18
+ const POST = async (req, res) => {
19
+ /**
20
+ * user = Core user (admin)
21
+ * customer = Medusa customer
22
+ */
23
+ const isAdmin = req.auth_context?.actor_type === "user";
24
+ const { result } = await (0, createReviewWorkflow_1.createReviewWorkflow)(req.scope).run({
25
+ input: {
26
+ ...req.validatedBody,
27
+ is_admin: isAdmin,
28
+ status: "approved",
29
+ medias: [],
30
+ },
31
+ });
32
+ res.json(result);
33
+ };
34
+ exports.POST = POST;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Jldmlld3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscUZBQWtGO0FBQ2xGLHlGQUFzRjtBQUcvRSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSx1Q0FBa0IsR0FBRSxDQUFDLEdBQUcsQ0FBQztRQUNoRCxLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFO2dCQUNQLE1BQU0sRUFBRSxJQUFJO2FBQ2I7U0FDRjtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBWFcsUUFBQSxHQUFHLE9BV2Q7QUFFSyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3ZCLEdBQW1ELEVBQ25ELEdBQW1CLEVBQ25CLEVBQUU7SUFDRjs7O09BR0c7SUFDSCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLFVBQVUsS0FBSyxNQUFNLENBQUM7SUFFeEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSwyQ0FBb0IsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzNELEtBQUssRUFBRTtZQUNMLEdBQUcsR0FBRyxDQUFDLGFBQWE7WUFDcEIsUUFBUSxFQUFFLE9BQU87WUFDakIsTUFBTSxFQUFFLFVBQVU7WUFDbEIsTUFBTSxFQUFFLEVBQUU7U0FDWDtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBcEJXLFFBQUEsSUFBSSxRQW9CZiJ9
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PostAdminUpdateReviewsStatusSchema = void 0;
4
+ exports.POST = POST;
5
+ const zod_1 = require("zod");
6
+ const updateReviewWorkflow_1 = require("../../../../workflows/review/updateReviewWorkflow");
7
+ exports.PostAdminUpdateReviewsStatusSchema = zod_1.z.object({
8
+ ids: zod_1.z.array(zod_1.z.string()),
9
+ status: zod_1.z.enum(["pending", "approved", "rejected"]),
10
+ });
11
+ async function POST(req, res) {
12
+ const { ids, status } = req.validatedBody;
13
+ const { result } = await (0, updateReviewWorkflow_1.updateReviewWorkflow)(req.scope).run({
14
+ input: ids.map((id) => ({
15
+ id,
16
+ status,
17
+ })),
18
+ });
19
+ res.json(result);
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Jldmlld3Mvc3RhdHVzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLG9CQWNDO0FBdEJELDZCQUF3QjtBQUN4Qiw0RkFBeUY7QUFFNUUsUUFBQSxrQ0FBa0MsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pELEdBQUcsRUFBRSxPQUFDLENBQUMsS0FBSyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN4QixNQUFNLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7Q0FDcEQsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLElBQUksQ0FDeEIsR0FBc0UsRUFDdEUsR0FBbUI7SUFFbkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO0lBRTFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsMkNBQW9CLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMzRCxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixFQUFFO1lBQ0YsTUFBTTtTQUNQLENBQUMsQ0FBQztLQUNKLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkIsQ0FBQyJ9
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const http_1 = require("@medusajs/framework/http");
7
+ const route_1 = require("./store/reviews/route");
8
+ const route_2 = require("./admin/reviews/status/route");
9
+ const multer_1 = __importDefault(require("multer"));
10
+ const getReviewsWorkflow_1 = require("../workflows/review/getReviewsWorkflow");
11
+ const upload = (0, multer_1.default)({ storage: multer_1.default.memoryStorage() });
12
+ exports.default = (0, http_1.defineMiddlewares)({
13
+ routes: [
14
+ {
15
+ method: ["POST"],
16
+ matcher: "/admin/reviews",
17
+ middlewares: [
18
+ (0, http_1.authenticate)("user", ["session", "bearer"]),
19
+ // @ts-ignore
20
+ upload.array("files"),
21
+ (0, http_1.validateAndTransformBody)(route_1.PostStoreReviewSchema),
22
+ ],
23
+ },
24
+ {
25
+ method: ["POST"],
26
+ matcher: "/store/reviews",
27
+ middlewares: [
28
+ (0, http_1.authenticate)("customer", ["session", "bearer"]),
29
+ // @ts-ignore
30
+ upload.array("files"),
31
+ (0, http_1.validateAndTransformBody)(route_1.PostStoreReviewSchema),
32
+ ],
33
+ },
34
+ {
35
+ matcher: "/admin/reviews/status",
36
+ method: ["POST"],
37
+ middlewares: [
38
+ (0, http_1.validateAndTransformBody)(route_2.PostAdminUpdateReviewsStatusSchema),
39
+ ],
40
+ },
41
+ {
42
+ method: ["GET"],
43
+ matcher: "/admin/reviews",
44
+ middlewares: [
45
+ (0, http_1.validateAndTransformQuery)(getReviewsWorkflow_1.GetReviewsSchema, {
46
+ defaults: [
47
+ "*",
48
+ "product.title",
49
+ "product.id",
50
+ "medias.*",
51
+ "children.*",
52
+ "children.medias.*",
53
+ ],
54
+ isList: true,
55
+ }),
56
+ ],
57
+ },
58
+ {
59
+ method: ["GET"],
60
+ matcher: "/store/reviews/:productId",
61
+ middlewares: [
62
+ (0, http_1.validateAndTransformQuery)(getReviewsWorkflow_1.GetReviewsSchema, {
63
+ defaults: [
64
+ "*",
65
+ "product.title",
66
+ "product.id",
67
+ "medias.*",
68
+ "children.*",
69
+ "children.medias.*",
70
+ ],
71
+ isList: true,
72
+ }),
73
+ ],
74
+ },
75
+ ],
76
+ });
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbURBS2tDO0FBQ2xDLGlEQUE4RDtBQUM5RCx3REFBa0Y7QUFDbEYsb0RBQTRCO0FBQzVCLCtFQUEwRTtBQUUxRSxNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFM0Qsa0JBQWUsSUFBQSx3QkFBaUIsRUFBQztJQUMvQixNQUFNLEVBQUU7UUFDTjtZQUNFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxJQUFBLG1CQUFZLEVBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxhQUFhO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFBLCtCQUF3QixFQUFDLDZCQUE0QixDQUFDO2FBQ3ZEO1NBQ0Y7UUFDRDtZQUNFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsZ0JBQWdCO1lBQ3pCLFdBQVcsRUFBRTtnQkFDWCxJQUFBLG1CQUFZLEVBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxhQUFhO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFBLCtCQUF3QixFQUFDLDZCQUE0QixDQUFDO2FBQ3ZEO1NBQ0Y7UUFDRDtZQUNFLE9BQU8sRUFBRSx1QkFBdUI7WUFDaEMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2hCLFdBQVcsRUFBRTtnQkFDWCxJQUFBLCtCQUF3QixFQUFDLDBDQUF5QyxDQUFDO2FBQ3BFO1NBQ0Y7UUFDRDtZQUNFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNmLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsV0FBVyxFQUFFO2dCQUNYLElBQUEsZ0NBQXlCLEVBQUMscUNBQXVCLEVBQUU7b0JBQ2pELFFBQVEsRUFBRTt3QkFDUixHQUFHO3dCQUNILGVBQWU7d0JBQ2YsWUFBWTt3QkFDWixVQUFVO3dCQUNWLFlBQVk7d0JBQ1osbUJBQW1CO3FCQUNwQjtvQkFDRCxNQUFNLEVBQUUsSUFBSTtpQkFDYixDQUFDO2FBQ0g7U0FDRjtRQUNEO1lBQ0UsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2YsT0FBTyxFQUFFLDJCQUEyQjtZQUNwQyxXQUFXLEVBQUU7Z0JBQ1gsSUFBQSxnQ0FBeUIsRUFBQyxxQ0FBdUIsRUFBRTtvQkFDakQsUUFBUSxFQUFFO3dCQUNSLEdBQUc7d0JBQ0gsZUFBZTt3QkFDZixZQUFZO3dCQUNaLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixtQkFBbUI7cUJBQ3BCO29CQUNELE1BQU0sRUFBRSxJQUFJO2lCQUNiLENBQUM7YUFDSDtTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQUMifQ==
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const getReviewsWorkflow_1 = require("../../../../workflows/review/getReviewsWorkflow");
5
+ const GET = async (req, res) => {
6
+ const { productId } = req.params;
7
+ const { result } = await (0, getReviewsWorkflow_1.getReviewsWorkflow)().run({
8
+ input: {
9
+ queryConfig: req.queryConfig,
10
+ filters: {
11
+ product_id: productId,
12
+ status: "approved",
13
+ parent: null,
14
+ },
15
+ },
16
+ });
17
+ res.json(result);
18
+ };
19
+ exports.GET = GET;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3Jldmlld3MvW3Byb2R1Y3RJZF0vcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsd0ZBQXFGO0FBRTlFLE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUFrQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNuRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUVqQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHVDQUFrQixHQUFFLENBQUMsR0FBRyxDQUFDO1FBQ2hELEtBQUssRUFBRTtZQUNMLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUU7Z0JBQ1AsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsSUFBSTthQUNiO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFFSCxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQWZXLFFBQUEsR0FBRyxPQWVkIn0=
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const product_review_1 = require("../../../../../modules/product-review");
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const GET = async (req, res) => {
8
+ const { productId, users } = req.params;
9
+ const reviewService = framework_1.container.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
10
+ const customerService = framework_1.container.resolve(utils_1.Modules.CUSTOMER);
11
+ const reviews = await reviewService.listReviews({
12
+ product_id: productId,
13
+ customer_id: {
14
+ $ne: null,
15
+ },
16
+ }, {
17
+ select: ["customer_id"],
18
+ });
19
+ const customerIds = Array.from(new Set(reviews.map((review) => review.customer_id))).filter((id) => Boolean(id));
20
+ const customers = await customerService.listCustomers({
21
+ id: customerIds,
22
+ }, {
23
+ select: ["id", "first_name", "last_name"],
24
+ });
25
+ res.json(customers);
26
+ };
27
+ exports.GET = GET;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3Jldmlld3MvW3Byb2R1Y3RJZF0vdXNlcnMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQStFO0FBRS9FLDBFQUE4RTtBQUM5RSxxREFBb0Q7QUFFN0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUV4QyxNQUFNLGFBQWEsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FDckMsc0NBQXFCLENBQ3RCLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUMsV0FBVyxDQUM3QztRQUNFLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFdBQVcsRUFBRTtZQUNYLEdBQUcsRUFBRSxJQUFJO1NBQ1Y7S0FDRixFQUNEO1FBQ0UsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQ3hCLENBQ0YsQ0FBQztJQUNGLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQzVCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUNyRCxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDLGFBQWEsQ0FDbkQ7UUFDRSxFQUFFLEVBQUUsV0FBVztLQUNoQixFQUNEO1FBQ0UsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7S0FDMUMsQ0FDRixDQUFDO0lBRUYsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUM7QUFsQ1csUUFBQSxHQUFHLE9Ba0NkIn0=
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = exports.PostStoreReviewSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const createReviewWorkflow_1 = require("../../../workflows/review/createReviewWorkflow");
6
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
7
+ exports.PostStoreReviewSchema = zod_1.z.object({
8
+ parent_id: zod_1.z.string().optional(),
9
+ title: zod_1.z.string().optional(),
10
+ content: zod_1.z.string(),
11
+ rating: zod_1.z.preprocess((val) => {
12
+ if (val && typeof val === "string") {
13
+ return parseInt(val);
14
+ }
15
+ return val;
16
+ }, zod_1.z.number().min(1).max(5).optional()),
17
+ product_id: zod_1.z.string(),
18
+ });
19
+ const POST = async (req, res) => {
20
+ const input = req.body;
21
+ const inputFiles = req.files;
22
+ const { result: uploadedFiles } = await (0, core_flows_1.uploadFilesWorkflow)(req.scope).run({
23
+ input: {
24
+ files: inputFiles?.map((f) => ({
25
+ filename: f.originalname,
26
+ mimeType: f.mimetype,
27
+ content: f.buffer.toString("binary"),
28
+ access: "public",
29
+ })) ?? [],
30
+ },
31
+ });
32
+ const medias = uploadedFiles.map((file, index) => ({
33
+ fileId: file.id,
34
+ fileUrl: file.url,
35
+ mimeType: inputFiles?.at(index)?.mimetype ?? "",
36
+ }));
37
+ try {
38
+ const { result: review } = await (0, createReviewWorkflow_1.createReviewWorkflow)(req.scope).run({
39
+ input: {
40
+ ...input,
41
+ customer_id: req.auth_context?.actor_id,
42
+ medias,
43
+ },
44
+ });
45
+ res.json(review);
46
+ }
47
+ catch (error) {
48
+ (0, core_flows_1.deleteFilesWorkflow)(req.scope).run({
49
+ input: {
50
+ ids: uploadedFiles.map((file) => file.id),
51
+ },
52
+ });
53
+ throw error;
54
+ }
55
+ };
56
+ exports.POST = POST;
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3Jldmlld3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsNkJBQXdCO0FBQ3hCLHlGQUFzRjtBQUV0Riw0REFHcUM7QUFFeEIsUUFBQSxxQkFBcUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVDLFNBQVMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLEtBQUssRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzVCLE9BQU8sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ25CLE1BQU0sRUFBRSxPQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDM0IsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3ZCLENBQUMsQ0FBQztBQVFJLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbkIsRUFBRTtJQUNGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUU3QixNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLE1BQU0sSUFBQSxnQ0FBbUIsRUFBQyxHQUFHLENBQUMsS0FBWSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hGLEtBQUssRUFBRTtZQUNMLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFlBQVk7Z0JBQ3hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDcEMsTUFBTSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFDLElBQUksRUFBRTtTQUNWO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHO1FBQ2pCLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsSUFBSSxFQUFFO0tBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUosSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEsMkNBQW9CLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNuRSxLQUFLLEVBQUU7Z0JBQ0wsR0FBRyxLQUFLO2dCQUNSLFdBQVcsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVE7Z0JBQ3ZDLE1BQU07YUFDUDtTQUNGLENBQUMsQ0FBQztRQUVILEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFBLGdDQUFtQixFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakMsS0FBSyxFQUFFO2dCQUNMLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQzFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBMUNXLFFBQUEsSUFBSSxRQTBDZiJ9
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const product_review_1 = __importDefault(require("../modules/product-review"));
8
+ const product_1 = __importDefault(require("@medusajs/medusa/product"));
9
+ exports.default = (0, utils_1.defineLink)({
10
+ linkable: product_review_1.default.linkable.review,
11
+ field: "product_id",
12
+ isList: false,
13
+ }, product_1.default.linkable.product, {
14
+ readOnly: true,
15
+ });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LXByb2R1Y3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlua3MvcmV2aWV3LXByb2R1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBc0Q7QUFDdEQsK0VBQTJEO0FBQzNELHVFQUFvRDtBQUVwRCxrQkFBZSxJQUFBLGtCQUFVLEVBQ3ZCO0lBQ0UsUUFBUSxFQUFFLHdCQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQzdDLEtBQUssRUFBRSxZQUFZO0lBQ25CLE1BQU0sRUFBRSxLQUFLO0NBQ2QsRUFDRCxpQkFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQzlCO0lBQ0UsUUFBUSxFQUFFLElBQUk7Q0FDZixDQUNGLENBQUEifQ==
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PRODUCT_REVIEW_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ exports.PRODUCT_REVIEW_MODULE = "productReview";
10
+ exports.default = (0, utils_1.Module)(exports.PRODUCT_REVIEW_MODULE, {
11
+ service: service_1.default,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxREFBbUQ7QUFDbkQsd0RBQW1EO0FBRXRDLFFBQUEscUJBQXFCLEdBQUcsZUFBZSxDQUFDO0FBRXJELGtCQUFlLElBQUEsY0FBTSxFQUFDLDZCQUFxQixFQUFFO0lBQzNDLE9BQU8sRUFBRSxpQkFBMEI7Q0FDcEMsQ0FBQyxDQUFDIn0=
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250514002111 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250514002111 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "review" ("id" text not null, "title" text null, "content" text not null, "rating" real not null, "first_name" text not null, "last_name" text not null, "status" text check ("status" in ('pending', 'approved', 'rejected')) not null default 'pending', "product_id" text not null, "customer_id" text null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "review_pkey" primary key ("id"), constraint rating_range check (rating >= 1 AND rating <= 5));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_REVIEW_PRODUCT_ID" ON "review" (product_id) WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_review_deleted_at" ON "review" (deleted_at) WHERE deleted_at IS NULL;`);
10
+ }
11
+ async down() {
12
+ this.addSql(`drop table if exists "review" cascade;`);
13
+ }
14
+ }
15
+ exports.Migration20250514002111 = Migration20250514002111;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTQwMDIxMTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE0MDAyMTExLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3akJBQXdqQixDQUFDLENBQUM7UUFDdGtCLElBQUksQ0FBQyxNQUFNLENBQUMsdUdBQXVHLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsTUFBTSxDQUFDLHVHQUF1RyxDQUFDLENBQUM7SUFDdkgsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0NBRUY7QUFaRCwwREFZQyJ9
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250514010337 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250514010337 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "review_media" ("id" text not null, "fileId" text not null, "mimeType" text not null, "review_id" text not null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "review_media_pkey" primary key ("id"));`);
8
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_review_media_review_id" ON "review_media" (review_id) WHERE deleted_at IS NULL;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_review_media_deleted_at" ON "review_media" (deleted_at) WHERE deleted_at IS NULL;`);
10
+ this.addSql(`alter table if exists "review_media" add constraint "review_media_review_id_foreign" foreign key ("review_id") references "review" ("id") on update cascade on delete cascade;`);
11
+ }
12
+ async down() {
13
+ this.addSql(`drop table if exists "review_media" cascade;`);
14
+ }
15
+ }
16
+ exports.Migration20250514010337 = Migration20250514010337;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTQwMTAzMzcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE0MDEwMzM3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrVUFBa1UsQ0FBQyxDQUFDO1FBQ2hWLElBQUksQ0FBQyxNQUFNLENBQUMsaUhBQWlILENBQUMsQ0FBQztRQUMvSCxJQUFJLENBQUMsTUFBTSxDQUFDLG1IQUFtSCxDQUFDLENBQUM7UUFFakksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnTEFBZ0wsQ0FBQyxDQUFDO0lBQ2hNLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUVGO0FBZEQsMERBY0MifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250514020039 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250514020039 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "review" drop column if exists "first_name", drop column if exists "last_name";`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "review" add column if not exists "first_name" text not null, add column if not exists "last_name" text not null;`);
11
+ }
12
+ }
13
+ exports.Migration20250514020039 = Migration20250514020039;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTQwMjAwMzkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE0MDIwMDM5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1R0FBdUcsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHlJQUF5SSxDQUFDLENBQUM7SUFDekosQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250516011714 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250516011714 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "review" add column if not exists "parent_id" text null;`);
8
+ this.addSql(`alter table if exists "review" add constraint "review_parent_id_foreign" foreign key ("parent_id") references "review" ("id") on update cascade on delete set null;`);
9
+ this.addSql(`CREATE INDEX IF NOT EXISTS "IDX_review_parent_id" ON "review" (parent_id) WHERE deleted_at IS NULL;`);
10
+ }
11
+ async down() {
12
+ this.addSql(`alter table if exists "review" drop constraint if exists "review_parent_id_foreign";`);
13
+ this.addSql(`drop index if exists "IDX_review_parent_id";`);
14
+ this.addSql(`alter table if exists "review" drop column if exists "parent_id";`);
15
+ }
16
+ }
17
+ exports.Migration20250516011714 = Migration20250516011714;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTYwMTE3MTQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE2MDExNzE0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxNQUFNLENBQUMscUtBQXFLLENBQUMsQ0FBQztRQUNuTCxJQUFJLENBQUMsTUFBTSxDQUFDLHFHQUFxRyxDQUFDLENBQUM7SUFDckgsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsc0ZBQXNGLENBQUMsQ0FBQztRQUVwRyxJQUFJLENBQUMsTUFBTSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7Q0FFRjtBQWZELDBEQWVDIn0=
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250516015055 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250516015055 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "review" alter column "rating" type real using ("rating"::real);`);
8
+ this.addSql(`alter table if exists "review" alter column "rating" drop not null;`);
9
+ }
10
+ async down() {
11
+ this.addSql(`alter table if exists "review" alter column "rating" type real using ("rating"::real);`);
12
+ this.addSql(`alter table if exists "review" alter column "rating" set not null;`);
13
+ }
14
+ }
15
+ exports.Migration20250516015055 = Migration20250516015055;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTYwMTUwNTUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE2MDE1MDU1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxNQUFNLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxNQUFNLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUNwRixDQUFDO0NBRUY7QUFaRCwwREFZQyJ9
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250516022918 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250516022918 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "review" add column if not exists "is_admin" boolean null;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "review" drop column if exists "is_admin";`);
11
+ }
12
+ }
13
+ exports.Migration20250516022918 = Migration20250516022918;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTYwMjI5MTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE2MDIyOTE4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20250517112618 = void 0;
4
+ const migrations_1 = require("@mikro-orm/migrations");
5
+ class Migration20250517112618 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "review_media" add column if not exists "fileUrl" text not null;`);
8
+ }
9
+ async down() {
10
+ this.addSql(`alter table if exists "review_media" drop column if exists "fileUrl";`);
11
+ }
12
+ }
13
+ exports.Migration20250517112618 = Migration20250517112618;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTA1MTcxMTI2MTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9wcm9kdWN0LXJldmlldy9taWdyYXRpb25zL01pZ3JhdGlvbjIwMjUwNTE3MTEyNjE4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUFrRDtBQUVsRCxNQUFhLHVCQUF3QixTQUFRLHNCQUFTO0lBRTNDLEtBQUssQ0FBQyxFQUFFO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVFQUF1RSxDQUFDLENBQUM7SUFDdkYsQ0FBQztDQUVGO0FBVkQsMERBVUMifQ==
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const review_1 = __importDefault(require("./review"));
8
+ const ReviewMedia = utils_1.model.define("review_media", {
9
+ id: utils_1.model.id().primaryKey(),
10
+ fileId: utils_1.model.text(),
11
+ fileUrl: utils_1.model.text(),
12
+ mimeType: utils_1.model.text(),
13
+ review: utils_1.model.belongsTo(() => review_1.default, {
14
+ mappedBy: "medias",
15
+ }),
16
+ });
17
+ exports.default = ReviewMedia;
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LW1lZGlhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcHJvZHVjdC1yZXZpZXcvbW9kZWxzL3Jldmlldy1tZWRpYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFrRDtBQUNsRCxzREFBOEI7QUFFOUIsTUFBTSxXQUFXLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7SUFDL0MsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUU7SUFDM0IsTUFBTSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDcEIsT0FBTyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDckIsUUFBUSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDdEIsTUFBTSxFQUFFLGFBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQU0sRUFBRTtRQUNwQyxRQUFRLEVBQUUsUUFBUTtLQUNuQixDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBRUgsa0JBQWUsV0FBVyxDQUFDIn0=
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const review_media_1 = __importDefault(require("./review-media"));
8
+ const Review = utils_1.model
9
+ .define("review", {
10
+ id: utils_1.model.id().primaryKey(),
11
+ title: utils_1.model.text().nullable(),
12
+ content: utils_1.model.text(),
13
+ rating: utils_1.model.float().nullable(),
14
+ status: utils_1.model.enum(["pending", "approved", "rejected"]).default("pending"),
15
+ product_id: utils_1.model.text().index("IDX_REVIEW_PRODUCT_ID"),
16
+ customer_id: utils_1.model.text().nullable(),
17
+ is_admin: utils_1.model.boolean().nullable(),
18
+ medias: utils_1.model.hasMany(() => review_media_1.default, {
19
+ mappedBy: "review",
20
+ }),
21
+ parent: utils_1.model
22
+ .belongsTo(() => Review, {
23
+ mappedBy: "children",
24
+ })
25
+ .nullable(),
26
+ children: utils_1.model.hasMany(() => Review, {
27
+ mappedBy: "parent",
28
+ }),
29
+ })
30
+ .cascades({
31
+ delete: ["medias"],
32
+ })
33
+ .checks([
34
+ {
35
+ name: "rating_range",
36
+ expression: (columns) => `${columns.rating} >= 1 AND ${columns.rating} <= 5`,
37
+ },
38
+ ]);
39
+ exports.default = Review;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvcHJvZHVjdC1yZXZpZXcvbW9kZWxzL3Jldmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUFrRDtBQUNsRCxrRUFBeUM7QUFFekMsTUFBTSxNQUFNLEdBQUcsYUFBSztLQUNqQixNQUFNLENBQUMsUUFBUSxFQUFFO0lBQ2hCLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLE9BQU8sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3JCLE1BQU0sRUFBRSxhQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDMUUsVUFBVSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUM7SUFDdkQsV0FBVyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsUUFBUSxFQUFFLGFBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsTUFBTSxFQUFFLGFBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQVcsRUFBRTtRQUN2QyxRQUFRLEVBQUUsUUFBUTtLQUNuQixDQUFDO0lBQ0YsTUFBTSxFQUFFLGFBQUs7U0FDVixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxVQUFVO0tBQ3JCLENBQUM7U0FDRCxRQUFRLEVBQUU7SUFDYixRQUFRLEVBQUUsYUFBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUU7UUFDcEMsUUFBUSxFQUFFLFFBQVE7S0FDbkIsQ0FBQztDQUNILENBQUM7S0FDRCxRQUFRLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Q0FDbkIsQ0FBQztLQUNELE1BQU0sQ0FBQztJQUNOO1FBQ0UsSUFBSSxFQUFFLGNBQWM7UUFDcEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDdEIsR0FBRyxPQUFPLENBQUMsTUFBTSxhQUFhLE9BQU8sQ0FBQyxNQUFNLE9BQU87S0FDdEQ7Q0FDRixDQUFDLENBQUM7QUFFTCxrQkFBZSxNQUFNLENBQUMifQ==
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const review_1 = __importDefault(require("./models/review"));
8
+ const review_media_1 = __importDefault(require("./models/review-media"));
9
+ class ProductReviewModuleService extends (0, utils_1.MedusaService)({
10
+ Review: review_1.default,
11
+ ReviewMedia: review_media_1.default,
12
+ }) {
13
+ }
14
+ exports.default = ProductReviewModuleService;
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3Byb2R1Y3QtcmV2aWV3L3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBMEQ7QUFDMUQsNkRBQXFDO0FBQ3JDLHlFQUFnRDtBQUVoRCxNQUFNLDBCQUEyQixTQUFRLElBQUEscUJBQWEsRUFBQztJQUNyRCxNQUFNLEVBQU4sZ0JBQU07SUFDTixXQUFXLEVBQVgsc0JBQVc7Q0FDWixDQUFDO0NBQUc7QUFFTCxrQkFBZSwwQkFBMEIsQ0FBQyJ9
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createReviewWorkflow = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const product_review_1 = require("../../modules/product-review");
7
+ const createReviewStep = (0, workflows_sdk_1.createStep)("create-review", async (input, { container }) => {
8
+ // check valid product
9
+ const productService = container.resolve(utils_1.Modules.PRODUCT);
10
+ const product = await productService.retrieveProduct(input.product_id);
11
+ if (!product) {
12
+ throw new Error("Product not found");
13
+ }
14
+ const reviewModuleService = container.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
15
+ const { medias, ...reviewData } = input;
16
+ if (!reviewData.parent_id && !reviewData.rating) {
17
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "if it's a review, rating is required or if it's a reply, parent_id is required");
18
+ }
19
+ if (reviewData.parent_id) {
20
+ // auto throw error if parent review not found
21
+ const parentReview = await reviewModuleService.retrieveReview(reviewData.parent_id);
22
+ if (parentReview.product_id !== reviewData.product_id) {
23
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Parent review and review must be for the same product");
24
+ }
25
+ if (parentReview.parent_id) {
26
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Max depth of replies is 1");
27
+ }
28
+ }
29
+ const review = await reviewModuleService.createReviews(reviewData);
30
+ try {
31
+ await reviewModuleService.createReviewMedias(medias.map((media) => ({
32
+ review_id: review.id,
33
+ fileUrl: media.fileUrl,
34
+ fileId: media.fileId,
35
+ mimeType: media.mimeType,
36
+ })));
37
+ return new workflows_sdk_1.StepResponse(review, review.id);
38
+ }
39
+ catch (error) {
40
+ await reviewModuleService.deleteReviewMedias(medias.map((media) => media.fileId));
41
+ if (review.id) {
42
+ await reviewModuleService.deleteReviews(review.id);
43
+ }
44
+ throw error;
45
+ }
46
+ }, async (reviewId, { container }) => {
47
+ if (!reviewId) {
48
+ return;
49
+ }
50
+ const reviewModuleService = container.resolve(product_review_1.PRODUCT_REVIEW_MODULE);
51
+ await reviewModuleService.deleteReviews(reviewId);
52
+ });
53
+ exports.createReviewWorkflow = (0, workflows_sdk_1.createWorkflow)("create-review", (input) => {
54
+ // Create the review
55
+ const review = createReviewStep(input);
56
+ return new workflows_sdk_1.WorkflowResponse({
57
+ review,
58
+ });
59
+ });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUmV2aWV3V29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3Jldmlldy9jcmVhdGVSZXZpZXdXb3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBaUU7QUFDakUscUVBSzJDO0FBQzNDLGlFQUFxRTtBQW1CckUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDBCQUFVLEVBQ2pDLGVBQWUsRUFDZixLQUFLLEVBQUUsS0FBd0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDaEQsc0JBQXNCO0lBQ3RCLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFELE1BQU0sT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFdkUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUErQixTQUFTLENBQUMsT0FBTyxDQUN2RSxzQ0FBcUIsQ0FDdEIsQ0FBQztJQUVGLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsZ0ZBQWdGLENBQ2pGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekIsOENBQThDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsY0FBYyxDQUMzRCxVQUFVLENBQUMsU0FBUyxDQUNyQixDQUFDO1FBRUYsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix1REFBdUQsQ0FDeEQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QiwyQkFBMkIsQ0FDNUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyQixTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDcEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7U0FDekIsQ0FBQyxDQUFDLENBQ0osQ0FBQztRQUVGLE9BQU8sSUFBSSw0QkFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLG1CQUFtQixDQUFDLGtCQUFrQixDQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQ3BDLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNkLE1BQU0sbUJBQW1CLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyxFQUNELEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxtQkFBbUIsR0FBK0IsU0FBUyxDQUFDLE9BQU8sQ0FDdkUsc0NBQXFCLENBQ3RCLENBQUM7SUFFRixNQUFNLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQ0YsQ0FBQztBQUVXLFFBQUEsb0JBQW9CLEdBQUcsSUFBQSw4QkFBYyxFQUNoRCxlQUFlLEVBQ2YsQ0FBQyxLQUF3QixFQUFFLEVBQUU7SUFDM0Isb0JBQW9CO0lBQ3BCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZDLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FBQztRQUMxQixNQUFNO0tBQ1AsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUNGLENBQUMifQ==