59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import san from "sanitize-html";
|
|
import { messages } from "~/lib/server/constants";
|
|
import isLoggedIn from "~/lib/server/middlewareButNotReally/isLoggedIn";
|
|
import { Story } from "~/models/stories";
|
|
import { Review } from "~/models/stories/review";
|
|
|
|
export default eventHandler(async (ev) => {
|
|
isLoggedIn(ev);
|
|
const revid = parseInt(getRouterParam(ev, "revid")!);
|
|
let replyingTo = await Review.findOne({
|
|
_id: revid,
|
|
})
|
|
.populate("author", "username _id blocked")
|
|
.exec();
|
|
if (!replyingTo) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
message: messages[404],
|
|
});
|
|
}
|
|
if (
|
|
replyingTo?.author.blocked.includes(ev.context.currentUser!._id) ||
|
|
ev.context.currentUser!.blocked.includes(replyingTo?.author._id)
|
|
) {
|
|
throw createError({
|
|
statusCode: 403,
|
|
message: "That didn't work",
|
|
});
|
|
}
|
|
const body = await readBody(ev);
|
|
const newReply = new Review({
|
|
author: ev.context.currentUser!._id,
|
|
replyingTo: revid,
|
|
text: san(body.content),
|
|
leftOn: replyingTo?.leftOn,
|
|
whichChapter: replyingTo.whichChapter,
|
|
datePosted: new Date(),
|
|
});
|
|
const { _id } = await newReply.save();
|
|
const nrs = (await Review.findOne({ _id })
|
|
.populate("author", "username _id blocked")
|
|
.exec())!;
|
|
replyingTo.replies.push(nrs._id);
|
|
await replyingTo.save();
|
|
const story = await Story.findById(replyingTo.leftOn);
|
|
if (!story) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
});
|
|
}
|
|
return {
|
|
back: `/story/${replyingTo.leftOn}/${
|
|
story!.chapters.findIndex((x) => x.id === nrs.whichChapter) + 1
|
|
}`,
|
|
data: nrs.toObject(),
|
|
success: true,
|
|
};
|
|
});
|