medusa-plugin-ratings 0.1.0

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 (31) hide show
  1. package/.medusa/server/medusa-config.d.ts +1 -0
  2. package/.medusa/server/medusa-config.js +23 -0
  3. package/.medusa/server/src/admin/index.js +490 -0
  4. package/.medusa/server/src/admin/index.mjs +489 -0
  5. package/.medusa/server/src/api/admin/reviews/[id]/route.d.ts +5 -0
  6. package/.medusa/server/src/api/admin/reviews/[id]/route.js +48 -0
  7. package/.medusa/server/src/api/admin/reviews/approve/route.d.ts +3 -0
  8. package/.medusa/server/src/api/admin/reviews/approve/route.js +25 -0
  9. package/.medusa/server/src/api/admin/reviews/reject/route.d.ts +3 -0
  10. package/.medusa/server/src/api/admin/reviews/reject/route.js +25 -0
  11. package/.medusa/server/src/api/admin/reviews/route.d.ts +4 -0
  12. package/.medusa/server/src/api/admin/reviews/route.js +34 -0
  13. package/.medusa/server/src/api/middlewares.d.ts +2 -0
  14. package/.medusa/server/src/api/middlewares.js +84 -0
  15. package/.medusa/server/src/api/store/reviews/[productId]/route.d.ts +4 -0
  16. package/.medusa/server/src/api/store/reviews/[productId]/route.js +85 -0
  17. package/.medusa/server/src/api/validators.d.ts +144 -0
  18. package/.medusa/server/src/api/validators.js +38 -0
  19. package/.medusa/server/src/modules/review/index.d.ts +36 -0
  20. package/.medusa/server/src/modules/review/index.js +25 -0
  21. package/.medusa/server/src/modules/review/migrations/Migration20260409183947.d.ts +5 -0
  22. package/.medusa/server/src/modules/review/migrations/Migration20260409183947.js +22 -0
  23. package/.medusa/server/src/modules/review/models/review-activity.d.ts +27 -0
  24. package/.medusa/server/src/modules/review/models/review-activity.js +21 -0
  25. package/.medusa/server/src/modules/review/models/review.d.ts +26 -0
  26. package/.medusa/server/src/modules/review/models/review.js +30 -0
  27. package/.medusa/server/src/modules/review/service.d.ts +139 -0
  28. package/.medusa/server/src/modules/review/service.js +46 -0
  29. package/LICENSE +21 -0
  30. package/README.md +51 -0
  31. package/package.json +88 -0
