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.
99 lines
2.1 KiB
99 lines
2.1 KiB
2 years ago
|
// 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;
|
||
|
}
|