@leonardozhe/medusa-plugin-product-reviews 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/dist/admin/index.d.ts +28 -0
- package/dist/admin/index.js +79 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/menu.d.ts +20 -0
- package/dist/admin/menu.js +28 -0
- package/dist/admin/menu.js.map +1 -0
- package/dist/admin/routes.d.ts +32 -0
- package/dist/admin/routes.js +116 -0
- package/dist/admin/routes.js.map +1 -0
- package/dist/admin/widgets.d.ts +35 -0
- package/dist/admin/widgets.js +119 -0
- package/dist/admin/widgets.js.map +1 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +64 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/routes/product-review-image-upload-routes.d.ts +6 -0
- package/dist/api/routes/product-review-image-upload-routes.js +33 -0
- package/dist/api/routes/product-review-image-upload-routes.js.map +1 -0
- package/dist/api/routes/product-review-request-routes.d.ts +3 -0
- package/dist/api/routes/product-review-request-routes.js +22 -0
- package/dist/api/routes/product-review-request-routes.js.map +1 -0
- package/dist/api/routes/product-review-routes.d.ts +3 -0
- package/dist/api/routes/product-review-routes.js +129 -0
- package/dist/api/routes/product-review-routes.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/1683131541071-ProductReview.d.ts +5 -0
- package/dist/migrations/1683131541071-ProductReview.js +32 -0
- package/dist/migrations/1683131541071-ProductReview.js.map +1 -0
- package/dist/migrations/1683131541072-ProductReviewImage.d.ts +5 -0
- package/dist/migrations/1683131541072-ProductReviewImage.js +41 -0
- package/dist/migrations/1683131541072-ProductReviewImage.js.map +1 -0
- package/dist/migrations/1683131541073-ProductReviewRequest.d.ts +5 -0
- package/dist/migrations/1683131541073-ProductReviewRequest.js +29 -0
- package/dist/migrations/1683131541073-ProductReviewRequest.js.map +1 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.js +19 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/product-review-request.d.ts +6 -0
- package/dist/models/product-review-request.js +42 -0
- package/dist/models/product-review-request.js.map +1 -0
- package/dist/models/product-review.d.ts +12 -0
- package/dist/models/product-review.js +82 -0
- package/dist/models/product-review.js.map +1 -0
- package/dist/module.d.ts +22 -0
- package/dist/module.js +38 -0
- package/dist/module.js.map +1 -0
- package/dist/plugin.d.ts +16 -0
- package/dist/plugin.js +27 -0
- package/dist/plugin.js.map +1 -0
- package/dist/repositories/index.d.ts +2 -0
- package/dist/repositories/index.js +11 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/product-review-request.d.ts +2 -0
- package/dist/repositories/product-review-request.js +7 -0
- package/dist/repositories/product-review-request.js.map +1 -0
- package/dist/repositories/product-review.d.ts +2 -0
- package/dist/repositories/product-review.js +7 -0
- package/dist/repositories/product-review.js.map +1 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.js +17 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/product-review-image.d.ts +19 -0
- package/dist/services/product-review-image.js +55 -0
- package/dist/services/product-review-image.js.map +1 -0
- package/dist/services/product-review-request.d.ts +31 -0
- package/dist/services/product-review-request.js +59 -0
- package/dist/services/product-review-request.js.map +1 -0
- package/dist/services/product-review.d.ts +43 -0
- package/dist/services/product-review.js +149 -0
- package/dist/services/product-review.js.map +1 -0
- package/dist/types/file.d.ts +22 -0
- package/dist/types/file.js +19 -0
- package/dist/types/file.js.map +1 -0
- package/dist/types/product-review.d.ts +24 -0
- package/dist/types/product-review.js +3 -0
- package/dist/types/product-review.js.map +1 -0
- package/dist/validators/index.d.ts +1 -0
- package/dist/validators/index.js +18 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/product-review.validator.d.ts +42 -0
- package/dist/validators/product-review.validator.js +186 -0
- package/dist/validators/product-review.validator.js.map +1 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Medusa Plugin Product Reviews
|
|
2
|
+
|
|
3
|
+
A plugin that enables customer product reviews for Medusa v2.13+.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
yarn add @leonardozhe/medusa-plugin-product-reviews
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
Add to your `medusa.config.js`:
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
module.exports = {
|
|
17
|
+
plugins: [
|
|
18
|
+
{
|
|
19
|
+
resolve: "@leonardozhe/medusa-plugin-product-reviews",
|
|
20
|
+
options: {
|
|
21
|
+
auto_approve: false,
|
|
22
|
+
max_images: 5
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
admin: {
|
|
27
|
+
extensions: [
|
|
28
|
+
{
|
|
29
|
+
resolve: "@leonardozhe/medusa-plugin-product-reviews/admin"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Run migrations:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
yarn medusa migrations run
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## API Routes
|
|
43
|
+
|
|
44
|
+
### Admin
|
|
45
|
+
- `GET /admin/product-reviews` - List all reviews
|
|
46
|
+
- `DELETE /admin/product-reviews/:id` - Delete a review
|
|
47
|
+
- `GET /admin/product-review-requests` - List review requests
|
|
48
|
+
|
|
49
|
+
### Store
|
|
50
|
+
- `GET /store/product-reviews` - List product reviews (public)
|
|
51
|
+
- `POST /store/product-reviews` - Create a review
|
|
52
|
+
- `POST /store/product-review-image-upload` - Upload review image
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
MIT
|
|
57
|
+
|
|
58
|
+
## Repository
|
|
59
|
+
|
|
60
|
+
https://github.com/leonardozhe/medusa-plugin-product-reviews
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
Original author: Lambda Curry
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Product Reviews Admin Extension
|
|
3
|
+
*
|
|
4
|
+
* Provides admin UI components for managing product reviews.
|
|
5
|
+
* Compatible with Medusa v2 Admin SDK.
|
|
6
|
+
*
|
|
7
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
8
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
9
|
+
*/
|
|
10
|
+
declare const _default: {
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
widgets: {
|
|
14
|
+
"product.details.after": {
|
|
15
|
+
component: () => Promise<typeof import("./widgets").ProductReviewsWidget>;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
routes: {
|
|
19
|
+
path: string;
|
|
20
|
+
component: () => Promise<any>;
|
|
21
|
+
}[];
|
|
22
|
+
menuItems: {
|
|
23
|
+
label: string;
|
|
24
|
+
path: string;
|
|
25
|
+
icon: string;
|
|
26
|
+
}[];
|
|
27
|
+
};
|
|
28
|
+
export default _default;
|
|
@@ -0,0 +1,79 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
/**
|
|
37
|
+
* Product Reviews Admin Extension
|
|
38
|
+
*
|
|
39
|
+
* Provides admin UI components for managing product reviews.
|
|
40
|
+
* Compatible with Medusa v2 Admin SDK.
|
|
41
|
+
*
|
|
42
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
43
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
44
|
+
*/
|
|
45
|
+
exports.default = {
|
|
46
|
+
id: "product-reviews-admin",
|
|
47
|
+
label: "Product Reviews",
|
|
48
|
+
// Widget definitions for product details page
|
|
49
|
+
widgets: {
|
|
50
|
+
"product.details.after": {
|
|
51
|
+
component: () => Promise.resolve().then(() => __importStar(require("./widgets"))).then(m => m.ProductReviewsWidget)
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
// Custom routes
|
|
55
|
+
routes: [
|
|
56
|
+
{
|
|
57
|
+
path: "/reviews",
|
|
58
|
+
component: () => Promise.resolve().then(() => __importStar(require("./routes"))).then(m => m.ProductReviewsPage)
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
path: "/review-requests",
|
|
62
|
+
component: () => Promise.resolve().then(() => __importStar(require("./routes"))).then(m => m.ProductReviewRequestsPage)
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
// Menu items
|
|
66
|
+
menuItems: [
|
|
67
|
+
{
|
|
68
|
+
label: "Product Reviews",
|
|
69
|
+
path: "/reviews",
|
|
70
|
+
icon: "star"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
label: "Review Requests",
|
|
74
|
+
path: "/review-requests",
|
|
75
|
+
icon: "envelope"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;GAQG;AACH,kBAAe;IACb,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,iBAAiB;IAExB,8CAA8C;IAC9C,OAAO,EAAE;QACP,uBAAuB,EAAE;YACvB,SAAS,EAAE,GAAG,EAAE,CAAC,kDAAO,WAAW,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;SACvE;KACF;IAED,gBAAgB;IAChB,MAAM,EAAE;QACN;YACE,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;SACpE;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,GAAG,EAAE,CAAC,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC;SAC3E;KACF;IAED,aAAa;IACb,SAAS,EAAE;QACT;YACE,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,MAAM;SACb;QACD;YACE,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;SACjB;KACF;CACF,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Product Reviews Admin Menu Items
|
|
3
|
+
*
|
|
4
|
+
* Menu configuration for the admin sidebar.
|
|
5
|
+
*
|
|
6
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
7
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
8
|
+
*/
|
|
9
|
+
export declare const productReviewsMenuItems: {
|
|
10
|
+
label: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
path: string;
|
|
13
|
+
permissions: string[];
|
|
14
|
+
}[];
|
|
15
|
+
export declare const productReviewRequestsMenuItems: {
|
|
16
|
+
label: string;
|
|
17
|
+
icon: string;
|
|
18
|
+
path: string;
|
|
19
|
+
permissions: string[];
|
|
20
|
+
}[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Product Reviews Admin Menu Items
|
|
4
|
+
*
|
|
5
|
+
* Menu configuration for the admin sidebar.
|
|
6
|
+
*
|
|
7
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
8
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.productReviewRequestsMenuItems = exports.productReviewsMenuItems = void 0;
|
|
12
|
+
exports.productReviewsMenuItems = [
|
|
13
|
+
{
|
|
14
|
+
label: "Product Reviews",
|
|
15
|
+
icon: "star",
|
|
16
|
+
path: "/reviews",
|
|
17
|
+
permissions: ["product_reviews.view"]
|
|
18
|
+
}
|
|
19
|
+
];
|
|
20
|
+
exports.productReviewRequestsMenuItems = [
|
|
21
|
+
{
|
|
22
|
+
label: "Review Requests",
|
|
23
|
+
icon: "envelope",
|
|
24
|
+
path: "/review-requests",
|
|
25
|
+
permissions: ["product_review_requests.view"]
|
|
26
|
+
}
|
|
27
|
+
];
|
|
28
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/admin/menu.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEU,QAAA,uBAAuB,GAAG;IACrC;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,CAAC,sBAAsB,CAAC;KACtC;CACF,CAAA;AAEY,QAAA,8BAA8B,GAAG;IAC5C;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,CAAC,8BAA8B,CAAC;KAC9C;CACF,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Product Reviews Route
|
|
3
|
+
*
|
|
4
|
+
* Main route for viewing and managing product reviews.
|
|
5
|
+
*
|
|
6
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
7
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
8
|
+
*/
|
|
9
|
+
export declare const productReviewsRoute: {
|
|
10
|
+
path: string;
|
|
11
|
+
label: string;
|
|
12
|
+
icon: string;
|
|
13
|
+
component: () => any;
|
|
14
|
+
children: {
|
|
15
|
+
path: string;
|
|
16
|
+
component: () => any;
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Product Review Requests Route
|
|
21
|
+
*
|
|
22
|
+
* Route for viewing and managing review requests.
|
|
23
|
+
*
|
|
24
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
25
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
26
|
+
*/
|
|
27
|
+
export declare const productReviewRequestsRoute: {
|
|
28
|
+
path: string;
|
|
29
|
+
label: string;
|
|
30
|
+
icon: string;
|
|
31
|
+
component: () => any;
|
|
32
|
+
};
|
|
@@ -0,0 +1,116 @@
|
|
|
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.productReviewRequestsRoute = exports.productReviewsRoute = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const ui_1 = require("@medusajs/ui");
|
|
9
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
10
|
+
const react_1 = __importDefault(require("react"));
|
|
11
|
+
/**
|
|
12
|
+
* Product Reviews Route
|
|
13
|
+
*
|
|
14
|
+
* Main route for viewing and managing product reviews.
|
|
15
|
+
*
|
|
16
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
17
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
18
|
+
*/
|
|
19
|
+
exports.productReviewsRoute = {
|
|
20
|
+
path: "/reviews",
|
|
21
|
+
label: "Reviews",
|
|
22
|
+
icon: "star",
|
|
23
|
+
component: () => (0, jsx_runtime_1.jsx)(ProductReviewsPage, {}),
|
|
24
|
+
children: [
|
|
25
|
+
{
|
|
26
|
+
path: "/reviews/:id",
|
|
27
|
+
component: () => (0, jsx_runtime_1.jsx)(ProductReviewDetailPage, {})
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
};
|
|
31
|
+
function ProductReviewsPage() {
|
|
32
|
+
const { data: reviews, isLoading, refetch } = (0, react_query_1.useQuery)({
|
|
33
|
+
queryKey: ["all-product-reviews"],
|
|
34
|
+
queryFn: async () => {
|
|
35
|
+
const response = await fetch("/admin/product-reviews", {
|
|
36
|
+
headers: {
|
|
37
|
+
"Content-Type": "application/json"
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return response.json();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const deleteMutation = (0, react_query_1.useMutation)({
|
|
44
|
+
mutationFn: async (reviewId) => {
|
|
45
|
+
const response = await fetch(`/admin/product-reviews/${reviewId}`, {
|
|
46
|
+
method: "DELETE",
|
|
47
|
+
headers: {
|
|
48
|
+
"Content-Type": "application/json"
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return response.json();
|
|
52
|
+
},
|
|
53
|
+
onSuccess: () => {
|
|
54
|
+
ui_1.toast.success("Review deleted successfully");
|
|
55
|
+
refetch();
|
|
56
|
+
},
|
|
57
|
+
onError: () => {
|
|
58
|
+
ui_1.toast.error("Failed to delete review");
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const handleDelete = (reviewId) => {
|
|
62
|
+
if (confirm("Are you sure you want to delete this review?")) {
|
|
63
|
+
deleteMutation.mutate(reviewId);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
if (isLoading) {
|
|
67
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading reviews..." });
|
|
68
|
+
}
|
|
69
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-6", children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h2", children: "Product Reviews" }), (0, jsx_runtime_1.jsx)(ui_1.Button, { onClick: () => refetch(), children: "Refresh" })] }), reviews?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "border rounded-lg overflow-hidden", children: (0, jsx_runtime_1.jsxs)("table", { className: "w-full", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-gray-50", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Product" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Title" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Rating" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Status" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Date" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-right", children: "Actions" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: reviews.map((review) => ((0, jsx_runtime_1.jsxs)("tr", { className: "border-t hover:bg-gray-50", children: [(0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: review.product?.title || "Unknown" }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: review.title }), (0, jsx_runtime_1.jsxs)("td", { className: "px-4 py-3", children: [review.rating, "/5"] }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: (0, jsx_runtime_1.jsx)("span", { className: `inline-block px-2 py-1 rounded text-xs ${review.status === "approved"
|
|
70
|
+
? "bg-green-100 text-green-800"
|
|
71
|
+
: review.status === "rejected"
|
|
72
|
+
? "bg-red-100 text-red-800"
|
|
73
|
+
: "bg-yellow-100 text-yellow-800"}`, children: review.status }) }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: review.created_at
|
|
74
|
+
? new Date(review.created_at).toLocaleDateString()
|
|
75
|
+
: "N/A" }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3 text-right", children: (0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "danger", size: "small", onClick: () => handleDelete(review.id), children: "Delete" }) })] }, review.id))) })] }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "text-center py-12", children: (0, jsx_runtime_1.jsx)("p", { className: "text-gray-500", children: "No reviews found." }) }))] }));
|
|
76
|
+
}
|
|
77
|
+
function ProductReviewDetailPage() {
|
|
78
|
+
// Implementation for detail view
|
|
79
|
+
return ((0, jsx_runtime_1.jsx)(ui_1.Container, { children: (0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h2", children: "Review Details" }) }));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Product Review Requests Route
|
|
83
|
+
*
|
|
84
|
+
* Route for viewing and managing review requests.
|
|
85
|
+
*
|
|
86
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
87
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
88
|
+
*/
|
|
89
|
+
exports.productReviewRequestsRoute = {
|
|
90
|
+
path: "/review-requests",
|
|
91
|
+
label: "Review Requests",
|
|
92
|
+
icon: "envelope",
|
|
93
|
+
component: () => (0, jsx_runtime_1.jsx)(ProductReviewRequestsPage, {})
|
|
94
|
+
};
|
|
95
|
+
function ProductReviewRequestsPage() {
|
|
96
|
+
const { data: requests, isLoading } = (0, react_query_1.useQuery)({
|
|
97
|
+
queryKey: ["product-review-requests"],
|
|
98
|
+
queryFn: async () => {
|
|
99
|
+
const response = await fetch("/admin/product-review-requests", {
|
|
100
|
+
headers: {
|
|
101
|
+
"Content-Type": "application/json"
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return response.json();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
if (isLoading) {
|
|
108
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading requests..." });
|
|
109
|
+
}
|
|
110
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h2", className: "mb-6", children: "Review Requests" }), requests?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "border rounded-lg overflow-hidden", children: (0, jsx_runtime_1.jsxs)("table", { className: "w-full", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-gray-50", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Product" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Customer Email" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Status" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Date" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: requests.map((request) => ((0, jsx_runtime_1.jsxs)("tr", { className: "border-t hover:bg-gray-50", children: [(0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: request.product?.title || "Unknown" }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: request.customer_email }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: (0, jsx_runtime_1.jsx)("span", { className: `inline-block px-2 py-1 rounded text-xs ${request.status === "completed"
|
|
111
|
+
? "bg-green-100 text-green-800"
|
|
112
|
+
: "bg-yellow-100 text-yellow-800"}`, children: request.status }) }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: request.created_at
|
|
113
|
+
? new Date(request.created_at).toLocaleDateString()
|
|
114
|
+
: "N/A" })] }, request.id))) })] }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "text-center py-12", children: (0, jsx_runtime_1.jsx)("p", { className: "text-gray-500", children: "No review requests found." }) }))] }));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/admin/routes.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type DetailWidgetProps } from "@medusajs/framework/types";
|
|
2
|
+
/**
|
|
3
|
+
* Product Reviews Widget
|
|
4
|
+
*
|
|
5
|
+
* Displays product reviews summary on the product details page.
|
|
6
|
+
*
|
|
7
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
8
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
9
|
+
*/
|
|
10
|
+
export declare function ProductReviewsWidget({ data, notify }: DetailWidgetProps): any;
|
|
11
|
+
/**
|
|
12
|
+
* Product Review Requests Widget
|
|
13
|
+
*
|
|
14
|
+
* Displays review request status for the product.
|
|
15
|
+
*
|
|
16
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
17
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
18
|
+
*/
|
|
19
|
+
export declare function ProductReviewRequestsWidget({ data, notify }: DetailWidgetProps): any;
|
|
20
|
+
/**
|
|
21
|
+
* Product Reviews List Component
|
|
22
|
+
*
|
|
23
|
+
* Displays a list of product reviews.
|
|
24
|
+
*/
|
|
25
|
+
export declare function ProductReviewsList({ productId }: {
|
|
26
|
+
productId: string;
|
|
27
|
+
}): any;
|
|
28
|
+
/**
|
|
29
|
+
* Product Review Details Component
|
|
30
|
+
*
|
|
31
|
+
* Displays details of a single review.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ProductReviewDetails({ reviewId }: {
|
|
34
|
+
reviewId: string;
|
|
35
|
+
}): any;
|
|
@@ -0,0 +1,119 @@
|
|
|
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.ProductReviewsWidget = ProductReviewsWidget;
|
|
7
|
+
exports.ProductReviewRequestsWidget = ProductReviewRequestsWidget;
|
|
8
|
+
exports.ProductReviewsList = ProductReviewsList;
|
|
9
|
+
exports.ProductReviewDetails = ProductReviewDetails;
|
|
10
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
11
|
+
const ui_1 = require("@medusajs/ui");
|
|
12
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
13
|
+
const icons_1 = require("@medusajs/icons");
|
|
14
|
+
const react_1 = __importDefault(require("react"));
|
|
15
|
+
/**
|
|
16
|
+
* Product Reviews Widget
|
|
17
|
+
*
|
|
18
|
+
* Displays product reviews summary on the product details page.
|
|
19
|
+
*
|
|
20
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
21
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
22
|
+
*/
|
|
23
|
+
function ProductReviewsWidget({ data, notify }) {
|
|
24
|
+
const productId = data?.id;
|
|
25
|
+
const { data: reviews, isLoading } = (0, react_query_1.useQuery)({
|
|
26
|
+
queryKey: ["product-reviews", productId],
|
|
27
|
+
queryFn: async () => {
|
|
28
|
+
// Fetch reviews for this product
|
|
29
|
+
const response = await fetch(`/admin/product-reviews?product_id=${productId}`, {
|
|
30
|
+
headers: {
|
|
31
|
+
"Content-Type": "application/json"
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return response.json();
|
|
35
|
+
},
|
|
36
|
+
enabled: !!productId
|
|
37
|
+
});
|
|
38
|
+
if (isLoading) {
|
|
39
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-4", children: "Loading reviews..." });
|
|
40
|
+
}
|
|
41
|
+
const reviewCount = reviews?.count || 0;
|
|
42
|
+
const averageRating = reviews?.average_rating || 0;
|
|
43
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h4", children: "Product Reviews" }), (0, jsx_runtime_1.jsxs)(ui_1.Badge, { color: "blue", children: [reviewCount, " reviews"] })] }), reviewCount > 0 ? ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Text, { className: "text-lg font-semibold", children: averageRating.toFixed(1) }), (0, jsx_runtime_1.jsx)("div", { className: "flex", children: [1, 2, 3, 4, 5].map((star) => ((0, jsx_runtime_1.jsx)(icons_1.Star, { className: `h-5 w-5 ${star <= Math.round(averageRating)
|
|
44
|
+
? "text-orange-400"
|
|
45
|
+
: "text-gray-200"}`, filled: star <= Math.round(averageRating) }, star))) })] }), (0, jsx_runtime_1.jsx)(ui_1.Text, { size: "small", className: "text-gray-500", children: "Average rating based on customer feedback" })] })) : ((0, jsx_runtime_1.jsx)(ui_1.Text, { size: "small", className: "text-gray-500", children: "No reviews yet. Encourage customers to leave reviews!" }))] }));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Product Review Requests Widget
|
|
49
|
+
*
|
|
50
|
+
* Displays review request status for the product.
|
|
51
|
+
*
|
|
52
|
+
* @author Lambda Curry <team@lambdacurry.dev>
|
|
53
|
+
* @author Modified for Medusa 2.13 compatibility by leonardozhe
|
|
54
|
+
*/
|
|
55
|
+
function ProductReviewRequestsWidget({ data, notify }) {
|
|
56
|
+
const productId = data?.id;
|
|
57
|
+
const { data: requests, isLoading } = (0, react_query_1.useQuery)({
|
|
58
|
+
queryKey: ["product-review-requests", productId],
|
|
59
|
+
queryFn: async () => {
|
|
60
|
+
const response = await fetch(`/admin/product-review-requests?product_id=${productId}`, {
|
|
61
|
+
headers: {
|
|
62
|
+
"Content-Type": "application/json"
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return response.json();
|
|
66
|
+
},
|
|
67
|
+
enabled: !!productId
|
|
68
|
+
});
|
|
69
|
+
if (isLoading) {
|
|
70
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-4", children: "Loading requests..." });
|
|
71
|
+
}
|
|
72
|
+
const pendingCount = requests?.filter((r) => r.status === "pending")?.length || 0;
|
|
73
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h4", children: "Review Requests" }), pendingCount > 0 && ((0, jsx_runtime_1.jsxs)(ui_1.Badge, { color: "orange", children: [pendingCount, " pending"] }))] }), (0, jsx_runtime_1.jsxs)(ui_1.Text, { size: "small", className: "text-gray-500", children: [requests?.length || 0, " review requests sent for this product"] })] }));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Product Reviews List Component
|
|
77
|
+
*
|
|
78
|
+
* Displays a list of product reviews.
|
|
79
|
+
*/
|
|
80
|
+
function ProductReviewsList({ productId }) {
|
|
81
|
+
const { data: reviews, isLoading } = (0, react_query_1.useQuery)({
|
|
82
|
+
queryKey: ["product-reviews-list", productId],
|
|
83
|
+
queryFn: async () => {
|
|
84
|
+
const response = await fetch(`/admin/product-reviews?product_id=${productId}`, {
|
|
85
|
+
headers: {
|
|
86
|
+
"Content-Type": "application/json"
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return response.json();
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
if (isLoading) {
|
|
93
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading..." });
|
|
94
|
+
}
|
|
95
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h3", className: "mb-4", children: "Product Reviews" }), reviews?.reviews?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: reviews.reviews.map((review) => ((0, jsx_runtime_1.jsxs)("div", { className: "border rounded-lg p-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Text, { className: "font-semibold", children: review.title }), (0, jsx_runtime_1.jsx)("div", { className: "flex", children: [1, 2, 3, 4, 5].map((star) => ((0, jsx_runtime_1.jsx)(icons_1.Star, { className: `h-4 w-4 ${star <= review.rating ? "text-orange-400" : "text-gray-200"}`, filled: star <= review.rating }, star))) })] }), (0, jsx_runtime_1.jsx)(ui_1.Text, { size: "small", children: review.content }), review.created_at && ((0, jsx_runtime_1.jsx)(ui_1.Text, { size: "x-small", className: "text-gray-500 mt-2", children: new Date(review.created_at).toLocaleDateString() }))] }, review.id))) })) : ((0, jsx_runtime_1.jsx)(ui_1.Text, { children: "No reviews found." }))] }));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Product Review Details Component
|
|
99
|
+
*
|
|
100
|
+
* Displays details of a single review.
|
|
101
|
+
*/
|
|
102
|
+
function ProductReviewDetails({ reviewId }) {
|
|
103
|
+
const { data: review, isLoading } = (0, react_query_1.useQuery)({
|
|
104
|
+
queryKey: ["product-review-detail", reviewId],
|
|
105
|
+
queryFn: async () => {
|
|
106
|
+
const response = await fetch(`/admin/product-reviews/${reviewId}`, {
|
|
107
|
+
headers: {
|
|
108
|
+
"Content-Type": "application/json"
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
return response.json();
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
if (isLoading) {
|
|
115
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading..." });
|
|
116
|
+
}
|
|
117
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h3", className: "mb-4", children: "Review Details" }), review && ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h4", children: review.title }), (0, jsx_runtime_1.jsx)("div", { className: "flex mt-2", children: [1, 2, 3, 4, 5].map((star) => ((0, jsx_runtime_1.jsx)(icons_1.Star, { className: `h-5 w-5 ${star <= review.rating ? "text-orange-400" : "text-gray-200"}`, filled: star <= review.rating }, star))) })] }), (0, jsx_runtime_1.jsx)(ui_1.Text, { children: review.content }), review.images && review.images.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-3 gap-2", children: review.images.map((image, index) => ((0, jsx_runtime_1.jsx)("img", { src: image.url, alt: `Review image ${index + 1}`, className: "w-full h-24 object-cover rounded" }, index))) }))] }))] }));
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=widgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/admin/widgets.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
export type RouteMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head";
|
|
3
|
+
export interface RouteConfig {
|
|
4
|
+
path: string;
|
|
5
|
+
method: RouteMethod;
|
|
6
|
+
handlers: any[];
|
|
7
|
+
requiredAuth: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const createRoute: (router: Router, route: RouteConfig) => void;
|
|
10
|
+
export default function (rootDirectory: string): import("express-serve-static-core").Router;
|
|
@@ -0,0 +1,64 @@
|
|
|
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.createRoute = void 0;
|
|
7
|
+
exports.default = default_1;
|
|
8
|
+
const error_handler_1 = __importDefault(require("@medusajs/medusa/dist/api/middlewares/error-handler"));
|
|
9
|
+
const body_parser_1 = __importDefault(require("body-parser"));
|
|
10
|
+
const cors_1 = __importDefault(require("cors"));
|
|
11
|
+
const express_1 = require("express");
|
|
12
|
+
const medusa_core_utils_1 = require("medusa-core-utils");
|
|
13
|
+
const medusa_1 = require("@medusajs/medusa");
|
|
14
|
+
const product_review_routes_1 = require("./routes/product-review-routes");
|
|
15
|
+
const product_review_request_routes_1 = require("./routes/product-review-request-routes");
|
|
16
|
+
const product_review_image_upload_routes_1 = require("./routes/product-review-image-upload-routes");
|
|
17
|
+
const routes = [...product_review_image_upload_routes_1.routes, ...product_review_routes_1.routes, ...product_review_request_routes_1.routes];
|
|
18
|
+
const createRoute = (router, route) => {
|
|
19
|
+
try {
|
|
20
|
+
if (route.path.startsWith("/admin"))
|
|
21
|
+
return createAdminRoute(router, route);
|
|
22
|
+
if (route.path.startsWith("/store"))
|
|
23
|
+
return createStoreRoute(router, route);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error(error, route);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.createRoute = createRoute;
|
|
30
|
+
const createAdminRoute = (router, route) => {
|
|
31
|
+
const { method, path, handlers, requiredAuth } = route;
|
|
32
|
+
const defaultAdminMiddleware = [requiredAuth ? (0, medusa_1.authenticate)() : null].filter((a) => a !== null);
|
|
33
|
+
router[method](path, ...defaultAdminMiddleware, ...handlers);
|
|
34
|
+
};
|
|
35
|
+
const createStoreRoute = (router, route) => {
|
|
36
|
+
const { method, path, handlers, requiredAuth } = route;
|
|
37
|
+
const defaultMiddleware = [requiredAuth ? (0, medusa_1.authenticateCustomer)() : null].filter((a) => a);
|
|
38
|
+
router[method](path, ...defaultMiddleware, ...handlers);
|
|
39
|
+
};
|
|
40
|
+
function default_1(rootDirectory) {
|
|
41
|
+
const router = (0, express_1.Router)();
|
|
42
|
+
router.use(body_parser_1.default.json());
|
|
43
|
+
router.use((req, res, next) => {
|
|
44
|
+
const config = req.scope.resolve("configModule");
|
|
45
|
+
const adminCors = (0, cors_1.default)({
|
|
46
|
+
origin: (0, medusa_core_utils_1.parseCorsOrigins)(config.projectConfig.admin_cors || ""),
|
|
47
|
+
credentials: true,
|
|
48
|
+
});
|
|
49
|
+
const storeCors = (0, cors_1.default)({
|
|
50
|
+
origin: (0, medusa_core_utils_1.parseCorsOrigins)(config.projectConfig.store_cors || ""),
|
|
51
|
+
credentials: true,
|
|
52
|
+
});
|
|
53
|
+
if (req.path.startsWith("/admin"))
|
|
54
|
+
return adminCors(req, res, next);
|
|
55
|
+
if (req.path.startsWith("/store"))
|
|
56
|
+
return storeCors(req, res, next);
|
|
57
|
+
return next();
|
|
58
|
+
});
|
|
59
|
+
for (const route of routes)
|
|
60
|
+
(0, exports.createRoute)(router, route);
|
|
61
|
+
router.use((0, error_handler_1.default)());
|
|
62
|
+
return router;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
|