@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.
88 lines (87 loc) • 3.44 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 { productId, variantId, limit = "10", offset = "0", field = "created_at", order = "DESC", } = req.query;
const parsedLimit = parseInt(limit, 10);
const parsedOffset = parseInt(offset, 10);
if (!productId && !variantId) {
return res.status(400).json({
message: "Either 'productId' or 'variantId' must be provided.",
});
}
const allowedSortFields = ["created_at", "updated_at", "rating", "title"];
const sortField = allowedSortFields.includes(field)
? field
: "created_at";
const sortOrder = (String(order).toUpperCase() === "ASC" ? "ASC" : "DESC");
const reviews = await productReviewService.findByProductOrVariant(productId, variantId, { skip: parsedOffset, take: parsedLimit }, { field: sortField, order: sortOrder });
if (!reviews || reviews.length === 0) {
return res.status(404).json({
message: "No reviews found for the given product or variant.",
});
}
res.status(200).json({
reviews,
count: reviews.length,
limit: parsedLimit,
offset: parsedOffset,
sortOrder,
});
}
catch (error) {
console.error("Error fetching product reviews:", error);
res.status(500).json({
message: "Internal server error",
error: error instanceof Error ? error.message : String(error),
});
}
};
exports.GET = GET;
const POST = async (req, res) => {
try {
const productReviewService = req.scope.resolve("productReviewService");
const { product_id, variant_id, rating, title, content, customer_id, customer_name, customer_email, } = req.body;
const missingFields = [];
if (!product_id)
missingFields.push("product_id");
if (!variant_id)
missingFields.push("variant_id");
if (rating === undefined || rating === null)
missingFields.push("rating");
if (!title)
missingFields.push("title");
if (!content)
missingFields.push("content");
if (!customer_email)
missingFields.push("customer_email");
if (missingFields.length > 0) {
return res.status(400).json({
error: "Missing required field(s).",
missing: missingFields,
});
}
const review = await productReviewService.create({
product_id,
variant_id,
rating,
title,
content,
customer_id,
customer_name,
customer_email,
approved: false,
});
res.status(200).json({ review });
}
catch (error) {
console.error("Failed to create product review:", error);
res.status(500).json({
error: "An unexpected error occurred while creating the product review.",
details: error instanceof Error ? error.message : String(error),
});
}
};
exports.POST = POST;