const Message = require("../models/message.js"); const asyncHandler = require("express-async-handler"); const { body, validationResult } = require("express-validator"); const { default: mongoose } = require("mongoose"); exports.new_get = (req, res, next) => { res.render("newmsg", { user: req.user, errors: false, }); }; exports.new_post = [ // Validate and sanitize fields body("to", "Please enter recipient!").optional().trim().escape(), body("text", "Please enter message!").trim().isLength({ min: 1 }), // Process request after validation and sanitization. asyncHandler(async (req, res, next) => { // Extract the validation errors from a request. const errors = validationResult(req); // if there are validation errors if (!errors.isEmpty()) { // Render the creation form again with sanitized values/error messages. res.render("newmsg", { errors: errors.array(), user: req.user, }); return; } // check for to field entry - if empty, set to "all" let to; req.body.to.length > 0 ? (to = req.body.to) : (to = "all"); // else data from form is valid. let message = new Message({ to: to, from: req.user.username, date: new Date(), updated: new Date(), text: req.body.text, _id: new mongoose.Types.ObjectId(), }); await message.save(); // saved. Redirect to index. res.redirect(`/`); }), ]; exports.get = asyncHandler(async (req, res, next) => { // find message const message = await Message.findById(req.params.messageID).lean().exec(); res.render("message", { message: message, user: req.user, }); }); exports.put_get = asyncHandler(async (req, res, next) => { const message = await Message.findById(req.params.messageID).lean().exec(); res.render("editmsg", { user: req.user, message: message, errors: false, }); }); exports.put = [ // Validate and sanitize fields body("text", "Please enter updated message!").trim().isLength({ min: 1 }), asyncHandler(async (req, res, next) => { // find message const dbMessage = await Message.findById(req.params.messageID) .lean() .exec(); const message = new Message({ to: dbMessage.to, from: dbMessage.from, date: dbMessage.date, updated: new Date(), text: req.body.text, _id: dbMessage._id, }); await Message.findByIdAndUpdate(dbMessage._id, message, {}); // saved. Redirect to message page. res.redirect(`/msg/${message._id}`); }), ]; exports.delete = asyncHandler(async (req, res, next) => { // delete message from database await Message.findByIdAndDelete(req.params.messageID); // redirect home res.redirect("/"); });