var auth = require('../util/auth') var middleware = require('../util/middleware') var fortune = require('../db/fortune') var bucky = require('./bucky') var db = require('../db') var util = require('../util/util') var search = require('../search/middleware') var multer = require('multer')() module.exports = function(app){ app.all('*', middleware.ensureLocals) auth.init() app.get("/", middleware.ensureAuthenticated, function(req, res){ res.redirect('/index') }) app.get("/index", middleware.ensureAuthenticated, function(req, res){ res.render("pages/index", { title: fortune("titles"), hoot_text: fortune("hoots"), }) }) app.get("/index/:keyword", middleware.ensureAuthenticated, function(req, res){ res.render("pages/index", { title: fortune("titles"), hoot_text: fortune("hoots"), }) }) app.get("/details/:id", middleware.ensureAuthenticated, function(req, res){ res.render("pages/details", {}) }) app.get("/details/:id/settings", middleware.ensureAuthenticated, function(req, res){ res.render("pages/details", {}) }) app.get("/post/", middleware.ensureAuthenticated, function(req, res){ res.render("pages/post", {title: "Start a new thread"}) } ) app.get("/post/:keyword", middleware.ensureAuthenticated, function(req, res){ res.render("pages/post", {title: "Start a new thread"}) } ) app.get("/comment/:id/edit", middleware.ensureAuthenticated, function(req, res){ res.render("pages/editcomment", {title: "Edit comment"}) }) app.get("/profile", middleware.ensureAuthenticated, function(req, res){ res.render("pages/profile", {title: "profile: " + util.sanitize(req.user.get('username'))}) } ) app.get("/profile/:username", middleware.ensureAuthenticated, function(req, res){ res.render("pages/profile", {title: "profile: " + util.sanitize(req.params.username)}) } ) app.get("/api/index", bucky.ensureLastlog, middleware.ensureAuthenticated, bucky.ensureLatestThreads, bucky.ensureCommentCountsForThreads, bucky.ensureFileCountsForThreads, bucky.ensureKeywordsForThreads, bucky.ensureHootbox, bucky.bumpLastSeen, function(req, res){ res.json({ threads: res.threads, hootbox: res.hootbox, lastlog: res.lastlog, }) }) app.get("/api/user/:username", middleware.ensureAuthenticated, bucky.ensureUser, function(req, res) { res.json(res.user) } ) app.get("/api/keyword/:keyword", bucky.ensureLastlog, middleware.ensureAuthenticated, bucky.ensureThreadsForKeyword, bucky.ensureCommentCountsForThreads, bucky.ensureFileCountsForThreads, bucky.ensureKeywordsForThreads, bucky.ensureHootbox, function(req, res){ res.json({ keyword: res.keyword, threads: res.threads, hootbox: res.hootbox, lastlog: res.lastlog, }) }) app.get("/api/thread/:id", middleware.ensureAuthenticated, bucky.ensureThread, bucky.bumpViewCount, bucky.ensureKeywordForThread, bucky.ensureCommentsForThread, bucky.ensureFilesForThread, bucky.prepareThread, bucky.bumpLastSeen, function(req, res){ res.json({ thread: res.thread, comments: res.comments, files: res.files, keyword: res.keyword, }) }) app.post("/api/thread", middleware.ensureAuthenticated, multer.array("files"), bucky.verifyFilesOrComment, bucky.createThread, bucky.createOptionalFiles, bucky.createOptionalComment, function(req, res){ res.json(res.thread) }) app.put("/api/thread/:id", middleware.ensureAuthenticated, bucky.ensureThread, bucky.checkThreadPrivacy, bucky.updateThreadSettings, function(req, res){ res.json({ status: 'ok' }) }) app.delete("/api/thread/:id", middleware.ensureAuthenticated, bucky.ensureThread, bucky.checkThreadPrivacy, bucky.ensureCommentsForThread, bucky.ensureFilesForThread, bucky.destroyThread, function(req, res){ res.sendStatus(200) }) app.post("/api/thread/:id/comment", middleware.ensureAuthenticated, bucky.ensureThread, // ensure thread privacy multer.array("files"), bucky.verifyFilesOrComment, bucky.createOptionalFiles, bucky.createOptionalComment, bucky.bumpThreadRevisions, function(req, res){ res.json({ comment: res.comment }) }) app.get("/api/comment/:id", middleware.ensureAuthenticated, bucky.ensureComment, function(req, res){ res.json({ comment: res.comment }) }) // edit a comment app.put("/api/comment/:id", middleware.ensureAuthenticated, bucky.ensureComment, bucky.checkCommentPrivacy, bucky.ensureCommentThread, bucky.updateComment, bucky.bumpThreadRevisions, function(req, res){ res.json({ comment: res.comment }) }) // delete a comment app.delete("/api/comment/:id", middleware.ensureAuthenticated, bucky.ensureComment, bucky.checkCommentPrivacy, bucky.destroyComment, function(req, res){ res.sendStatus(200) }) app.get("/search/", middleware.ensureAuthenticated, function(req, res){ res.render("pages/search", {title: "search" }) }) app.get("/api/search", middleware.ensureAuthenticated, search.search, search.getThreads, search.getComments, search.getFiles, search.logQuery, search.success ) app.get("/api/keywords", middleware.ensureAuthenticated, bucky.ensureKeywords, function(req, res){ res.json({ keywords: res.keywords, }) }) app.get("/api/keyword/:keyword", middleware.ensureAuthenticated, bucky.ensureKeyword, bucky.ensureThreadsForKeyword, bucky.ensureCommentCountsForThreads, bucky.ensureFileCountsForThreads, bucky.ensureKeywordsForThreads, function(req, res){ res.json({ keyword: res.keyword, threads: res.threads, }) }) app.get("/mail/", middleware.ensureAuthenticated, function(req, res){ res.render("pages/mailbox", {title: "your inbox" }) }) app.get("/mail/compose", middleware.ensureAuthenticated, function(req, res){ res.render("pages/compose", { title: "new message", subject: fortune("subjects"), verb: "wrote", }) }) app.get("/mail/:box", middleware.ensureAuthenticated, function(req, res){ res.render("pages/mailbox", { title: "your " + util.sanitize(req.params.box) }) }) app.get("/mail/compose/:username", middleware.ensureAuthenticated, function(req, res){ res.render("pages/compose", { title: "new message", subject: fortune("subjects"), verb: "wrote", }) }) app.get("/mail/read/:id", middleware.ensureAuthenticated, function(req, res){ res.render("pages/message", { title: "read message" }) }) app.get("/mail/reply/:id", middleware.ensureAuthenticated, function(req, res){ res.render("pages/compose", { title: "reply to message", subject: fortune("subjects"), verb: fortune("mail-verbs"), }) }) app.get("/api/mailbox/:box", middleware.ensureAuthenticated, bucky.ensureMailboxes, bucky.ensureMailboxCounts, bucky.ensureMessages, function(req, res){ res.json({ user: { id: req.user.get("id"), username: req.user.get("username") }, messages: res.messages, boxes: res.boxes, }) }) app.get("/api/message/:id", middleware.ensureAuthenticated, bucky.ensureMessage, bucky.markMessageUnread, function(req, res){ res.json({ message: res.message, }) }) app.post("/api/mail/send", middleware.ensureAuthenticated, bucky.ensureRecipient, bucky.sendMessage, bucky.deleteDraft, function(req, res){ res.json({ status: "ok" }) }) app.delete("/api/message/:id", middleware.ensureAuthenticated, bucky.ensureMessage, bucky.destroyMessage, function(req, res){ res.json({ status: "ok" }) }) auth.route(app) }