UNPKG

@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
"use strict"; 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;