const Painting = require("../models/mongooseSchemas/Painting"); const router = require("express").Router(); const dataRender = require("../models/DataRender"); /** * 頁面「展示藝廊」的路由處理。 */ router.get(["/showcase/:mode/:param1/:param2/:param3", "/showcase/:mode/:param1/:param2"], (req, res) => { if (req.user) { dataRender.DataRender("showcase", req.url, req.session, (err, dataObj) => { if (err) { res.setHeader("Content-Type", "text/plain; charset=utf-8"); res.status(500); res.end("Server side error 500 : " + err); } else { res.render("showcase", dataObj); } }); } else { res.redirect("/login"); } }); /** * 檢查從客戶端送過來的留言資料。經檢查後無錯誤則繼續至下一個程序;若有錯誤則回送錯誤訊息。 * @param {Express.Request} req Express的Request物件。 * @param {Express.Response} res Express的Response物件。 * @param {Function} next 導向函式。 */ function CheckCommentDatas(req, res, next) { // 確認使用者是否有登入 if (req.user) { // 先檢查「是否為活動藝廊」此項是否存在 req.checkBody("isActivity") .notEmpty() .withMessage("無法確認留言區域為「個人藝廊」或是「活動藝廊」。請重新整理頁面後再嘗試留言。"); req.checkBody("id") .notEmpty() .withMessage("找不到指定要留言的目標畫作Id。請重新整理頁面後再嘗試留言。"); req.checkBody("comment") .isLength({min: 1, max: 300}) .withMessage("留言字數必須在1~300字之間。") .matches(/^[^<>\&"']+$/) .withMessage("留言內容中,不可包含如「<>&\"'」非法字元。"); // 以 req.body.isActivity 做區隔,對不同的欄位做檢查 if (req.body.isActivity) { req.checkBody("nthSeason") .notEmpty() .withMessage("找不到活動的季數。請重新整理頁面後再嘗試留言。"); req.checkBody("themeOrder") .notEmpty() .withMessage("找不到指定季之中的主題。請重新整理頁面後再嘗試留言。"); } // 取得驗證結果 req.getValidationResult().then((result) => { let errors = result.mapped(); if (result.isEmpty()) { next(); } else { let firstErr = Object.values(errors)[0]; res.json({isOK: false, field: firstErr.param, message: firstErr.msg }); } }); } else { res.json({isOK: false, field: "SERVER", message: "請先登入後再執行操作。"}); } } /** * 儲存留言資料並回送結果訊息。 * @param {Express.Request} req Express的Request物件。 * @param {Express.Response} res Express的Response物件。 */ function SaveCommentAndReponse(req, res) { let body = req.body; // 若為「活動藝廊」,則將留言新增至指定的參與活動資料中 if (req.body.isActivity) { res.send("Test"); } // 若為「個人藝廊」,則將留言連結至指定的畫作上 else { Painting.PushNewComment(body.id, req.user.username, req.user.personalInfo.photo, body.comment, (err, _id) => { if (Painting.IsError_PaintingNotExist(err)) { res.json({isOK: false, field: "id", message: "找不到指定要新增留言的畫作。請重新整理頁面之後再嘗試。"}); } else if (err) { res.json({isOK: false, field: "SERVER", message: "留言新增失敗,請稍後再嘗試。"}); } else { res.json({isOK: true, message: "您的留言已成功地新增!"}); } }); } } /** * 在「展示藝廊」之下,處理由客戶端傳送過來的留言資料。 */ router.post("/showcase/send_commnet", CheckCommentDatas, SaveCommentAndReponse); /** * 檢查由客戶端傳送過來的評分資料。經檢查後無錯誤則繼續至下一個程序;若有錯誤則回送錯誤訊息。 * @param {Express.Request} req Express的Request物件。 * @param {Express.Response} res Express的Response物件。 * @param {Function} next 導向函式。 */ function CheckRatingDatas(req, res, next) { // 先確認使用者是否有登入 if (req.user) { // 檢查「是否為活動藝廊」 req.checkBody("isActivity") .notEmpty() .withMessage("無法確認留言區域為「個人藝廊」或是「活動藝廊」。請重新整理頁面後再嘗試留言。"); // 檢查id req.checkBody("id") .notEmpty() .withMessage("找不到指定要留言的目標畫作Id。請重新整理頁面後再嘗試留言。"); // 檢查「評分分數」 req.checkBody("score") .notEmpty() .withMessage("評分分數為空,請重新評分。") .isInt({min: 1, max: 5}) .withMessage("評分分數數值必須為介於1~5之間的整數。"); // 若為「活動藝廊」,則做以下檢查 if (req.body.isActivity) { // 檢查活動的「季」 req.checkBody("nthSeason") .notEmpty() .withMessage("找不到活動的季數。請重新整理頁面後再嘗試留言。"); // 檢查活動的「主題」 req.checkBody("themeOrder") .notEmpty() .withMessage("找不到指定季之中的主題。請重新整理頁面後再嘗試留言。"); } // 取得驗證結果 req.getValidationResult().then((result) => { let errors = result.mapped(); // 若檢查結果為沒有錯誤,則到下一個程序 if (result.isEmpty()) { next(); } else { let firstErr = Object.values(errors)[0]; res.json({isOK: false, field: firstErr.param, message: firstErr.msg}); } }); } else { res.json({isOK: false, field: "SERVER", message: "請先登入後再執行操作。"}); } } /** * 將評分資料儲存,並回送訊息。 * @param {Express.Request} req Express的Request物件。 * @param {Express.Response} res Express的Response物件。 */ function UpdateRatingAndResponse(req, res) { let body = req.body; // 是否為「活動藝廊」 if (body.isActivity) { res.send("Test"); } // 是否為「個人藝廊」 else { Painting.UpdateRatingById(body.id, req.user.username, body.score, (err, _id) => { if (Painting.IsError_PaintingNotExist(err)) { res.json({isOK: false, field: "id", message: "找不到指定要評分的畫作。請重新整理頁面之後再嘗試。"}); } else if (err) { res.json({isOK: false, field: "SERVER", message: "評分失敗,請稍後再嘗試。"}); } else { res.json({isOK: true, message: "已成功地為此作品評分!"}); } }); } } /** * 在「展示藝廊」之下,處理由客戶端傳送過來的評分資料。 */ router.post("/showcase/rating", CheckRatingDatas, UpdateRatingAndResponse); module.exports = router;