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.
204 lines (198 loc) • 5.09 kB
JavaScript
"use strict";
const express = require("express");
const router = express.Router();
const {
getDb
} = require("../services/mongo");
const {
ObjectId
} = require("mongodb");
// Get all comments
router.get("/", async (req, res) => {
try {
const {
contentId
} = req.query;
const projectId = req.projectId; // Use middleware-injected projectId
const query = {
projectId
};
if (contentId) {
query.contentId = contentId;
}
const db = await getDb();
const commentData = await db.collection("comments").find(query).toArray();
return res.json({
success: true,
data: commentData
});
} catch (error) {
console.error("Error retrieving comments:", error);
return res.status(500).json({
success: false,
message: "Failed to retrieve comments."
});
}
});
// Create new comment
router.post("/", async (req, res) => {
try {
var _req$user, _req$user2;
const {
contentId,
comment,
files,
...customFields
} = req.body;
const projectId = req.projectId;
const userId = (_req$user = req.user) === null || _req$user === void 0 ? void 0 : _req$user.powrId;
const userName = (_req$user2 = req.user) === null || _req$user2 === void 0 ? void 0 : _req$user2.fullName;
if (!contentId || !comment && (!files || !files.length)) {
return res.status(400).json({
success: false,
message: "Content ID and comment (or files) are required"
});
}
const commentData = {
projectId,
contentId,
comment: comment || "",
...(files && {
files
}),
...customFields,
userId,
userName: userName || null,
createdBy: userId ? {
id: userId,
_id: userId,
name: userName
} : null,
createdAt: new Date()
};
const db = await getDb();
const result = await db.collection("comments").insertOne(commentData);
return res.status(201).json({
success: true,
message: "Comment created successfully",
id: result.insertedId
});
} catch (error) {
console.error("Error creating comment:", error);
return res.status(500).json({
success: false,
message: "Failed to create comment."
});
}
});
// Update comment (owner only)
router.patch("/:id", async (req, res) => {
try {
var _req$user3;
const {
id
} = req.params;
const {
comment
} = req.body;
const projectId = req.projectId;
const userId = (_req$user3 = req.user) === null || _req$user3 === void 0 ? void 0 : _req$user3.powrId;
if (!ObjectId.isValid(id)) {
return res.status(400).json({
success: false,
message: "Invalid comment id"
});
}
if (comment === undefined) {
return res.status(400).json({
success: false,
message: "comment is required"
});
}
const db = await getDb();
const existing = await db.collection("comments").findOne({
_id: new ObjectId(id),
projectId
});
if (!existing) {
return res.status(404).json({
success: false,
message: "Comment not found"
});
}
if (existing.userId !== userId) {
return res.status(403).json({
success: false,
message: "Not allowed to edit this comment"
});
}
await db.collection("comments").updateOne({
_id: new ObjectId(id),
projectId
}, {
$set: {
comment,
updatedAt: new Date()
}
});
return res.json({
success: true,
message: "Comment updated"
});
} catch (error) {
console.error("Error updating comment:", error);
return res.status(500).json({
success: false,
message: "Failed to update comment."
});
}
});
// Delete comment (owner only)
router.delete("/:id", async (req, res) => {
try {
var _req$user4;
const {
id
} = req.params;
const projectId = req.projectId;
const userId = (_req$user4 = req.user) === null || _req$user4 === void 0 ? void 0 : _req$user4.powrId;
if (!ObjectId.isValid(id)) {
return res.status(400).json({
success: false,
message: "Invalid comment id"
});
}
const db = await getDb();
const existing = await db.collection("comments").findOne({
_id: new ObjectId(id),
projectId
});
if (!existing) {
return res.status(404).json({
success: false,
message: "Comment not found"
});
}
if (existing.userId !== userId) {
return res.status(403).json({
success: false,
message: "Not allowed to delete this comment"
});
}
await db.collection("comments").deleteOne({
_id: new ObjectId(id),
projectId
});
return res.json({
success: true,
message: "Comment deleted"
});
} catch (error) {
console.error("Error deleting comment:", error);
return res.status(500).json({
success: false,
message: "Failed to delete comment."
});
}
});
module.exports = router;