@@ -0,0 +1,489 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState, useMemo } from "react";
3
+ import { useNavigate, Link, useParams } from "react-router-dom";
4
+ import { defineRouteConfig } from "@medusajs/admin-sdk";
5
+ import { Star, EllipsisHorizontal, Trash } from "@medusajs/icons";
6
+ import { createDataTableColumnHelper, Badge, Text, createDataTableCommandHelper, usePrompt, createDataTableFilterHelper, useDataTable, Container, DataTable, Heading, DropdownMenu, IconButton, clx, Button, toast } from "@medusajs/ui";
7
+ import { useQuery, useQueryClient, useMutation } from "@tanstack/react-query";
8
+ import Medusa from "@medusajs/js-sdk";
9
+ const sdk = new Medusa({
10
+ baseUrl: "/",
11
+ debug: false,
12
+ auth: {
13
+ type: "session"
14
+ }
15
+ });
16
+ const useReviewsList = (params) => {
17
+ return useQuery({
18
+ queryFn: () => sdk.client.fetch("/admin/reviews", { query: params }),
19
+ queryKey: ["reviews", params]
20
+ });
21
+ };
22
+ const useReview = (id) => {
23
+ return useQuery({
24
+ queryFn: () => sdk.client.fetch(`/admin/reviews/${id}`),
25
+ queryKey: ["review", id],
26
+ enabled: !!id
27
+ });
28
+ };
29
+ const useUpdateReview = (id) => {
30
+ const queryClient = useQueryClient();
31
+ return useMutation({
32
+ mutationFn: (data) => sdk.client.fetch(`/admin/reviews/${id}`, {
33
+ method: "POST",
34
+ body: data
35
+ }),
36
+ onSuccess: () => {
37
+ queryClient.invalidateQueries({ queryKey: ["reviews"] });
38
+ queryClient.invalidateQueries({ queryKey: ["review", id] });
39
+ }
40
+ });
41
+ };
42
+ const useDeleteReview = () => {
43
+ const queryClient = useQueryClient();
44
+ return useMutation({
45
+ mutationFn: (id) => sdk.client.fetch(`/admin/reviews/${id}`, { method: "DELETE" }),
46
+ onSuccess: () => {
47
+ queryClient.invalidateQueries({ queryKey: ["reviews"] });
48
+ }
49
+ });
50
+ };
51
+ const useDeleteReviews = () => {
52
+ const queryClient = useQueryClient();
53
+ return useMutation({
54
+ mutationFn: (ids) => sdk.client.fetch("/admin/reviews", { method: "DELETE", body: { ids } }),
55
+ onSuccess: () => {
56
+ queryClient.invalidateQueries({ queryKey: ["reviews"] });
57
+ }
58
+ });
59
+ };
60
+ const useApproveReviews = () => {
61
+ const queryClient = useQueryClient();
62
+ return useMutation({
63
+ mutationFn: (ids) => sdk.client.fetch("/admin/reviews/approve", { method: "POST", body: { ids } }),
64
+ onSuccess: () => {
65
+ queryClient.invalidateQueries({ queryKey: ["reviews"] });
66
+ }
67
+ });
68
+ };
69
+ const useRejectReviews = () => {
70
+ const queryClient = useQueryClient();
71
+ return useMutation({
72
+ mutationFn: (ids) => sdk.client.fetch("/admin/reviews/reject", { method: "POST", body: { ids } }),
73
+ onSuccess: () => {
74
+ queryClient.invalidateQueries({ queryKey: ["reviews"] });
75
+ }
76
+ });
77
+ };
78
+ const config = defineRouteConfig({ label: "Reviews", icon: Star, rank: 10 });
79
+ const handle$1 = { breadcrumb: () => "Reviews" };
80
+ const STATUS_COLORS$1 = {
81
+ pending: "blue",
82
+ approved: "green",
83
+ rejected: "red"
84
+ };
85
+ const STATUS_LABELS$1 = {
86
+ pending: "Pending",
87
+ approved: "Approved",
88
+ rejected: "Rejected"
89
+ };
90
+ const ReviewsPage = () => {
91
+ const limit = 20;
92
+ const [pagination, setPagination] = useState({
93
+ pageSize: limit,
94
+ pageIndex: 0
95
+ });
96
+ const offset = useMemo(() => pagination.pageIndex * limit, [pagination]);
97
+ const [filtering, setFiltering] = useState({ status: "pending" });
98
+ const [sorting, setSorting] = useState(null);
99
+ const [search, setSearch] = useState("");
100
+ const [rowSelection, setRowSelection] = useState({});
101
+ const { data, isLoading } = useReviewsList({
102
+ limit,
103
+ offset,
104
+ q: search || void 0,
105
+ ...filtering.status !== void 0 ? { status: filtering.status } : {},
106
+ order: sorting ? `${sorting.desc ? "-" : ""}${sorting.id}` : "-created_at"
107
+ });
108
+ const { mutateAsync: approveReviews } = useApproveReviews();
109
+ const { mutateAsync: rejectReviews } = useRejectReviews();
110
+ const { mutateAsync: deleteReviews } = useDeleteReviews();
111
+ const columnHelper = createDataTableColumnHelper();
112
+ const columns = [
113
+ columnHelper.select(),
114
+ columnHelper.accessor("status", {
115
+ header: "Status",
116
+ cell: ({ getValue }) => {
117
+ const s = getValue();
118
+ return /* @__PURE__ */ jsx(Badge, { size: "xsmall", color: STATUS_COLORS$1[s], children: STATUS_LABELS$1[s] });
119
+ }
120
+ }),
121
+ columnHelper.accessor("rating", {
122
+ header: "Rating",
123
+ cell: ({ getValue }) => `${getValue()} / 5`
124
+ }),
125
+ columnHelper.accessor("author_name", {
126
+ header: "Author",
127
+ enableSorting: true,
128
+ sortLabel: "Author",
129
+ sortAscLabel: "A–Z",
130
+ sortDescLabel: "Z–A"
131
+ }),
132
+ columnHelper.accessor("title", {
133
+ header: "Title",
134
+ cell: ({ getValue }) => {
135
+ const v = getValue();
136
+ return v ? /* @__PURE__ */ jsx(Text, { size: "small", className: "truncate max-w-[220px]", children: v }) : /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-muted", children: "—" });
137
+ }
138
+ }),
139
+ columnHelper.accessor("body", {
140
+ header: "Preview",
141
+ cell: ({ getValue }) => {
142
+ const v = getValue();
143
+ return /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle truncate max-w-[280px]", children: v.length > 60 ? `${v.slice(0, 60)}…` : v });
144
+ }
145
+ }),
146
+ columnHelper.accessor("created_at", {
147
+ header: "Received",
148
+ enableSorting: true,
149
+ sortLabel: "Received",
150
+ sortAscLabel: "Oldest first",
151
+ sortDescLabel: "Newest first",
152
+ cell: ({ getValue }) => /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: new Date(getValue()).toLocaleDateString() })
153
+ })
154
+ ];
155
+ const commandHelper = createDataTableCommandHelper();
156
+ const prompt = usePrompt();
157
+ const useCommands = () => [
158
+ commandHelper.command({
159
+ label: "Approve",
160
+ shortcut: "A",
161
+ action: async (selection) => {
162
+ const ids = Object.keys(selection);
163
+ const confirmed = await prompt({
164
+ title: `Approve ${ids.length} review${ids.length > 1 ? "s" : ""}?`,
165
+ description: "Approved reviews will be visible to customers.",
166
+ confirmText: "Approve",
167
+ cancelText: "Cancel",
168
+ variant: "confirmation"
169
+ });
170
+ if (!confirmed) return;
171
+ await approveReviews(ids);
172
+ setRowSelection({});
173
+ }
174
+ }),
175
+ commandHelper.command({
176
+ label: "Reject",
177
+ shortcut: "R",
178
+ action: async (selection) => {
179
+ const ids = Object.keys(selection);
180
+ const confirmed = await prompt({
181
+ title: `Reject ${ids.length} review${ids.length > 1 ? "s" : ""}?`,
182
+ description: "Rejected reviews will not be shown to customers.",
183
+ confirmText: "Reject",
184
+ cancelText: "Cancel",
185
+ variant: "confirmation"
186
+ });
187
+ if (!confirmed) return;
188
+ await rejectReviews(ids);
189
+ setRowSelection({});
190
+ }
191
+ }),
192
+ commandHelper.command({
193
+ label: "Delete",
194
+ shortcut: "X",
195
+ action: async (selection) => {
196
+ const ids = Object.keys(selection);
197
+ const confirmed = await prompt({
198
+ title: `Delete ${ids.length} review${ids.length > 1 ? "s" : ""}?`,
199
+ description: "This cannot be undone.",
200
+ confirmText: "Delete",
201
+ cancelText: "Cancel",
202
+ variant: "danger"
203
+ });
204
+ if (!confirmed) return;
205
+ await deleteReviews(ids);
206
+ setRowSelection({});
207
+ }
208
+ })
209
+ ];
210
+ const commands = useCommands();
211
+ const filterHelper = createDataTableFilterHelper();
212
+ const filters = [
213
+ filterHelper.accessor("status", {
214
+ type: "select",
215
+ label: "Status",
216
+ options: [
217
+ { label: "Pending", value: "pending" },
218
+ { label: "Approved", value: "approved" },
219
+ { label: "Rejected", value: "rejected" }
220
+ ]
221
+ })
222
+ ];
223
+ const navigate = useNavigate();
224
+ const table = useDataTable({
225
+ columns,
226
+ data: (data == null ? void 0 : data.reviews) || [],
227
+ getRowId: (row) => row.id,
228
+ rowCount: (data == null ? void 0 : data.count) || 0,
229
+ isLoading,
230
+ commands,
231
+ filters,
232
+ rowSelection: { state: rowSelection, onRowSelectionChange: setRowSelection },
233
+ onRowClick: (_, row) => navigate(`${row.id}`),
234
+ pagination: { state: pagination, onPaginationChange: setPagination },
235
+ filtering: { state: filtering, onFilteringChange: setFiltering },
236
+ sorting: { state: sorting, onSortingChange: setSorting },
237
+ search: { state: search, onSearchChange: setSearch }
238
+ });
239
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 p-4", children: /* @__PURE__ */ jsx(Container, { className: "divide-y p-0", children: /* @__PURE__ */ jsxs(DataTable, { instance: table, children: [
240
+ /* @__PURE__ */ jsxs(DataTable.Toolbar, { className: "flex flex-col items-start justify-between gap-2 md:flex-row md:items-center", children: [
241
+ /* @__PURE__ */ jsx(Heading, { children: "Reviews" }),
242
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
243
+ /* @__PURE__ */ jsx(DataTable.Search, { placeholder: "Search by author…" }),
244
+ /* @__PURE__ */ jsx(DataTable.FilterMenu, { tooltip: "Filter" })
245
+ ] })
246
+ ] }),
247
+ /* @__PURE__ */ jsx(DataTable.Table, {}),
248
+ /* @__PURE__ */ jsx(DataTable.CommandBar, { selectedLabel: (count) => `${count} selected` }),
249
+ /* @__PURE__ */ jsx(DataTable.Pagination, {})
250
+ ] }) }) });
251
+ };
252
+ const ActionMenu = ({ groups }) => {
253
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
254
+ /* @__PURE__ */ jsx(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { size: "small", variant: "transparent", children: /* @__PURE__ */ jsx(EllipsisHorizontal, {}) }) }),
255
+ /* @__PURE__ */ jsx(DropdownMenu.Content, { children: groups.map((group, index) => {
256
+ if (!group.actions.length) {
257
+ return null;
258
+ }
259
+ const isLast = index === groups.length - 1;
260
+ return /* @__PURE__ */ jsxs(DropdownMenu.Group, { children: [
261
+ group.actions.map((action, index2) => {
262
+ if (action.onClick) {
263
+ return /* @__PURE__ */ jsxs(
264
+ DropdownMenu.Item,
265
+ {
266
+ disabled: action.disabled,
267
+ onClick: (e) => {
268
+ e.stopPropagation();
269
+ action.onClick();
270
+ },
271
+ className: clx(
272
+ "[&_svg]:text-ui-fg-subtle flex items-center gap-x-2",
273
+ {
274
+ "[&_svg]:text-ui-fg-disabled": action.disabled
275
+ }
276
+ ),
277
+ children: [
278
+ action.icon,
279
+ /* @__PURE__ */ jsx("span", { children: action.label })
280
+ ]
281
+ },
282
+ index2
283
+ );
284
+ }
285
+ return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
286
+ DropdownMenu.Item,
287
+ {
288
+ className: clx(
289
+ "[&_svg]:text-ui-fg-subtle flex items-center gap-x-2",
290
+ {
291
+ "[&_svg]:text-ui-fg-disabled": action.disabled
292
+ }
293
+ ),
294
+ asChild: true,
295
+ disabled: action.disabled,
296
+ children: /* @__PURE__ */ jsxs(Link, { to: action.to, onClick: (e) => e.stopPropagation(), children: [
297
+ action.icon,
298
+ /* @__PURE__ */ jsx("span", { children: action.label })
299
+ ] })
300
+ }
301
+ ) }, index2);
302
+ }),
303
+ !isLast && /* @__PURE__ */ jsx(DropdownMenu.Separator, {})
304
+ ] }, index);
305
+ }) })
306
+ ] });
307
+ };
308
+ async function loader({ params }) {
309
+ const { id } = params;
310
+ return sdk.client.fetch(`/admin/reviews/${id}`, {
311
+ query: { fields: "id,author_name" }
312
+ });
313
+ }
314
+ const handle = {
315
+ breadcrumb: ({ data }) => {
316
+ var _a, _b;
317
+ return ((_a = data == null ? void 0 : data.review) == null ? void 0 : _a.author_name) || ((_b = data == null ? void 0 : data.review) == null ? void 0 : _b.id) || "Review";
318
+ }
319
+ };
320
+ const STATUS_COLORS = {
321
+ pending: "blue",
322
+ approved: "green",
323
+ rejected: "red"
324
+ };
325
+ const STATUS_LABELS = {
326
+ pending: "Pending",
327
+ approved: "Approved",
328
+ rejected: "Rejected"
329
+ };
330
+ const ReviewDetailPage = () => {
331
+ const { id } = useParams();
332
+ const navigate = useNavigate();
333
+ const prompt = usePrompt();
334
+ const { data, isLoading } = useReview(id);
335
+ const { mutate: updateReview, isPending: isUpdating } = useUpdateReview(id);
336
+ const { mutate: deleteReview } = useDeleteReview();
337
+ const review = data == null ? void 0 : data.review;
338
+ const handleApprove = () => {
339
+ updateReview(
340
+ { status: "approved" },
341
+ {
342
+ onSuccess: () => toast.success("Review approved"),
343
+ onError: () => toast.error("Failed to approve review")
344
+ }
345
+ );
346
+ };
347
+ const handleReject = () => {
348
+ updateReview(
349
+ { status: "rejected" },
350
+ {
351
+ onSuccess: () => toast.success("Review rejected"),
352
+ onError: () => toast.error("Failed to reject review")
353
+ }
354
+ );
355
+ };
356
+ const handleDelete = async () => {
357
+ const confirmed = await prompt({
358
+ title: "Delete review?",
359
+ description: "This action cannot be undone.",
360
+ confirmText: "Delete",
361
+ cancelText: "Cancel",
362
+ variant: "danger"
363
+ });
364
+ if (confirmed) {
365
+ deleteReview(review.id, {
366
+ onSuccess: () => {
367
+ toast.success("Review deleted");
368
+ navigate("/reviews");
369
+ },
370
+ onError: () => toast.error("Failed to delete review")
371
+ });
372
+ }
373
+ };
374
+ if (isLoading) return /* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsx(Text, { children: "Loading…" }) });
375
+ if (!review) return /* @__PURE__ */ jsx(Container, { className: "p-6", children: /* @__PURE__ */ jsx(Text, { children: "Review not found." }) });
376
+ const fields = [
377
+ ["Status", /* @__PURE__ */ jsx(Badge, { size: "xsmall", color: STATUS_COLORS[review.status], children: STATUS_LABELS[review.status] })],
378
+ ["Rating", `${review.rating} / 5`],
379
+ ["Author", review.author_name],
380
+ ...review.author_email ? [["Email", review.author_email]] : [],
381
+ ...review.title ? [["Title", review.title]] : [],
382
+ ["Review", /* @__PURE__ */ jsx("span", { className: "whitespace-pre-wrap", children: review.body })],
383
+ ...review.product_id ? [["Product ID", /* @__PURE__ */ jsx("span", { className: "font-mono text-xs", children: review.product_id })]] : [],
384
+ ...review.order_id ? [["Order ID", /* @__PURE__ */ jsx("span", { className: "font-mono text-xs", children: review.order_id })]] : [],
385
+ ...review.customer_id ? [["Customer ID", /* @__PURE__ */ jsx("span", { className: "font-mono text-xs", children: review.customer_id })]] : [],
386
+ ["Received", new Date(review.created_at).toLocaleString()]
387
+ ];
388
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 p-4", children: [
389
+ /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
390
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [
391
+ /* @__PURE__ */ jsx(Heading, { level: "h1", children: "Review" }),
392
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
393
+ review.status === "pending" && /* @__PURE__ */ jsxs(Fragment, { children: [
394
+ /* @__PURE__ */ jsx(
395
+ Button,
396
+ {
397
+ size: "small",
398
+ variant: "secondary",
399
+ onClick: handleReject,
400
+ disabled: isUpdating,
401
+ children: "Reject"
402
+ }
403
+ ),
404
+ /* @__PURE__ */ jsx(
405
+ Button,
406
+ {
407
+ size: "small",
408
+ variant: "primary",
409
+ onClick: handleApprove,
410
+ disabled: isUpdating,
411
+ children: "Approve"
412
+ }
413
+ )
414
+ ] }),
415
+ /* @__PURE__ */ jsx(
416
+ ActionMenu,
417
+ {
418
+ groups: [
419
+ {
420
+ actions: [
421
+ { label: "Delete", icon: /* @__PURE__ */ jsx(Trash, {}), onClick: handleDelete }
422
+ ]
423
+ }
424
+ ]
425
+ }
426
+ )
427
+ ] })
428
+ ] }),
429
+ fields.map(([label, value]) => /* @__PURE__ */ jsxs("div", { className: "text-ui-fg-subtle grid grid-cols-[180px_1fr] items-start px-6 py-4", children: [
430
+ /* @__PURE__ */ jsx(Text, { size: "small", weight: "plus", leading: "compact", children: label }),
431
+ /* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", as: "div", children: value })
432
+ ] }, label))
433
+ ] }),
434
+ review.activity && review.activity.length > 0 && /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
435
+ /* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsx(Heading, { level: "h2", children: "Activity" }) }),
436
+ review.activity.map((entry) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 px-6 py-4", children: [
437
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
438
+ /* @__PURE__ */ jsx(Badge, { size: "xsmall", color: "grey", children: entry.type }),
439
+ /* @__PURE__ */ jsx(Text, { size: "xsmall", className: "text-ui-fg-muted", children: new Date(entry.created_at).toLocaleString() })
440
+ ] }),
441
+ entry.note && /* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: entry.note })
442
+ ] }, entry.id))
443
+ ] })
444
+ ] });
445
+ };
446
+ const widgetModule = { widgets: [] };
447
+ const routeModule = {
448
+ routes: [
449
+ {
450
+ Component: ReviewsPage,
451
+ path: "/reviews",
452
+ handle: handle$1
453
+ },
454
+ {
455
+ Component: ReviewDetailPage,
456
+ path: "/reviews/:id",
457
+ handle,
458
+ loader
459
+ }
460
+ ]
461
+ };
462
+ const menuItemModule = {
463
+ menuItems: [
464
+ {
465
+ label: config.label,
466
+ icon: config.icon,
467
+ path: "/reviews",
468
+ nested: void 0,
469
+ rank: 10,
470
+ translationNs: void 0
471
+ }
472
+ ]
473
+ };
474
+ const formModule = { customFields: {} };
475
+ const displayModule = {
476
+ displays: {}
477
+ };
478
+ const i18nModule = { resources: {} };
479
+ const plugin = {
480
+ widgetModule,
481
+ routeModule,
482
+ menuItemModule,
483
+ formModule,
484
+ displayModule,
485
+ i18nModule
486
+ };
487
+ export {
488
+ plugin as default
489
+ };
@@ -0,0 +1,5 @@
1
+ import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework/http';
2
+ import { AdminUpdateReviewType } from '../../../validators';
3
+ export declare const GET: (req: AuthenticatedMedusaRequest, res: MedusaResponse) => Promise<void>;
4
+ export declare const POST: (req: AuthenticatedMedusaRequest<AdminUpdateReviewType>, res: MedusaResponse) => Promise<void>;
5
+ export declare const DELETE: (req: AuthenticatedMedusaRequest, res: MedusaResponse) => Promise<void>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DELETE = exports.POST = exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const review_1 = require("../../../../modules/review");
6
+ const GET = async (req, res) => {
7
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
8
+ const { data: [review] } = await query.graph({
9
+ entity: 'review',
10
+ fields: req.queryConfig.fields,
11
+ filters: { id: req.params.id }
12
+ }, { throwIfKeyNotFound: true });
13
+ res.json({ review });
14
+ };
15
+ exports.GET = GET;
16
+ const POST = async (req, res) => {
17
+ const reviewService = req.scope.resolve(review_1.REVIEW_MODULE);
18
+ let caching = null;
19
+ try {
20
+ caching = req.scope.resolve(utils_1.Modules.CACHING) ?? null;
21
+ }
22
+ catch { /* noop */ }
23
+ const { id } = req.params;
24
+ const { status, ...rest } = req.validatedBody;
25
+ if (status === 'approved') {
26
+ await reviewService.approveReview(id, req.auth_context.actor_id);
27
+ }
28
+ else if (status === 'rejected') {
29
+ await reviewService.rejectReview(id, req.auth_context.actor_id);
30
+ }
31
+ else if (Object.keys(rest).length > 0 || status) {
32
+ await reviewService.updateReviews({ id, ...(status ? { status } : {}), ...rest });
33
+ }
34
+ const review = await reviewService.retrieveReview(id);
35
+ // Invalidate store cache if this review has a product_id
36
+ if (review.product_id && caching) {
37
+ await caching.clear({ key: `store:reviews:${review.product_id}` });
38
+ }
39
+ res.json({ review });
40
+ };
41
+ exports.POST = POST;
42
+ const DELETE = async (req, res) => {
43
+ const reviewService = req.scope.resolve(review_1.REVIEW_MODULE);
44
+ await reviewService.deleteReviews([req.params.id]);
45
+ res.json({ deleted: [req.params.id] });
46
+ };
47
+ exports.DELETE = DELETE;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Jldmlld3MvW2lkXS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBOEU7QUFFOUUsdURBQTBEO0FBSW5ELE1BQU0sR0FBRyxHQUFHLEtBQUssRUFBRSxHQUErQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtJQUNqRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUVoRSxNQUFNLEVBQ0wsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQ2QsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQ3BCO1FBQ0MsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTTtRQUM5QixPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUU7S0FDOUIsRUFDRCxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFBO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7QUFDckIsQ0FBQyxDQUFBO0FBZlksUUFBQSxHQUFHLE9BZWY7QUFFTSxNQUFNLElBQUksR0FBRyxLQUFLLEVBQ3hCLEdBQXNELEVBQ3RELEdBQW1CLEVBQ2xCLEVBQUU7SUFDSCxNQUFNLGFBQWEsR0FBa0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0JBQWEsQ0FBQyxDQUFBO0lBQ3JFLElBQUksT0FBTyxHQUFpQyxJQUFJLENBQUE7SUFDaEQsSUFBSSxDQUFDO1FBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUE7SUFBQyxDQUFDO0lBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakYsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUE7SUFDekIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUE7SUFFN0MsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDM0IsTUFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2pFLENBQUM7U0FBTSxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEUsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksRUFBUyxDQUFDLENBQUE7SUFDekYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVyRCx5REFBeUQ7SUFDekQsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuRSxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUE7QUFDckIsQ0FBQyxDQUFBO0FBMUJZLFFBQUEsSUFBSSxRQTBCaEI7QUFFTSxNQUFNLE1BQU0sR0FBRyxLQUFLLEVBQUUsR0FBK0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEYsTUFBTSxhQUFhLEdBQWtCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHNCQUFhLENBQUMsQ0FBQTtJQUNyRSxNQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbEQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3ZDLENBQUMsQ0FBQTtBQUpZLFFBQUEsTUFBTSxVQUlsQiJ9
@@ -0,0 +1,3 @@
1
+ import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework/http';
2
+ import { AdminApproveReviewActionType } from '../../../validators';
3
+ export declare const POST: (req: AuthenticatedMedusaRequest<AdminApproveReviewActionType>, res: MedusaResponse) => Promise<void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const review_1 = require("../../../../modules/review");
6
+ const POST = async (req, res) => {
7
+ const reviewService = req.scope.resolve(review_1.REVIEW_MODULE);
8
+ let caching = null;
9
+ try {
10
+ caching = req.scope.resolve(utils_1.Modules.CACHING) ?? null;
11
+ }
12
+ catch { /* noop */ }
13
+ const { ids } = req.validatedBody;
14
+ // Collect product_ids before approving so we know which caches to clear
15
+ const reviews = await Promise.all(ids.map(id => reviewService.retrieveReview(id)));
16
+ const productIds = [...new Set(reviews.map(r => r.product_id).filter(Boolean))];
17
+ await Promise.all(ids.map(id => reviewService.approveReview(id, req.auth_context.actor_id)));
18
+ // Invalidate store cache for affected products
19
+ if (caching) {
20
+ await Promise.all(productIds.map(pid => caching.clear({ key: `store:reviews:${pid}` })));
21
+ }
22
+ res.json({ approved: ids });
23
+ };
24
+ exports.POST = POST;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Jldmlld3MvYXBwcm92ZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxREFBbUQ7QUFFbkQsdURBQTBEO0FBSW5ELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDeEIsR0FBNkQsRUFDN0QsR0FBbUIsRUFDbEIsRUFBRTtJQUNILE1BQU0sYUFBYSxHQUFrQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzQkFBYSxDQUFDLENBQUE7SUFDckUsSUFBSSxPQUFPLEdBQWlDLElBQUksQ0FBQTtJQUNoRCxJQUFJLENBQUM7UUFBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUFDLENBQUM7SUFBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQTtJQUVqQyx3RUFBd0U7SUFDeEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsRixNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRS9FLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFNUYsK0NBQStDO0lBQy9DLElBQUksT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUYsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtBQUM1QixDQUFDLENBQUE7QUFyQlksUUFBQSxJQUFJLFFBcUJoQiJ9
@@ -0,0 +1,3 @@
1
+ import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework/http';
2
+ import { AdminRejectReviewActionType } from '../../../validators';
3
+ export declare const POST: (req: AuthenticatedMedusaRequest<AdminRejectReviewActionType>, res: MedusaResponse) => Promise<void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const review_1 = require("../../../../modules/review");
6
+ const POST = async (req, res) => {
7
+ const reviewService = req.scope.resolve(review_1.REVIEW_MODULE);
8
+ let caching = null;
9
+ try {
10
+ caching = req.scope.resolve(utils_1.Modules.CACHING) ?? null;
11
+ }
12
+ catch { /* noop */ }
13
+ const { ids } = req.validatedBody;
14
+ // Collect product_ids before rejecting so we know which caches to clear
15
+ const reviews = await Promise.all(ids.map(id => reviewService.retrieveReview(id)));
16
+ const productIds = [...new Set(reviews.map(r => r.product_id).filter(Boolean))];
17
+ await Promise.all(ids.map(id => reviewService.rejectReview(id, req.auth_context.actor_id)));
18
+ // Invalidate store cache for affected products
19
+ if (caching) {
20
+ await Promise.all(productIds.map(pid => caching.clear({ key: `store:reviews:${pid}` })));
21
+ }
22
+ res.json({ rejected: ids });
23
+ };
24
+ exports.POST = POST;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Jldmlld3MvcmVqZWN0L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFtRDtBQUVuRCx1REFBMEQ7QUFJbkQsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN4QixHQUE0RCxFQUM1RCxHQUFtQixFQUNsQixFQUFFO0lBQ0gsTUFBTSxhQUFhLEdBQWtCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHNCQUFhLENBQUMsQ0FBQTtJQUNyRSxJQUFJLE9BQU8sR0FBaUMsSUFBSSxDQUFBO0lBQ2hELElBQUksQ0FBQztRQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFBO0lBQUMsQ0FBQztJQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFBO0lBRWpDLHdFQUF3RTtJQUN4RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2xGLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFL0UsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUUzRiwrQ0FBK0M7SUFDL0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxRixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQzVCLENBQUMsQ0FBQTtBQXJCWSxRQUFBLElBQUksUUFxQmhCIn0=
@@ -0,0 +1,4 @@
1
+ import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework/http';
2
+ import { AdminDeleteReviewsType, AdminGetReviewsType } from '../../validators';
3
+ export declare const GET: (req: AuthenticatedMedusaRequest<AdminGetReviewsType>, res: MedusaResponse) => Promise<void>;
4
+ export declare const DELETE: (req: AuthenticatedMedusaRequest<AdminDeleteReviewsType>, res: MedusaResponse) => Promise<void>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DELETE = exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const review_1 = require("../../../modules/review");
6
+ const GET = async (req, res) => {
7
+ const query = req.scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
8
+ const { status, product_id, customer_id, q } = req.validatedQuery;
9
+ const { data: reviews, metadata } = await query.graph({
10
+ entity: 'review',
11
+ ...req.queryConfig,
12
+ filters: {
13
+ ...(status ? { status } : {}),
14
+ ...(product_id ? { product_id } : {}),
15
+ ...(customer_id ? { customer_id } : {}),
16
+ ...(q ? { author_name: { $ilike: `%${q}%` } } : {})
17
+ }
18
+ });
19
+ res.json({
20
+ reviews,
21
+ count: metadata?.count,
22
+ limit: metadata?.take,
23
+ offset: metadata?.skip
24
+ });
25
+ };
26
+ exports.GET = GET;
27
+ const DELETE = async (req, res) => {
28
+ const { ids } = req.validatedBody;
29
+ const reviewService = req.scope.resolve(review_1.REVIEW_MODULE);
30
+ await reviewService.deleteReviews(ids);
31
+ res.json({ deleted: ids });
32
+ };
33
+ exports.DELETE = DELETE;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3Jldmlld3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBQXFFO0FBQ3JFLG9EQUF1RDtBQUloRCxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3ZCLEdBQW9ELEVBQ3BELEdBQW1CLEVBQ2xCLEVBQUU7SUFDSCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQTtJQUVqRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDckQsTUFBTSxFQUFFLFFBQVE7UUFDaEIsR0FBRyxHQUFHLENBQUMsV0FBVztRQUNsQixPQUFPLEVBQUU7WUFDUixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ25EO0tBQ0QsQ0FBQyxDQUFBO0lBRUYsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNSLE9BQU87UUFDUCxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUs7UUFDdEIsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJO1FBQ3JCLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSTtLQUN0QixDQUFDLENBQUE7QUFDSCxDQUFDLENBQUE7QUF4QlksUUFBQSxHQUFHLE9Bd0JmO0FBRU0sTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUMxQixHQUF1RCxFQUN2RCxHQUFtQixFQUNsQixFQUFFO0lBQ0gsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUE7SUFDakMsTUFBTSxhQUFhLEdBQWtCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHNCQUFhLENBQUMsQ0FBQTtJQUNyRSxNQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQzNCLENBQUMsQ0FBQTtBQVJZLFFBQUEsTUFBTSxVQVFsQiJ9
@@ -0,0 +1,2 @@
1
+ declare const _default: import("@medusajs/framework/http").MiddlewaresConfig;
2
+ export default _default;