Skip to content

Instantly share code, notes, and snippets.

@drypot
Last active April 25, 2019 09:57
Show Gist options
  • Select an option

  • Save drypot/968240384c511f150545eeffd15dfb70 to your computer and use it in GitHub Desktop.

Select an option

Save drypot/968240384c511f150545eeffd15dfb70 to your computer and use it in GitHub Desktop.
waterfalls
expb.core.put('/api/posts/:tid([0-9]+)/:pid([0-9]+)', expu.handler(function (req, res, done) {
userb.checkUser(res, function (err, user) {
if (err) return done(err);
var form = postn.getForm(req);
mysql2.queryOne('select * from thread where id = ?', form.tid, (err, thread) => {
if (err) return done(err);
if (!thread) return done(error('INVALID_THREAD'));
mysql2.queryOne('select * from post where id = ?', form.pid, (err, post) => {
if (err) return done(err);
postb.unpackPost(post);
if (!post || post.tid !== thread.id) return done(error('INVALID_POST'));
postb.checkCategory(user, thread.cid, function (err, category) {
if (err) return done(err);
if (!postb.isEditable(user, post.id, req.session.pids)) return done(error('NOT_AUTHORIZED'));
var head = postb.isHead(thread, post);
async2.if(head, function (next) {
postb.checkCategory(user, form.cid, next); // check new cid
}, function (err) {
if (err) return done(err);
postn.checkForm(form, head, function (err) {
if (err) return done(err);
deleteFiles(form, post, function (err) {
if (err) return done(err);
postn.saveFiles(form, post, function (err) {
if (err) return done(err);
post.writer = form.writer;
post.text = form.text;
if (user.admin) {
post.visible = form.visible;
}
postb.packPost(post);
mysql2.query('update post set ? where id = ?', [post, post.id], (err) => {
if (err) return done(err);
async2.if(head, function (next) {
thread.cid = form.cid;
thread.title = form.title;
thread.writer = form.writer;
mysql2.query('update thread set ? where id = ?', [thread, thread.id], next);
}, function (err) {
if (err) return done(err);
res.json({});
});
});
});
});
});
});
});
});
});
});
}));
async2.waterfall = function (...funcs) {
let i = 0;
let e = funcs.length - 1;
let done = funcs[e];
let params = [];
(function loop() {
if (i === e) {
return done(null, ...params);
}
funcs[i++](...params, (err, ..._params) => {
if (err) return done(err);
params = _params;
setImmediate(loop);
});
})();
}
expb.core.put('/api/posts/:tid([0-9]+)/:pid([0-9]+)', expu.handler(function (req, res, done) {
let user;
let form;
let thread;
let post;
let head;
async2.waterfall(
(done) => {
userb.checkUser(res, done);
},
(_user, done) => {
user = _user;
form = postn.getForm(req);
mysql2.queryOne('select * from thread where id = ?', form.tid, done);
},
(_thread, f, done) => {
thread = _thread;
if (!thread) return done(error('INVALID_THREAD'));
mysql2.queryOne('select * from post where id = ?', form.pid, done);
},
(_post, f, done) => {
post = _post;
postb.unpackPost(post);
if (!post || post.tid !== thread.id) return done(error('INVALID_POST'));
postb.checkCategory(user, thread.cid, done);
},
(_category, done) => {
if (!postb.isEditable(user, post.id, req.session.pids)) return done(error('NOT_AUTHORIZED'));
head = postb.isHead(thread, post);
if (head) {
postb.checkCategory(user, form.cid, done); // check new cid
} else {
done(null, null);
}
},
(_category, done) => {
postn.checkForm(form, head, done);
},
(done) => {
deleteFiles(form, post, done);
},
(done) => {
postn.saveFiles(form, post, done);
},
(done) => {
post.writer = form.writer;
post.text = form.text;
if (user.admin) {
post.visible = form.visible;
}
postb.packPost(post);
mysql2.query('update post set ? where id = ?', [post, post.id], done);
},
(r, f, done) => {
if (head) {
thread.cid = form.cid;
thread.title = form.title;
thread.writer = form.writer;
mysql2.query('update thread set ? where id = ?', [thread, thread.id], done);
} else {
done(null, null, null);
}
},
(r, f, done) => {
postsr.updateThread(thread.id, done);
},
(err) => {
if (err) return done(err);
res.json({});
}
);
}));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment