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
JavaScript
"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;