Files
cloudron-box/src/domaindb.js

120 lines
4.1 KiB
JavaScript
Raw Normal View History

2017-10-28 21:42:32 +02:00
/* jslint node:true */
'use strict';
exports = module.exports = {
add: add,
get: get,
getAll: getAll,
update: update,
del: del,
_clear: clear
2017-10-28 21:42:32 +02:00
};
var assert = require('assert'),
database = require('./database.js'),
DatabaseError = require('./databaseerror'),
safe = require('safetydance');
2018-01-31 16:56:22 +01:00
var DOMAINS_FIELDS = [ 'domain', 'zoneName', 'provider', 'configJson', 'tlsConfigJson' ].join(',');
2018-01-20 10:05:31 -08:00
2017-10-28 21:42:32 +02:00
function postProcess(data) {
data.config = safe.JSON.parse(data.configJson);
2018-01-31 16:56:22 +01:00
data.tlsConfig = safe.JSON.parse(data.tlsConfigJson);
delete data.configJson;
2018-01-31 16:56:22 +01:00
delete data.tlsConfigJson;
2017-10-28 21:42:32 +02:00
return data;
}
function get(domain, callback) {
assert.strictEqual(typeof domain, 'string');
assert.strictEqual(typeof callback, 'function');
2018-01-20 10:05:31 -08:00
database.query(`SELECT ${DOMAINS_FIELDS} FROM domains WHERE domain=?`, [ domain ], function (error, result) {
2017-10-28 21:42:32 +02:00
if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error));
if (result.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND));
postProcess(result[0]);
callback(null, result[0]);
});
}
function getAll(callback) {
2018-01-20 10:05:31 -08:00
database.query(`SELECT ${DOMAINS_FIELDS} FROM domains ORDER BY domain`, function (error, results) {
2017-10-28 21:42:32 +02:00
if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error));
results.forEach(postProcess);
callback(null, results);
});
}
2018-01-20 10:14:55 -08:00
function add(name, domain, callback) {
assert.strictEqual(typeof name, 'string');
2018-01-20 10:24:11 -08:00
assert.strictEqual(typeof domain, 'object');
2018-01-20 10:14:55 -08:00
assert.strictEqual(typeof domain.zoneName, 'string');
assert.strictEqual(typeof domain.provider, 'string');
assert.strictEqual(typeof domain.config, 'object');
2018-01-31 16:56:22 +01:00
assert.strictEqual(typeof domain.tlsConfig, 'object');
2017-10-28 21:42:32 +02:00
assert.strictEqual(typeof callback, 'function');
2018-01-31 16:56:22 +01:00
database.query('INSERT INTO domains (domain, zoneName, provider, configJson, tlsConfigJson) VALUES (?, ?, ?, ?, ?)', [ name, domain.zoneName, domain.provider, JSON.stringify(domain.config), JSON.stringify(domain.tlsConfig) ], function (error) {
2017-10-28 21:42:32 +02:00
if (error && error.code === 'ER_DUP_ENTRY') return callback(new DatabaseError(DatabaseError.ALREADY_EXISTS, error));
if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error));
2017-10-28 21:42:32 +02:00
callback(null);
});
}
2018-01-20 10:24:11 -08:00
function update(name, domain, callback) {
assert.strictEqual(typeof name, 'string');
assert.strictEqual(typeof domain, 'object');
2017-10-28 21:42:32 +02:00
assert.strictEqual(typeof callback, 'function');
2018-01-20 10:24:11 -08:00
var args = [ ], fields = [ ];
for (var k in domain) {
if (k === 'config') {
fields.push('configJson = ?');
args.push(JSON.stringify(domain[k]));
2018-01-31 16:56:22 +01:00
} else if (k === 'tlsConfig') {
fields.push('tlsConfigJson = ?');
args.push(JSON.stringify(domain[k]));
2018-01-20 10:24:11 -08:00
} else {
fields.push(k + ' = ?');
args.push(domain[k]);
}
}
args.push(name);
database.query('UPDATE domains SET ' + fields.join(', ') + ' WHERE domain=?', args, function (error) {
2017-10-28 21:42:32 +02:00
if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new DatabaseError(DatabaseError.NOT_FOUND));
if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error));
callback(null);
});
}
function del(domain, callback) {
assert.strictEqual(typeof domain, 'string');
assert.strictEqual(typeof callback, 'function');
database.query('DELETE FROM domains WHERE domain=?', [ domain ], function (error, result) {
if (error && error.code === 'ER_ROW_IS_REFERENCED_2') return callback(new DatabaseError(DatabaseError.IN_USE));
2017-10-28 21:42:32 +02:00
if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error));
if (result.affectedRows === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND));
2017-10-28 21:42:32 +02:00
callback(null);
});
}
function clear(callback) {
database.query('DELETE FROM domains', function (error) {
if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error));
callback(error);
});
}