UNPKG

powr-sdk-api

Version:

Shared API core library for PowrStack projects. Zero dependencies - works with Express, Next.js API routes, and other frameworks. All features are optional and install only what you need.

183 lines (178 loc) 4.4 kB
"use strict"; const express = require("express"); const router = express.Router(); const { getDb } = require("../services/mongo"); const { ObjectId } = require("mongodb"); //add ratings router.post("/", async (req, res) => { const { itemId, rating, review, userId } = req.body; const projectId = req.projectId; if (!rating || !review) { return res.status(400).json({ success: false, message: "All fields are required." }); } const ratingData = { projectId, itemId, rating, review, userId, createdAt: new Date() }; try { const db = await getDb(); const result = await db.collection("ratings").insertOne(ratingData); if (result && result.insertedId) { console.log("ratings added with ID:", result.insertedId); return res.status(200).json({ success: true, message: "rating added successfully.", ratingId: result.insertedId }); } else { console.error("Insert operation failed. Result:", result); return res.status(500).json({ success: false, message: "ratings/reviews could not be added." }); } } catch (error) { console.error("Error adding ratings:", error); return res.status(500).json({ success: false, message: "Failed to add ratings/reviews due to a server error." }); } }); //get ratings router.get("/", async (req, res) => { const { itemId, userId } = req.query; const projectId = req.projectId; try { const query = { projectId }; if (itemId) query.itemId = itemId; if (userId) query.userId = userId; console.log("Filter....:", query); const db = await getDb(); const ratingData = await db.collection("ratings").find(query).toArray(); if (!ratingData || ratingData.length === 0) { console.log("Data not found."); return res.status(200).json({ success: true, ratings: [] }); } return res.status(200).json({ success: true, ratings: ratingData }); } catch (error) { console.error("Error retrieving ratings:", error); return res.status(500).json({ success: false, message: "Failed to retrieve ratings." }); } }); // delete ratings router.delete("/", async (req, res) => { const { ratingId } = req.query; const projectId = req.projectId; if (!ratingId) { return res.status(400).json({ success: false, message: "ratingId is required to delete a rating." }); } try { const db = await getDb(); const result = await db.collection("ratings").deleteOne({ _id: new ObjectId(ratingId), projectId: projectId }); if (result.deletedCount === 0) { return res.status(404).json({ success: false, message: "Rating not found for the given ratingId and projectId." }); } return res.status(200).json({ success: true, message: "Rating deleted successfully." }); } catch (error) { console.error("Error deleting rating:", error); return res.status(500).json({ success: false, message: "Failed to delete rating due to a server error." }); } }); // Calculate average rating router.get("/average", async (req, res) => { const { itemId } = req.query; const projectId = req.projectId; if (!itemId) { return res.status(400).json({ success: false, message: "itemId is required." }); } try { const db = await getDb(); const result = await db.collection("ratings").aggregate([{ $match: { projectId, itemId } }, { $group: { _id: null, averageRating: { $avg: "$rating" }, totalRatings: { $sum: 1 } } }]).toArray(); if (result.length === 0) { return res.status(404).json({ success: false, message: "No ratings found for the given projectId and itemId." }); } return res.status(200).json({ success: true, averageRating: result[0].averageRating.toFixed(2), totalRatings: result[0].totalRatings }); } catch (error) { console.error("Error calculating average rating:", error); return res.status(500).json({ success: false, message: "Failed to calculate average rating." }); } }); module.exports = router;