diff options
| author | julian laplace <julescarbon@gmail.com> | 2022-10-25 23:26:31 +0200 |
|---|---|---|
| committer | julian laplace <julescarbon@gmail.com> | 2022-10-25 23:26:31 +0200 |
| commit | 1cfed2612fd1042a15d470a44ec87588c966dc12 (patch) | |
| tree | ba850f589194a21fd1587dd71dfcd056a242e4ac /bucky/app | |
| parent | ae311b71cccf5df9e0e19e276615cc32426d9de1 (diff) | |
hootstream... dark mode only
Diffstat (limited to 'bucky/app')
| -rw-r--r-- | bucky/app/api.js | 25 | ||||
| -rw-r--r-- | bucky/app/bucky.js | 1196 | ||||
| -rw-r--r-- | bucky/app/pages.js | 222 | ||||
| -rw-r--r-- | bucky/app/site.js | 5 |
4 files changed, 768 insertions, 680 deletions
diff --git a/bucky/app/api.js b/bucky/app/api.js index 857849e..a2f85d0 100644 --- a/bucky/app/api.js +++ b/bucky/app/api.js @@ -98,6 +98,31 @@ function route(app) { function (req, res) { res.json({ threads: res.threads, + hootstream: res.hootstream, + hootbox: res.hootbox, + lastlog: res.lastlog, + mail: res.mail, + }); + } + ); + app.get( + "/api/stream", + bucky.ensureLastlog, + middleware.ensureAuthenticated, + // bucky.ensureLatestThreads, + bucky.ensureHootbox, + bucky.ensureHootstream, + privacy.filterPrivateThreads, + bucky.ensureCommentCountsForThreads, + bucky.ensureFileCountsForThreads, + bucky.ensureKeywordsForThreads, + bucky.bumpLastSeen, + bucky.checkMail, + function (req, res) { + res.json({ + threads: res.threads, + files: res.files, + comments: res.comments, hootbox: res.hootbox, lastlog: res.lastlog, mail: res.mail, diff --git a/bucky/app/bucky.js b/bucky/app/bucky.js index b9d9a16..5dc7244 100644 --- a/bucky/app/bucky.js +++ b/bucky/app/bucky.js @@ -1,87 +1,107 @@ -var _ = require('lodash') -var db = require('../db') -var util = require('../util/util') -var upload = require('../util/upload') - -var bucky = module.exports = { +var _ = require("lodash"); +var db = require("../db"); +var util = require("../util/util"); +var upload = require("../util/upload"); +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() - }) + 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){ + 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) + thread.set("comment_count", lookup[thread.id].count); } - }) - next() - }) + }); + next(); + }); }, - ensureFileCountsForThreads: function (req, res, next){ - db.getFileSizes(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) - t.set("size", c ? c.size : 0) - }) - next() - }) + ensureFileCountsForThreads: function (req, res, next) { + db.getFileSizes(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); + t.set("size", c ? c.size : 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")) + 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() - }) + }); + next(); + }); }, - ensureHootbox: function (req, res, next){ - db.getCommentsForThread(1, 20, 0, "desc").then(function(hootbox){ - res.hootbox = hootbox - next() - }) + ensureHootbox: function (req, res, next) { + db.getCommentsForThread(1, 20, 0, "desc").then(function (hootbox) { + res.hootbox = hootbox; + next(); + }); + }, + ensureHootstream: function (req, res, next) { + Promise.all([ + db.getHootstreamFiles({ + limit: req.query.limit || 10, + offset: req.query.offset || 0, + }), + db.getHootstreamComments({ + limit: req.query.limit || 10, + offset: req.query.offset || 0, + }), + ]).then(([files, comments]) => { + db.getHootstreamThreads({ files, comments }).then((threads) => { + res.files = files; + res.comments = comments; + res.threads = threads; + res.threads_ids = res.threads.pluck("id").sort(); + res.keywords = _.uniq(res.threads.pluck("keyword")); + next(); + }); + }); }, - ensureLastlog: function (req, res, next){ - db.getLastlog(5).then(function(lastlog){ - res.lastlog = lastlog - next() - }) + ensureLastlog: function (req, res, next) { + db.getLastlog(5).then(function (lastlog) { + res.lastlog = lastlog; + next(); + }); }, - createThread: function (req, res, next){ - if (! req.body.title || ! req.body.title.length) { - res.json({ error: "no title" }) - return + createThread: function (req, res, next) { + if (!req.body.title || !req.body.title.length) { + res.json({ error: "no title" }); + return; } var data = { title: req.body.title, keyword: req.body.keyword, - username: req.user.get('username'), + username: req.user.get("username"), createdate: util.now(), lastmodified: util.now(), size: 0, @@ -89,666 +109,698 @@ var bucky = module.exports = { color: req.body.color, viewed: 0, revision: 0, - } - db.createThread(data).then(function(thread){ - res.thread = thread - next() - }) + }; + db.createThread(data).then(function (thread) { + res.thread = thread; + next(); + }); }, /* DETAILS */ - ensureThread: function (req, res, next){ - var id = req.params.id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + 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){ + db.getThread(id).then(function (thread) { if (thread) { - res.thread = thread - next() - } - else { - res.sendStatus(404) + res.thread = thread; + next(); + } else { + res.sendStatus(404); } - }) + }); }, - ensureThreadById: function (req, res, next){ - var id = req.params.thread_id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureThreadById: function (req, res, next) { + var id = req.params.thread_id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getThread(id).then(function(thread){ + db.getThread(id).then(function (thread) { if (thread) { - res.thread = thread - next() - } - else { - res.sendStatus(404) + res.thread = thread; + next(); + } else { + res.sendStatus(404); } - }) + }); }, - prepareThread: function (req, res, next){ - var thread = res.thread + prepareThread: function (req, res, next) { + var thread = res.thread; if (thread) { - var settings + var settings; try { - settings = JSON.parse(thread.get('settings') || '{}') - } catch(e) { - settings = {} + settings = JSON.parse(thread.get("settings") || "{}"); + } catch (e) { + settings = {}; } - res.thread.set("settings", settings) + res.thread.set("settings", settings); } - next() + next(); }, - ensureCommentThread: function (req, res, next){ - if (! res.comment) { - return res.sendStatus(404) + ensureCommentThread: function (req, res, next) { + if (!res.comment) { + return res.sendStatus(404); } - var id = res.comment.get('thread') - if (! id) { - return res.sendStatus(404) + var id = res.comment.get("thread"); + if (!id) { + return res.sendStatus(404); } - db.getThread(id).then(function(thread){ + db.getThread(id).then(function (thread) { if (thread) { - res.thread = thread - next() + res.thread = thread; + next(); + } else { + res.sendStatus(404); } - 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() - }) + 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() - }) + 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() - }) + ensureFilesForThread: function (req, res, next) { + db.getFilesForThread(res.thread.get("id")).then(function (files) { + res.files = files || []; + next(); + }); }, - bumpViewCount: function(req, res, next) { - res.thread.set('viewed', res.thread.get('viewed') + 1) - res.thread.save().then( () => next() ) + bumpViewCount: function (req, res, next) { + res.thread.set("viewed", res.thread.get("viewed") + 1); + res.thread.save().then(() => next()); }, - bumpThreadRevisions: function (req, res, next){ + bumpThreadRevisions: function (req, res, next) { // don't bump the hootbox! - if (res.thread.get('id') == 1) { - return next() + if (res.thread.get("id") == 1) { + return next(); } - res.thread.set('revision', res.thread.get('revision')+1) - res.thread.set('lastmodified', util.now()) - res.thread.save().then( () => next() ) + res.thread.set("revision", res.thread.get("revision") + 1); + res.thread.set("lastmodified", util.now()); + res.thread.save().then(() => next()); }, - updateThreadSettings: function (req, res, next){ - var title = util.sanitize(req.body.title || "") - if (! title || ! title.length) { - return res.sendStatus(500) + updateThreadSettings: function (req, res, next) { + var title = util.sanitize(req.body.title || ""); + if (!title || !title.length) { + return res.sendStatus(500); } - var keyword = util.sanitize(req.body.keyword || "") - var privacy = parseInt(req.body.privacy) || 0 - var allowed = util.sanitize(req.body.allowed || "") - var settings - if (typeof req.body.settings === 'object') { + var keyword = util.sanitize(req.body.keyword || ""); + var privacy = parseInt(req.body.privacy) || 0; + var allowed = util.sanitize(req.body.allowed || ""); + var settings; + if (typeof req.body.settings === "object") { try { - settings = JSON.stringify(req.body.settings) - } catch(e) { - console.error("JSON error in thread settings!!!!") - return res.sendStatus(500) + settings = JSON.stringify(req.body.settings); + } catch (e) { + console.error("JSON error in thread settings!!!!"); + return res.sendStatus(500); } } - if (! settings) { - return res.sendStatus(500) + if (!settings) { + return res.sendStatus(500); } - res.thread.set('title', title) - res.thread.set('keyword', keyword) - res.thread.set('color', util.sanitize(req.body.color || 'blue')) - res.thread.set('revision', res.thread.get('revision')+1) - res.thread.set('settings', settings) - res.thread.set('privacy', privacy) - res.thread.set('allowed', allowed) - res.thread.save() - .then( () => next() ) - .catch(err => { - console.error(err) - next() - }) + res.thread.set("title", title); + res.thread.set("keyword", keyword); + res.thread.set("color", util.sanitize(req.body.color || "blue")); + res.thread.set("revision", res.thread.get("revision") + 1); + res.thread.set("settings", settings); + res.thread.set("privacy", privacy); + res.thread.set("allowed", allowed); + res.thread + .save() + .then(() => next()) + .catch((err) => { + console.error(err); + next(); + }); }, - buryThread: function (req, res, next){ - res.thread.set('lastmodified', util.now() - (14 * 86400)) - res.thread.save().then( () => next() ) + buryThread: function (req, res, next) { + res.thread.set("lastmodified", util.now() - 14 * 86400); + res.thread.save().then(() => next()); }, -// ensureInterestedUsers: function(req, res, next){ -// // given a thread, find people who might be interested in it -// // - other people who have been in threads with you -// // - other people who have posted on the keyword -// // for now though, just show the last 20 people who have logged in.. -// db.getLastlog(21).then( (users) => { -// res.interestedUsers = users -// next() -// }).catch( () => { -// res.interestedUsers = [] -// next() -// }) -// }, -// ensureThreadUsers: function(req, res, next) { -// db.getThreadUsers(res.thread.get('id')).then(thread_users => { -// res.thread_users = thread_users -// next() -// }) -// }, - checkUsernames: function(req, res, next) { - if (! req.body.usernames) return res.sendStatus(500) - db.checkUsernames(req.body.usernames).then( (users) => { - res.usernames = users.map(user => user.username) - next() - }).catch((err) => { - console.log(err) - res.usernames = [] - next() - }) + // ensureInterestedUsers: function(req, res, next){ + // // given a thread, find people who might be interested in it + // // - other people who have been in threads with you + // // - other people who have posted on the keyword + // // for now though, just show the last 20 people who have logged in.. + // db.getLastlog(21).then( (users) => { + // res.interestedUsers = users + // next() + // }).catch( () => { + // res.interestedUsers = [] + // next() + // }) + // }, + // ensureThreadUsers: function(req, res, next) { + // db.getThreadUsers(res.thread.get('id')).then(thread_users => { + // res.thread_users = thread_users + // next() + // }) + // }, + checkUsernames: function (req, res, next) { + if (!req.body.usernames) return res.sendStatus(500); + db.checkUsernames(req.body.usernames) + .then((users) => { + res.usernames = users.map((user) => user.username); + next(); + }) + .catch((err) => { + console.log(err); + res.usernames = []; + next(); + }); }, destroyThread: function (req, res, next) { - console.log(">>> destroying thread", res.thread.get('id')) + console.log(">>> destroying thread", res.thread.get("id")); var commentPromises = res.comments.map((comment) => { - return comment.destroy() - }) - var filePromises = db.destroyFiles(res.files) - var threadPromise = res.thread.destroy() - var promises = [ threadPromise ].concat(commentPromises).concat(filePromises) - Promise.all(promises).then( () => { - next() - }).catch( (err) => { - res.sendStatus(500) - }) + return comment.destroy(); + }); + var filePromises = db.destroyFiles(res.files); + var threadPromise = res.thread.destroy(); + var promises = [threadPromise].concat(commentPromises).concat(filePromises); + Promise.all(promises) + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, /* KEYWORDS */ - ensureKeyword: function (req, res, next){ - var keyword = req.params.keyword - if (! keyword) { - return res.sendStatus(404) + 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) + db.getKeyword(keyword).then(function (k) { + if (!k) { + return res.sendStatus(404); } - res.keyword = k - next() - }) + res.keyword = k; + next(); + }); }, - ensureKeywords: function (req, res, next){ - db.getKeywords().then(function(k){ - if (! k) { - return res.sendStatus(404) + ensureKeywords: function (req, res, next) { + db.getKeywords().then(function (k) { + if (!k) { + return res.sendStatus(404); } - res.keywords = k - next() - }) + res.keywords = k; + next(); + }); }, - ensureLatestKeywordThreads: function (req, res, next){ - db.getLatestKeywordThreads().then(function(threads){ - res.threads = threads - next() - }) + ensureLatestKeywordThreads: function (req, res, next) { + db.getLatestKeywordThreads().then(function (threads) { + res.threads = threads; + next(); + }); }, - ensureThreadGroups: function (req, res, next){ - db.getThreadGroups().then(function(threadGroups){ - res.threadGroups = threadGroups - next() - }) + ensureThreadGroups: function (req, res, next) { + db.getThreadGroups().then(function (threadGroups) { + res.threadGroups = threadGroups; + next(); + }); }, - ensureThreadsForKeyword: function (req, res, next){ - var keyword = req.params.keyword - if (! keyword) { - res.sendStatus(404) + 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() - }) + 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(); + }); }, - ensureThreadsForUser: function (req, res, next){ - var username = res.user.username - var limit = parseInt(req.params.limit) || 10 - var offset = parseInt(req.params.offset) || 0 - if (! username) { - res.sendStatus(404) + ensureThreadsForUser: function (req, res, next) { + var username = res.user.username; + var limit = parseInt(req.params.limit) || 10; + var offset = parseInt(req.params.offset) || 0; + if (!username) { + res.sendStatus(404); } - db.getThreadsForUser(username, limit, offset).then(function(threads){ - res.threads = threads - res.threads_ids = res.threads.pluck("id").sort() - res.keywords = _.uniq(res.threads.pluck("keyword")) - next() - }) + db.getThreadsForUser(username, limit, offset).then(function (threads) { + res.threads = threads; + res.threads_ids = res.threads.pluck("id").sort(); + res.keywords = _.uniq(res.threads.pluck("keyword")); + next(); + }); }, - ensureTopThreadsForUser: function (req, res, next){ - var username = res.user.username - var limit = parseInt(req.params.limit) || 10 - var offset = parseInt(req.params.offset) || 0 - if (! username) { - res.sendStatus(404) + ensureTopThreadsForUser: function (req, res, next) { + var username = res.user.username; + var limit = parseInt(req.params.limit) || 10; + var offset = parseInt(req.params.offset) || 0; + if (!username) { + res.sendStatus(404); } - db.getTopThreadsForUser(username, limit, offset).then(function(top_threads){ - res.topThreads = top_threads - res.topThreads_ids = res.topThreads.pluck("id").sort() - res.topKeywords = _.uniq(res.topThreads.pluck("keyword")) - next() - }) + db.getTopThreadsForUser(username, limit, offset).then(function ( + top_threads + ) { + res.topThreads = top_threads; + res.topThreads_ids = res.topThreads.pluck("id").sort(); + res.topKeywords = _.uniq(res.topThreads.pluck("keyword")); + next(); + }); }, - ensureCommentsForUser: function (req, res, next){ - db.getCommentsForUser(res.user.username).then(function(comments){ - res.comments = comments || [] - next() - }) + ensureCommentsForUser: function (req, res, next) { + db.getCommentsForUser(res.user.username).then(function (comments) { + res.comments = comments || []; + next(); + }); }, - ensureFilesForUser: function (req, res, next){ - db.getFilesForUser(res.user.username).then(function(files){ - res.files = files || [] - next() - }) + ensureFilesForUser: function (req, res, next) { + db.getFilesForUser(res.user.username).then(function (files) { + res.files = files || []; + next(); + }); }, - createKeyword: function (req, res, next){ - if (! req.body.keyword || ! req.body.keyword.length) { - res.json({ error: "no keyword" }) - return + createKeyword: function (req, res, next) { + if (!req.body.keyword || !req.body.keyword.length) { + res.json({ error: "no keyword" }); + return; } var data = { keyword: req.body.keyword, - owner: req.user.get('username'), + owner: req.user.get("username"), createdate: util.now(), public: 1, - color: req.body.color || 'blue', - } - db.createKeyword(data).then(function(keyword){ - res.keyword = keyword - next() - }) + color: req.body.color || "blue", + }; + db.createKeyword(data).then(function (keyword) { + res.keyword = keyword; + next(); + }); }, /* POSTING */ - verifyFilesOrComment: function (req, res, next){ - var hasComment = req.body.comment && req.body.comment.length - var hasFile = req.files && req.files.length - if (! hasComment && ! hasFile) { - console.log(">>> no files or comment") - return res.sendStatus(400) + verifyFilesOrComment: function (req, res, next) { + var hasComment = req.body.comment && req.body.comment.length; + var hasFile = req.files && req.files.length; + if (!hasComment && !hasFile) { + console.log(">>> no files or comment"); + return res.sendStatus(400); } - next() + next(); }, /* COMMENTS */ - ensureComment: function (req, res, next){ - var id = req.params.id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureComment: function (req, res, next) { + var id = req.params.id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getCommentById(id).then(function(comment){ + db.getCommentById(id).then(function (comment) { if (comment) { - comment.set('comment', comment.get('comment').toString()) - res.comment = comment - next() + comment.set("comment", comment.get("comment").toString()); + res.comment = comment; + next(); + } else { + res.sendStatus(404); } - else { - res.sendStatus(404) - } - }) + }); }, - createOptionalComment: function(req, res, next){ - if (! req.body.comment || ! req.body.comment.length) { - return next() + createOptionalComment: function (req, res, next) { + if (!req.body.comment || !req.body.comment.length) { + return next(); } - bucky.createComment(req, res, next) + bucky.createComment(req, res, next); }, - createComment: function (req, res, next){ - if (! req.body.comment || ! req.body.comment.length) { - res.json({ error: "no comment" }) - return + 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'), + thread: res.thread.get("id"), parent_id: req.body.parent_id || -1, - username: req.user.get('username'), + username: req.user.get("username"), date: util.now(), comment: req.body.comment, - } - db.createComment(data).then(function(comment){ - res.comment = comment - next() - }) + }; + db.createComment(data).then(function (comment) { + res.comment = comment; + next(); + }); }, - updateComment: function(req, res, next){ - if (! req.body.comment || ! req.body.comment.length) { - return res.sendStatus(500) + updateComment: function (req, res, next) { + if (!req.body.comment || !req.body.comment.length) { + return res.sendStatus(500); } - res.comment.set('comment', req.body.comment) - res.comment.set('date', util.now()) - res.comment.save().then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + res.comment.set("comment", req.body.comment); + res.comment.set("date", util.now()); + res.comment + .save() + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, - moveComment: function(req, res, next){ - res.comment.set('thread', res.thread.get('id')) - res.comment.save().then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + moveComment: function (req, res, next) { + res.comment.set("thread", res.thread.get("id")); + res.comment + .save() + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, - destroyComment: function(req, res, next){ - res.comment.destroy().then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + destroyComment: function (req, res, next) { + res.comment + .destroy() + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, /* FILES */ - ensureFile: function (req, res, next){ - var id = req.params.id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureFile: function (req, res, next) { + var id = req.params.id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getFileById(id).then(function(file){ + db.getFileById(id).then(function (file) { if (file) { - res.file = file - next() + res.file = file; + next(); + } else { + res.sendStatus(404); } - else { - res.sendStatus(404) - } - }) + }); }, - createOptionalFiles: function(req, res, next){ - if (! req.files || ! req.files.length) { - return next() + createOptionalFiles: function (req, res, next) { + if (!req.files || !req.files.length) { + return next(); } - bucky.createFiles(req, res, next) + bucky.createFiles(req, res, next); }, - createFiles: function (req, res, next){ - if (! req.files || ! req.files.length) { - res.json({ error: "no files" }) - return + createFiles: function (req, res, next) { + if (!req.files || !req.files.length) { + res.json({ error: "no files" }); + return; } - var thread_id = res.thread.get('id') - var dirname = process.env.S3_PATH + '/data/' + thread_id + '/' + var thread_id = res.thread.get("id"); + var dirname = process.env.S3_PATH + "/data/" + thread_id + "/"; var promises = req.files.map((file) => { - return new Promise( (resolve, reject) => { + return new Promise((resolve, reject) => { upload.put({ file: file, preserveFilename: true, dirname: dirname, - unacceptable: function(err){ - reject(err) + unacceptable: function (err) { + reject(err); }, - success: function(url){ - console.log("file >", url) + success: function (url) { + console.log("file >", url); var data = { - thread: res.thread.get('id'), - username: req.user.get('username'), + thread: res.thread.get("id"), + username: req.user.get("username"), filename: file.originalname, date: util.now(), size: file.size, privacy: false, storage: process.env.S3_BUCKET, - } - db.createFile(data).then(function(file){ - resolve(file) - }).catch( (err) => reject(err) ) - } - }) + }; + db.createFile(data) + .then(function (file) { + resolve(file); + }) + .catch((err) => reject(err)); + }, + }); + }); + }); + Promise.all(promises) + .then((values) => { + res.files = values; + next(); }) - }) - Promise.all(promises).then(values => { - res.files = values - next() - }).catch(err => { - console.log(err) - }) + .catch((err) => { + console.log(err); + }); }, - moveFile: function(req, res, next){ - db.moveFile(res.file, res.thread.get('id')).then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + moveFile: function (req, res, next) { + db.moveFile(res.file, res.thread.get("id")) + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, - destroyFile: function(req, res, next){ - var filePromises = db.destroyFiles([res.file]) - Promise.all(filePromises).then( () => next() ) - .catch(err => { console.error(err); next() }) + destroyFile: function (req, res, next) { + var filePromises = db.destroyFiles([res.file]); + Promise.all(filePromises) + .then(() => next()) + .catch((err) => { + console.error(err); + next(); + }); }, - /* PROFILE / USER */ - ensureUser: function (req, res, next){ - var username = util.sanitizeName(req.params.username) - if (! username) { - return res.sendStatus(404) + ensureUser: function (req, res, next) { + var username = util.sanitizeName(req.params.username); + if (!username) { + return res.sendStatus(404); } - db.getUserByUsername(username).then(function(user){ + db.getUserByUsername(username).then(function (user) { if (user) { - res.user = user - next() - } - else { - res.sendStatus(404) + res.user = user; + next(); + } else { + res.sendStatus(404); } - }) + }); }, - ensureUserFromBody: function (req, res, next){ - var username = util.sanitizeName(req.body.username) - if (! username) { - return res.sendStatus(404) + ensureUserFromBody: function (req, res, next) { + var username = util.sanitizeName(req.body.username); + if (!username) { + return res.sendStatus(404); } - db.getUserByUsername(username).then(function(user){ + db.getUserByUsername(username).then(function (user) { if (user) { - res.user = user - next() + res.user = user; + next(); + } else { + console.log("no such user!!"); + res.sendStatus(404); } - else { - console.log('no such user!!') - res.sendStatus(404) - } - }) + }); }, - ensureUserlist: function (req, res, next){ - db.getUsers().then(function(users){ - if (! users) { - return res.sendStatus(404) + ensureUserlist: function (req, res, next) { + db.getUsers().then(function (users) { + if (!users) { + return res.sendStatus(404); } - res.users = users - next() - }) + res.users = users; + next(); + }); }, ensureUserThreadCounts: function (req, res, next) { - db.getUserThreadCounts().then(function(counts){ + db.getUserThreadCounts().then(function (counts) { if (!counts) { - return res.sendStatus(404) + return res.sendStatus(404); } - res.threadCounts = counts - next() - }) + res.threadCounts = counts; + next(); + }); }, ensureUserCommentCounts: function (req, res, next) { - db.getUserCommentCounts().then(function(counts){ + db.getUserCommentCounts().then(function (counts) { if (!counts) { - return res.sendStatus(404) + return res.sendStatus(404); } - res.commentCounts = counts - next() - }) + res.commentCounts = counts; + next(); + }); }, ensureUserFileCounts: function (req, res, next) { - db.getUserFileCounts().then(function(counts){ + db.getUserFileCounts().then(function (counts) { if (!counts) { - return res.sendStatus(404) + return res.sendStatus(404); } - res.fileCounts = counts - next() - }) + res.fileCounts = counts; + next(); + }); }, ensureUserStatistics: function (req, res, next) { - var stats = {} - res.threadCounts.forEach(function(user){ - stats[user.username] = stats[user.username] || {} - stats[user.username].threads = user.count - }) - res.commentCounts.forEach(function(user){ - stats[user.username] = stats[user.username] || {} - stats[user.username].comments = user.count - }) - res.fileCounts.forEach(function(user){ - stats[user.username] = stats[user.username] || {} - stats[user.username].files = user.count - stats[user.username].fileSize = user.size - }) - res.userStats = stats - next() + var stats = {}; + res.threadCounts.forEach(function (user) { + stats[user.username] = stats[user.username] || {}; + stats[user.username].threads = user.count; + }); + res.commentCounts.forEach(function (user) { + stats[user.username] = stats[user.username] || {}; + stats[user.username].comments = user.count; + }); + res.fileCounts.forEach(function (user) { + stats[user.username] = stats[user.username] || {}; + stats[user.username].files = user.count; + stats[user.username].fileSize = user.size; + }); + res.userStats = stats; + next(); }, - sanitizeUser: function(req, res, next) { - res.user = util.sanitizeUser(res.user) - next() + sanitizeUser: function (req, res, next) { + res.user = util.sanitizeUser(res.user); + next(); }, - bumpLastSeen: function(req, res, next) { - req.user.set('lastseen', util.now()) - req.user.save().then( () => next() ) + bumpLastSeen: function (req, res, next) { + req.user.set("lastseen", util.now()); + req.user.save().then(() => next()); }, - updateProfile: function(req, res, next) { - var user = res.user - "realname location email phone website twitter".split(" ").forEach( (field) => { - res.user.set(field, req.body[field]) - }) - next() + updateProfile: function (req, res, next) { + var user = res.user; + "realname location email phone website twitter" + .split(" ") + .forEach((field) => { + res.user.set(field, req.body[field]); + }); + next(); }, - uploadAvatar: function(req, res, next) { - if (! req.file) return next() - var dirname = '/bucky/profile/' + uploadAvatar: function (req, res, next) { + if (!req.file) return next(); + var dirname = "/bucky/profile/"; upload.put({ file: req.file, - filename: req.user.get('username') + '.jpg', + filename: req.user.get("username") + ".jpg", dirname: dirname, - unacceptable: function(err){ - res.sendStatus({ error: 'Problem uploading avatar.' }) + unacceptable: function (err) { + res.sendStatus({ error: "Problem uploading avatar." }); }, - success: function(url){ - console.log("avatar >", url) - res.user.set('avatar', url) - next() - } - }) + success: function (url) { + console.log("avatar >", url); + res.user.set("avatar", url); + next(); + }, + }); }, - saveUser: function(req, res, next){ - res.user.save().then( () => next() ) + saveUser: function (req, res, next) { + res.user.save().then(() => 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) + 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) + 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) + if ( + !boxes.models.some(function (box) { + return box.get("mbox") == mbox; + }) + ) { + return res.sendStatus(404); } - res.boxes = boxes - next() - }) + 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() - }) + 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){ - const limit = parseInt(req.query.limit) || 50 - const offset = parseInt(req.query.offset) || 0 - db.getMessages(req.user.get('username'), req.params.box, limit, offset).then(function(messages){ - res.messages = messages - res.query = { limit, offset } - next() - }) + ensureMessages: function (req, res, next) { + const limit = parseInt(req.query.limit) || 50; + const offset = parseInt(req.query.offset) || 0; + db.getMessages( + req.user.get("username"), + req.params.box, + limit, + offset + ).then(function (messages) { + res.messages = messages; + res.query = { limit, offset }; + next(); + }); }, - ensureMessage: function(req, res, next){ - db.getMessage(req.params.id).then(function(message){ - if (! message) { - return res.sendStatus(404) + ensureMessage: function (req, res, next) { + db.getMessage(req.params.id).then(function (message) { + if (!message) { + return res.sendStatus(404); } - var username = req.user.get('username') - if (username !== message.get('recipient') && username !== message.get('sender')) { - res.sendStatus(404) - return + var username = req.user.get("username"); + if ( + username !== message.get("recipient") && + username !== message.get("sender") + ) { + res.sendStatus(404); + return; } - res.message = message - next() - }) + res.message = message; + next(); + }); }, - checkMail: function(req, res, next){ - db.checkMail(req.user.get('username')).then(function(mail){ - res.mail = mail ? mail[0] : { count: 0 } - next() - }) + checkMail: function (req, res, next) { + db.checkMail(req.user.get("username")).then(function (mail) { + res.mail = mail ? mail[0] : { count: 0 }; + next(); + }); }, - markMessageUnread: function(req, res, next){ - if (res.message.get('unread')) { - res.message.set('unread', 0) - res.message.save().then(() => next()) + markMessageUnread: function (req, res, next) { + if (res.message.get("unread")) { + res.message.set("unread", 0); + res.message.save().then(() => next()); } else { - next() + next(); } }, - ensureRecipient: function(req, res, next){ - db.getUserByUsername(util.sanitizeName(req.body.username)).then( (user) => { - if (! user) { - res.send({ error: "No such recipient" }) - return + ensureRecipient: function (req, res, next) { + db.getUserByUsername(util.sanitizeName(req.body.username)).then((user) => { + if (!user) { + res.send({ error: "No such recipient" }); + return; } - next() - }) + next(); + }); }, - sendMessage: function(req, res, next){ - var recipient = util.sanitizeName(req.body.username) - var sender = req.user.get('username') - var subject = util.sanitize(req.body.subject) - var body = util.sanitize(req.body.body) - res.mail = { sender: sender, recipient: recipient } + sendMessage: function (req, res, next) { + var recipient = util.sanitizeName(req.body.username); + var sender = req.user.get("username"); + var subject = util.sanitize(req.body.subject); + var body = util.sanitize(req.body.body); + res.mail = { sender: sender, recipient: recipient }; var recipientMessage = { mbox: recipient + ".inbox", unread: true, @@ -757,7 +809,7 @@ var bucky = module.exports = { date: util.now(), subject: subject, body: body, - } + }; var senderMessage = { mbox: sender + ".outbox", unread: false, @@ -766,23 +818,23 @@ var bucky = module.exports = { date: util.now(), subject: subject, body: body, - } + }; Promise.all([ db.createMessage(recipientMessage), db.createMessage(senderMessage), - ]).then( () => next() ) + ]).then(() => next()); }, - deleteDraft: function(req, res, next){ - if (! req.body.draft_id) return next() - db.getMessage(req.body.draft_id).then( (message) => { - if (message.get('sender') === req.user.get('username')) { - return message.destroy().then( () => next() ) + deleteDraft: function (req, res, next) { + if (!req.body.draft_id) return next(); + db.getMessage(req.body.draft_id).then((message) => { + if (message.get("sender") === req.user.get("username")) { + return message.destroy().then(() => next()); } // erroneous draft message?? - next() - }) + next(); + }); }, - destroyMessage: function(req, res, next) { - res.message.destroy().then( () => next() ) + destroyMessage: function (req, res, next) { + res.message.destroy().then(() => next()); }, -} +}); diff --git a/bucky/app/pages.js b/bucky/app/pages.js index 5d8551e..94ae46e 100644 --- a/bucky/app/pages.js +++ b/bucky/app/pages.js @@ -1,137 +1,145 @@ -var middleware = require('../util/middleware') -var util = require('../util/util') +var middleware = require("../util/middleware"); +var util = require("../util/util"); -var fortune = require('../db/fortune') +var fortune = require("../db/fortune"); -module.exports = { route } +module.exports = { route }; -function route (app){ - app.get("/", +function route(app) { + 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.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){ + function (req, res) { res.render("pages/index", { title: fortune("titles"), hoot_text: fortune("hoots"), - }) - }) - app.get("/keywords", + }); + } + ); + app.get("/stream", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/stream", { + title: fortune("titles"), + hoot_text: fortune("hoots"), + }); + }); + app.get("/keywords", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/keywords", { title: "Bucky's keywords" }); + }); + 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/keywords", {title: "Bucky's keywords"}) - }) - 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", {}) - }) + function (req, res) { + res.render("pages/details", {}); + } + ); - app.get("/post/", + 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("/post/:keyword", + 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/post", {title: "Start a new thread"}) - }) - app.get("/comment/:id/edit", middleware.ensureAuthenticated, function(req, res){ - res.render("pages/comment_form", {title: "Edit comment"}) - }) + function (req, res) { + res.render("pages/comment_form", { title: "Edit comment" }); + } + ); - app.get("/profile", + app.get("/profile", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/profile", { + title: "profile for " + util.sanitize(req.user.get("username")), + }); + }); + app.get( + "/profile/:username", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile", {title: "profile for " + util.sanitize(req.user.get('username'))}) - }) - app.get("/profile/:username", + function (req, res) { + res.render("pages/profile", { + title: "profile for " + util.sanitize(req.params.username), + }); + } + ); + app.get( + "/profile/:username/edit", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile", {title: "profile for " + util.sanitize(req.params.username)}) - }) - app.get("/profile/:username/edit", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile_form", {title: "edit your profile"}) - }) + function (req, res) { + res.render("pages/profile_form", { title: "edit your profile" }); + } + ); - app.get("/users", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/users", {}) - }) - app.get("/users/all", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/users", {}) - }) + app.get("/users", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/users", {}); + }); + app.get("/users/all", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/users", {}); + }); - app.get("/search/", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/search", {title: "search" }) - }) + app.get("/search/", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/search", { title: "search" }); + }); - 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", + 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){ + function (req, res) { res.render("pages/compose", { title: "new message", subject: fortune("subjects"), verb: "wrote", - }) - }) - app.get("/mail/read/:id", + }); + } + ); + app.get( + "/mail/read/:id", middleware.ensureAuthenticated, - function(req, res){ + function (req, res) { res.render("pages/message", { - title: "read message" - }) - }) - app.get("/mail/reply/:id", + title: "read message", + }); + } + ); + app.get( + "/mail/reply/:id", middleware.ensureAuthenticated, - function(req, res){ + function (req, res) { res.render("pages/compose", { title: "reply to message", subject: fortune("subjects"), verb: fortune("mail-verbs"), - }) - }) + }); + } + ); } diff --git a/bucky/app/site.js b/bucky/app/site.js index 69f0157..3627bac 100644 --- a/bucky/app/site.js +++ b/bucky/app/site.js @@ -42,7 +42,10 @@ site.init = function () { key: "bucky.sid", cookie: { secure: process.env.NODE_ENV === "production", - domain: "." + process.env.HOST_NAME, + domain: + process.env.HOST_NAME === "localhost" + ? process.env.HOST_NAME + : "." + process.env.HOST_NAME, maxAge: 43200000000, }, resave: true, |
