From ead7e4c6b383f53c2beb66f29510a457dc0b6ed8 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 15 Dec 2017 09:12:14 +0100 Subject: noo api --- bucky/app/api.js | 258 ++++++++++++++++++++++++++++++++++ bucky/app/federate.js | 85 ------------ bucky/app/index.js | 18 ++- bucky/app/pages.js | 116 ++++++++++++++++ bucky/app/router.js | 368 ------------------------------------------------- bucky/util/federate.js | 120 ++++++++++++++++ 6 files changed, 508 insertions(+), 457 deletions(-) create mode 100644 bucky/app/api.js delete mode 100644 bucky/app/federate.js create mode 100644 bucky/app/pages.js delete mode 100644 bucky/app/router.js create mode 100644 bucky/util/federate.js (limited to 'bucky') diff --git a/bucky/app/api.js b/bucky/app/api.js new file mode 100644 index 0000000..5635ce9 --- /dev/null +++ b/bucky/app/api.js @@ -0,0 +1,258 @@ +var multer = require('multer')() +var auth = require('../util/auth') +var middleware = require('../util/middleware') +var util = require('../util/util') + +var db = require('../db') +var bucky = require('./bucky') +var search = require('../search/middleware') +var fortune = require('../db/fortune') + +module.exports = { route } + +function route (app){ + /* users */ + + app.get("/api/user/:username", + middleware.ensureAuthenticated, + bucky.ensureUser, + bucky.sanitizeUser, + function(req, res) { + res.json(res.user) + }) + app.post("/api/user/:username", + middleware.ensureAuthenticated, + bucky.ensureUser, + bucky.checkUserPrivacy, + multer.single("avatar"), + bucky.updateProfile, + auth.changePassword, + bucky.uploadAvatar, + bucky.saveUser, + function(req, res){ + res.json(util.sanitizeUser(res.user)) + }) + app.put("/api/checkUsernames", + middleware.ensureAuthenticated, + bucky.checkUsernames, + function(req, res){ + res.send({ usernames: res.usernames }) + }) + + + /* threads */ + + app.get("/api/index", + bucky.ensureLastlog, + middleware.ensureAuthenticated, + bucky.ensureLatestThreads, + bucky.filterPrivateThreads, + 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/keyword/:keyword", + bucky.ensureLastlog, + middleware.ensureAuthenticated, + bucky.ensureThreadsForKeyword, + bucky.filterPrivateThreads, + 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.checkThreadPrivacy, + bucky.bumpViewCount, + bucky.ensureKeywordForThread, + bucky.ensureCommentsForThread, + bucky.ensureFilesForThread, + // bucky.ensureThreadUsers, + 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) + }) + + /* comments */ + + 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) + }) + + /* search */ + + app.get("/api/search", + middleware.ensureAuthenticated, + search.search, + search.getThreads, + search.getComments, + search.getFiles, + search.logQuery, + search.success + ) + + /* keywords */ + + app.get("/api/keywords", + middleware.ensureAuthenticated, + bucky.ensureKeywords, + function(req, res){ + res.json({ + keywords: res.keywords, + }) + }) + app.get("/api/keywords/statistics", + middleware.ensureAuthenticated, + bucky.ensureKeywords, + bucky.ensureThreadGroups, + function(req, res){ + res.json({ + keywords: res.keywords, + threadGroups: res.threadGroups, + }) + }) + app.get("/api/keyword/:keyword", + middleware.ensureAuthenticated, + bucky.ensureKeyword, + bucky.ensureThreadsForKeyword, + bucky.filterPrivateThreads, + bucky.ensureCommentCountsForThreads, + bucky.ensureFileCountsForThreads, + bucky.ensureKeywordsForThreads, + function(req, res){ + res.json({ + keyword: res.keyword, + threads: res.threads, + }) + }) + + + /* mail */ + + 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) +} diff --git a/bucky/app/federate.js b/bucky/app/federate.js deleted file mode 100644 index 51b34f6..0000000 --- a/bucky/app/federate.js +++ /dev/null @@ -1,85 +0,0 @@ -var fetch = require('node-fetch') -var db = require('../db') - -module.exports = { - - route: (app) => { - app.put('/raw/import/thread/', importRaw('thread', 'Thread'), (req, res) => res.send({ status: 'ok', el: res.el })) - app.put('/raw/import/keyword/', importRaw('keyword', 'Keyword'), (req, res) => res.send({ status: 'ok', el: res.el })) - app.put('/raw/import/file/', importRaw('file', 'File'), (req, res) => res.send({ status: 'ok', el: res.el })) - app.put('/raw/import/comment/', importRaw('comment', 'Comment'), (req, res) => res.send({ status: 'ok', el: res.el })) - - app.get('/raw/export/thread/:id', exportThread, (req, res) => res.send({ status: 'ok' })) - app.get('/raw/export/keyword/:keyword', exportKeyword, (req, res) => res.send({ status: 'ok' })) - - function importRaw (type, model) { - return (req, res, next) => { - console.log('importing', type, req.body.id) - delete req.body.id - db[model].forge(req.body).save().then((el) => { - res.el = el; - next() - }).catch(e => { - console.error(e) - next() - }) - } - } - function exportKeyword (req, res, next) { - console.log('export keyword', req.params.keyword) - db.getKeyword(req.params.keyword).then(keyword => { - send("keyword", keyword) - return db.getThreadsForKeyword(req.params.keyword) - }).then(threads => { - var promises = threads.map(thread => { - exportThread({ params: { id: thread.get('id') } }, res, function(){}) - }) - return Promise.all(promises) - }).then( () => { - next() - }) - } - function exportThread (req, res, next) { - var thread_id - return db.getThread(req.params.id).then(thread => { - return send("thread", thread) - }).then(json => { - thread_id = json.el.id - console.log('got thread id', thread_id) - return db.getCommentsForThread(req.params.id) - }).then(comments => { - var promises = comments.map(comment => { - comment.set('thread', thread_id) - send("comment", comment) - }) - return Promise.all(promises) - }).then( () => { - return db.getFilesForThread(req.params.id) - }).then(files => { - var promises = files.map(file => { - file.set('thread', thread_id) - send("file", file) - }) - return promises - }).then( () => { - next() - }).catch(e => { - console.error(e) - next() - }) - } - function send(type, data){ - console.log('sending', type, data.get('id')) - var json = data.toJSON() - return fetch("https://bucky.asdf.us/raw/import/" + type, { - method: 'PUT', - body: JSON.stringify(json), - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - }, - }).then((res) => {return res.json()}) - } - - } -} \ No newline at end of file diff --git a/bucky/app/index.js b/bucky/app/index.js index 19435da..63a285d 100644 --- a/bucky/app/index.js +++ b/bucky/app/index.js @@ -18,7 +18,11 @@ var upload = require('../util/upload') var app, server -var federate = require('./federate') +var federate = require('../util/federate') +var auth = require('../util/auth.js') +var middleware = require('../util/middleware.js') +var api = require('./api.js') +var pages = require('./pages.js') var site = module.exports = {} site.init = function(){ @@ -50,6 +54,7 @@ site.init = function(){ saveUninitialized: false, })) + upload.init() federate.route(app) app.use(csurf({ @@ -66,9 +71,13 @@ site.init = function(){ console.log('Bucky listening at http://' + process.env.HOST_NAME + ':%s', server.address().port) }) - upload.init() + auth.init() + + app.all('*', middleware.ensureLocals) - site.route(app) + api.route(app) + pages.route(app) + auth.route(app) app.set('view engine', 'ejs') app.set('views', path.join(__dirname, '../../views')) @@ -80,4 +89,5 @@ site.init = function(){ } } -site.route = require('./router') +site.api = require('./api') +site.pages = require('./pages') diff --git a/bucky/app/pages.js b/bucky/app/pages.js new file mode 100644 index 0000000..ebc9317 --- /dev/null +++ b/bucky/app/pages.js @@ -0,0 +1,116 @@ +var middleware = require('../util/middleware') +var util = require('../util/util') + +var fortune = require('../db/fortune') + +module.exports = { route } + +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.render("pages/index", { + 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/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/comment_form", {title: "Edit comment"}) + }) + + 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.params.username)}) + }) + app.get("/profile/:username/edit", + middleware.ensureAuthenticated, + function(req, res){ + res.render("pages/profile_form", {title: "edit your profile"}) + }) + 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", + 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"), + }) + }) +} diff --git a/bucky/app/router.js b/bucky/app/router.js deleted file mode 100644 index 7380a22..0000000 --- a/bucky/app/router.js +++ /dev/null @@ -1,368 +0,0 @@ -var multer = require('multer')() -var auth = require('../util/auth') -var middleware = require('../util/middleware') -var util = require('../util/util') - -var db = require('../db') -var bucky = require('./bucky') -var search = require('../search/middleware') -var fortune = require('../db/fortune') -var federate = require('./federate') - -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("/keywords", middleware.ensureAuthenticated, function(req, res){ - res.render("pages/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", {}) - }) - - 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/comment_form", {title: "Edit comment"}) - }) - - 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.params.username)}) - }) - app.get("/profile/:username/edit", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile_form", {title: "edit your profile"}) - }) - - /* users */ - - app.get("/api/user/:username", - middleware.ensureAuthenticated, - bucky.ensureUser, - bucky.sanitizeUser, - function(req, res) { - res.json(res.user) - }) - app.post("/api/user/:username", - middleware.ensureAuthenticated, - bucky.ensureUser, - bucky.checkUserPrivacy, - multer.single("avatar"), - bucky.updateProfile, - auth.changePassword, - bucky.uploadAvatar, - bucky.saveUser, - function(req, res){ - res.json(util.sanitizeUser(res.user)) - }) - app.put("/api/checkUsernames", - middleware.ensureAuthenticated, - bucky.checkUsernames, - function(req, res){ - res.send({ usernames: res.usernames }) - }) - - - /* threads */ - - app.get("/api/index", - bucky.ensureLastlog, - middleware.ensureAuthenticated, - bucky.ensureLatestThreads, - bucky.filterPrivateThreads, - 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/keyword/:keyword", - bucky.ensureLastlog, - middleware.ensureAuthenticated, - bucky.ensureThreadsForKeyword, - bucky.filterPrivateThreads, - 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.checkThreadPrivacy, - bucky.bumpViewCount, - bucky.ensureKeywordForThread, - bucky.ensureCommentsForThread, - bucky.ensureFilesForThread, - // bucky.ensureThreadUsers, - 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) - }) - - /* comments */ - - 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) - }) - - /* search */ - - 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 - ) - - /* keywords */ - - app.get("/api/keywords", - middleware.ensureAuthenticated, - bucky.ensureKeywords, - function(req, res){ - res.json({ - keywords: res.keywords, - }) - }) - app.get("/api/keywords/statistics", - middleware.ensureAuthenticated, - bucky.ensureKeywords, - bucky.ensureThreadGroups, - function(req, res){ - res.json({ - keywords: res.keywords, - threadGroups: res.threadGroups, - }) - }) - app.get("/api/keyword/:keyword", - middleware.ensureAuthenticated, - bucky.ensureKeyword, - bucky.ensureThreadsForKeyword, - bucky.filterPrivateThreads, - bucky.ensureCommentCountsForThreads, - bucky.ensureFileCountsForThreads, - bucky.ensureKeywordsForThreads, - function(req, res){ - res.json({ - keyword: res.keyword, - threads: res.threads, - }) - }) - - /* mail */ - - 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) -} diff --git a/bucky/util/federate.js b/bucky/util/federate.js new file mode 100644 index 0000000..e94c722 --- /dev/null +++ b/bucky/util/federate.js @@ -0,0 +1,120 @@ +var fetch = require('node-fetch') +const readFile = require('fs-readfile-promise') +var db = require('../db') +var upload = require('../util/upload') +var mime = require('mime-types') + +module.exports = { + + route: (app) => { + app.put('/raw/import/thread/', importRaw('thread', 'Thread'), (req, res) => res.send({ status: 'ok', el: res.el })) + app.put('/raw/import/keyword/', importRaw('keyword', 'Keyword'), (req, res) => res.send({ status: 'ok', el: res.el })) + app.put('/raw/import/file/', importRaw('file', 'File'), (req, res) => res.send({ status: 'ok', el: res.el })) + app.put('/raw/import/comment/', importRaw('comment', 'Comment'), (req, res) => res.send({ status: 'ok', el: res.el })) + + app.get('/raw/export/thread/:id', exportThread, (req, res) => res.send({ status: 'ok' })) + app.get('/raw/export/keyword/:keyword', exportKeyword, (req, res) => res.send({ status: 'ok' })) + + function importRaw (type, model) { + return (req, res, next) => { + console.log('importing', type, req.body.id) + delete req.body.id + db[model].forge(req.body).save().then((el) => { + res.el = el; + next() + }).catch(e => { + console.error(e) + next() + }) + } + } + function exportKeyword (req, res, next) { + console.log('export keyword', req.params.keyword) + db.getKeyword(req.params.keyword).then(keyword => { + send("keyword", keyword) + return db.getThreadsForKeyword(req.params.keyword) + }).then(threads => { + var promises = threads.map(thread => { + exportThread({ params: { id: thread.get('id') } }, res, function(){}) + }) + return Promise.all(promises) + }).then( () => { + next() + }) + } + function exportThread (req, res, next) { + var thread_id + return db.getThread(req.params.id).then(thread => { + return send("thread", thread) + }).then(json => { + thread_id = json.el.id + console.log('got thread id', thread_id) + return db.getCommentsForThread(req.params.id) + }).then(comments => { + var promises = comments.map(comment => { + comment.set('thread', thread_id) + send("comment", comment) + }) + return Promise.all(promises) + }).then( () => { + return db.getFilesForThread(req.params.id) + }).then(files => { + var promises = files.map(file => { + storeFile(file) + file.set('thread', thread_id) + return send("file", file) + }) + return promises + }).then( () => { + next() + }).catch(e => { + console.error(e) + next() + }) + } + function send(type, data){ + console.log('sending', type, data.get('id')) + var json = data.toJSON() + return fetch("https://bucky.asdf.us/raw/import/" + type, { + method: 'PUT', + body: JSON.stringify(json), + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, + }).then((res) => {return res.json()}) + } + function storeFile(file){ + // since for now we are essentially backing up local files, + // upload them directly to s3 + const bucky_fn = file.get('thread') + '/' + file.get('filename') + readFile('public/data/' + bucky_fn) + .then(buffer => { + const remote_path = '/bucky/data/' + bucky_fn + upload.client().putBuffer(buffer, remote_path, { + 'Content-Length': buffer.length, + 'Content-Type': mime.lookup(file.get('filename')), + 'x-amz-acl': 'public-read' + }, function(err, s3res) { + if (err || s3res.statusCode !== 200) { + console.error(err); + if (s3res && s3res.resume) { + s3res.resume() + } + return; + } + + var file_url = s3res.url || s3res.req.url + + console.log(file_url) + }).on('error', function(err, s3res){ + console.error(err) + s3res && s3res.resume && s3res.resume() + }) + }).catch(e => { + console.error(e) + + }) + } + } +} \ No newline at end of file -- cgit v1.2.3-70-g09d2