@ozzaim/medusa-plugin-product-reviews
Version:
A product review plugin for Medusa v1 that allows customers to leave reviews and ratings for products, including optional admin UI.
79 lines (78 loc) • 3.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.POST = exports.GET = void 0;
const GET = async (req, res) => {
try {
const productReviewService = req.scope.resolve("productReviewService");
const { status, limit = "10", offset = "0", field = "created_at", order = "DESC", } = req.query;
const parsedLimit = parseInt(limit, 10);
const parsedOffset = parseInt(offset, 10);
const allowedSortFields = ["created_at", "updated_at", "rating", "title"];
const normalizedOrder = String(order).toUpperCase() === "ASC" ? "ASC" : "DESC";
const sortField = allowedSortFields.includes(field)
? field
: "created_at";
const options = {
skip: parsedOffset,
take: parsedLimit,
};
const sort = {
field: sortField,
order: normalizedOrder,
};
let reviews, count;
switch (status) {
case "pending":
({ reviews, count } = await productReviewService.listByApproval(false, options, sort));
break;
case "approved":
({ reviews, count } = await productReviewService.listByApproval(true, options, sort));
break;
default:
({ reviews, count } = await productReviewService.listAll(options, sort));
break;
}
res.status(200).json({
reviews,
count,
limit: parsedLimit,
offset: parsedOffset,
sortField,
sortOrder: normalizedOrder,
});
}
catch (error) {
console.error("Failed to fetch product reviews:", error);
res.status(500).json({
error: "An unexpected error occurred while retrieving product reviews.",
details: error instanceof Error ? error.message : String(error),
});
}
};
exports.GET = GET;
const POST = async (req, res) => {
const productReviewService = req.scope.resolve("productReviewService");
const { id, action } = req.body;
if (!id || !action) {
return res.status(400).json({ message: "Missing id or action" });
}
try {
switch (action) {
case "approve":
await productReviewService.approve(id);
return res.status(200).json({ message: "Review approved" });
case "reject":
await productReviewService.reject(id);
return res.status(200).json({ message: "Review rejected" });
case "delete":
await productReviewService.delete(id);
return res.status(200).json({ message: "Review deleted" });
default:
return res.status(400).json({ message: "Invalid action" });
}
}
catch (error) {
return res.status(500).json({ message: error.message || "Server error" });
}
};
exports.POST = POST;