This is the template project that's checked out and configured when you run the bando-up command from ljsthw-bandolier. This is where the code really lives.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
bandolier-template/lib/api.js

98 lines
2.1 KiB

// setting DANGER_ADMIN=1 in the env enables developer and admin without logins
import Validator from 'Validator';
export const developer_admin = process.env.DANGER_ADMIN === "1";
export class API {
constructor(req, res) {
this.req = req;
this.res = res;
}
reply(status, data) {
return this.res.status(status).json(data);
}
redirect(url, status=301) {
return this.res.redirect(status, url);
}
error(status, err) {
if(typeof err === 'string') {
return this.res.status(status).send({message: err});
} else {
return this.res.status(status).send(err);
}
}
get user_authenticated() {
return this.req.user !== undefined;
}
get admin_authenticated() {
return this.req.user !== undefined && this.req.user.admin === 1;
}
get user() {
return this.req.user;
}
validate(rules, extra) {
const form = this.req.method === "GET" ? this.req.query : this.req.body;
let validation = Validator.make(form, rules);
// keep the rules as they're needed everywhere
form._rules = rules;
// BUG: validator has a bug that considers an empty
// form valid even if there are required rules
if(Object.getOwnPropertyNames(form).length === 0) {
// add in a fake entry in the form
form["_empty"] = null;
// validate it
form._valid = validation.passes();
// then remove _empty to keep it clean
delete form["_empty"];
} else {
form._valid = validation.passes();
}
form._errors = validation.getErrors();
if(extra) extra(form);
return form;
}
validation_error(res, form) {
return res.status(400).json(form);
}
clean_form(form, rules, extras=[]) {
// what I wouldn't give for set operations
for(let [key, rule] of Object.entries(form)) {
if(!(key in rules)) {
delete form[key];
}
}
for(let field of extras) {
delete form[field];
}
}
}
export const defer = () => {
let res;
let rej;
let promise = new Promise((resolve, reject) => {
res = resolve;
rej = reject;
});
promise.resolve = res;
promise.reject = rej;
return promise;
}