linagora-rse
Version:
57 lines (45 loc) • 1.46 kB
JavaScript
const q = require('q');
const logger = require('../logger');
const defaultValidator = () => true;
class Checker {
constructor(resourceType, validator) {
this.resourceType = resourceType;
this.validator = validator || defaultValidator;
this.checkers = [];
}
addChecker(checker) {
if (!checker.name) {
throw new Error('checker must have a name');
}
if (typeof checker.check !== 'function') {
throw new Error('checker must have a check function');
}
this.checkers.push(checker);
logger.debug(`availability:${this.resourceType}: added "${checker.name}" checker`);
}
isAvailable(resourceId) {
if (!this.validator(resourceId)) {
return q.resolve({ available: false, message: `Invalid ${this.resourceType}: ${resourceId}` });
}
let alreadyInUse = false;
let message;
const funcs = this.checkers.map(checker =>
() => checker.check(resourceId).then(available => {
if (!available) {
alreadyInUse = true;
message = `${this.resourceType} "${resourceId}" is in use, checked by "${checker.name}" checker`;
return q.reject(new Error(message));
}
})
);
return funcs.reduce(q.when, q())
.then(() => ({ available: true }))
.catch(err => {
if (alreadyInUse) {
return q.resolve({ available: false, message });
}
return q.reject(err);
});
}
}
module.exports = Checker;