diff options
Diffstat (limited to 'bucky/app/bucky.js')
| -rw-r--r-- | bucky/app/bucky.js | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/bucky/app/bucky.js b/bucky/app/bucky.js new file mode 100644 index 0000000..757592a --- /dev/null +++ b/bucky/app/bucky.js @@ -0,0 +1,211 @@ +var db = require('../db') +var util = require('../util/util') +var _ = require('lodash') + +var bucky = module.exports = { + + /* INDEX */ + + ensureLatestThreads: function (req, res, next){ + db.getLatestThreads().then(function(threads){ + res.threads = threads + res.threads_ids = res.threads.pluck("id").sort() + res.keywords = _.uniq(res.threads.pluck("keyword")) + next() + }) + }, + ensureCommentCountsForThreads: function (req, res, next){ + db.getCommentCounts(res.threads_ids).then(function(counts){ + var lookup = {} + counts.forEach(function(c){ + lookup[c.thread] = c + }) + res.threads.forEach(function(thread){ + if (lookup[thread.id]) { + thread.set("comment_count", lookup[thread.id].count) + } + }) + next() + }) + }, + ensureFileCountsForThreads: function (req, res, next){ + db.getFileCounts(res.threads_ids).then(function(counts){ + var lookup = {} + counts.forEach(function(c){ + lookup[c.thread] = c + }) + res.threads.forEach(function(t){ + var c = lookup[t.id] + t.set("file_count", c ? c.count : 0) + }) + next() + }) + }, + ensureKeywordsForThreads: function (req, res, next){ + db.getKeywords(res.keywords).then(function(keywords){ + var lookup = {} + keywords.forEach(function(k){ + lookup[k.get('keyword')] = k + }) + res.threads.forEach(function(t){ + var kw = t.get('keyword') + if (! kw) return + var k = lookup[kw] + if (! k) return + if (! t.get("color")) { + t.set("color", k.get("color")) + } + }) + next() + }) + }, + ensureHootbox: function (req, res, next){ + db.getCommentsForThread(1, 15, 0, "desc").then(function(hootbox){ + res.hootbox = hootbox + next() + }) + }, + ensureLastlog: function (req, res, next){ + db.getLastlog(6).then(function(lastlog){ + res.lastlog = lastlog + next() + }) + }, + + /* DETAILS */ + + ensureThread: function (req, res, next){ + var id = req.params.id.replace(/\D/g, "") + if (! id) { + return res.sendStatus(404) + } + db.getThread(id).then(function(thread){ + if (thread) { + res.thread = thread + next() + } + else { + res.sendStatus(404) + } + }) + }, + ensureKeywordForThread: function (req, res, next){ + var keyword = res.thread.get('keyword') + if (! keyword) return next() + db.getKeyword(keyword).then(function(keyword){ + res.keyword = keyword + next() + }) + }, + ensureCommentsForThread: function (req, res, next){ + db.getCommentsForThread(res.thread.get('id')).then(function(comments){ + res.comments = comments + next() + }) + }, + ensureFilesForThread: function (req, res, next){ + db.getFilesForThread(res.thread.get('id')).then(function(files){ + res.files = files + next() + }) + }, + + /* KEYWORDS */ + + ensureKeyword: function (req, res, next){ + var keyword = req.params.keyword + if (! keyword) { + return res.sendStatus(404) + } + db.getKeyword(keyword).then(function(k){ + if (! k) { + return res.sendStatus(404) + } + res.keyword = k + next() + }) + }, + ensureThreadsForKeyword: function (req, res, next){ + var keyword = req.params.keyword + if (! keyword) { + res.sendStatus(404) + } + db.getThreadsForKeyword(keyword).then(function(threads){ + res.threads = threads + res.threads_ids = res.threads.pluck("id").sort() + res.keywords = _.uniq(res.threads.pluck("keyword")) + next() + }) + }, + + /* COMMENTS */ + + createComment: function (req, res, next){ + if (! req.body.comment || ! req.body.comment.length) { + res.json({ error: "no comment" }) + return + } + var data = { + thread: res.thread.get('id'), + parent_id: req.body.parent_id || -1, + username: req.user.get('username'), + date: util.now(), + comment: req.body.comment, + } + db.createComment(data).then(function(comment){ + res.comment = comment + next() + }) + }, + + /* MAIL */ + + ensureMailboxes: function (req, res, next){ + var username = req.user.get('username') + var box = req.params.box + var mbox = username + "." + box + if (! box) { + res.sendStatus(404) + } + db.getMailboxes(username).then(function(boxes){ + if (! boxes) { + return res.sendStatus(404) + } + if (! boxes.models.some(function(box){ return box.get('mbox') == mbox })) { + return res.sendStatus(404) + } + res.boxes = boxes + next() + }) + }, + ensureMailboxCounts: function (req, res, next){ + db.getMailboxCounts(res.boxes.pluck("mbox")).then(function(counts){ + var lookup = {} + counts.forEach(function(c){ + lookup[c.mbox] = c + }) + res.boxes.forEach(function(box){ + var count = lookup[box.get('mbox')] ? lookup[box.get('mbox')].count : 0 + box.set("count", count) + }) + next() + }) + }, + ensureMessages: function (req, res, next){ + db.getMessages(req.user.get('username'), req.params.box, 50, 0).then(function(messages){ + res.messages = messages + next() + }) + }, + ensureMessage: function(req, res, next){ + db.getMessage(req.params.id).then(function(message){ + var username = req.user.get('username') + if (username !== message.get('recipient') && username !== message.get('sender')) { + res.sendStatus(404) + return + } + res.message = message + next() + }) + } +}
\ No newline at end of file |
