WIP update existing records
This commit is contained in:
parent
574b7472a2
commit
d586e011e2
28
lib/httpd.js
28
lib/httpd.js
|
@ -88,6 +88,18 @@ module.exports.create = function (cli, engine/*, dnsd*/) {
|
|||
var app = express();
|
||||
var httpServer = require('http').createServer(app);
|
||||
|
||||
function hasClaim(claim) {
|
||||
return function (req, res, next) {
|
||||
if ((req.token.scp||'').split(/[\s,]/g).some(function (c) {
|
||||
return claim === c;
|
||||
})) {
|
||||
next();
|
||||
} else {
|
||||
next(new Error("no claim to '" + claim + "' in token"));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
app.use('/api', function (req, res, next) {
|
||||
var auth = (req.headers.authorization || req.query.token || '').split(/\s+/)[1];
|
||||
var token;
|
||||
|
@ -228,6 +240,22 @@ module.exports.create = function (cli, engine/*, dnsd*/) {
|
|||
}).map(mapRecord) });
|
||||
});
|
||||
});
|
||||
app.post('/api/records/:id?', hasClaim('+rw@adns.org'), function (req, res) {
|
||||
console.log('req.body:', req.body);
|
||||
var record = req.body || {};
|
||||
record.id = req.params.id || record.id;
|
||||
|
||||
if ('SOA' === record.type) {
|
||||
// TODO be strict about what can be edited
|
||||
engine.records.save(record, function (err, record) {
|
||||
res.send({ success: true });
|
||||
});
|
||||
} else {
|
||||
engine.records.save(record, function (err, record) {
|
||||
res.send({ success: true });
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
app.use('/', express.static(path.join(__dirname, 'public')));
|
||||
|
||||
|
|
|
@ -25,6 +25,29 @@ module.exports.create = function (opts) {
|
|||
record.id = crypto.randomBytes(16).toString('hex');
|
||||
}
|
||||
});
|
||||
db.save = function (cb) {
|
||||
if (db.save._saving) {
|
||||
console.log('make pending');
|
||||
db.save._pending.push(cb);
|
||||
return;
|
||||
}
|
||||
|
||||
db.save._saving = true;
|
||||
require('fs').writeFile(opts.filepath, JSON.stringify(db, null, 2), function (err) {
|
||||
console.log('done writing');
|
||||
var pending = db.save._pending.splice(0);
|
||||
db.save._saving = false;
|
||||
cb(err);
|
||||
if (!pending.length) {
|
||||
return;
|
||||
}
|
||||
db.save(function (err) {
|
||||
console.log('double save');
|
||||
pending.forEach(function (cb) { cb(err); });
|
||||
});
|
||||
});
|
||||
};
|
||||
db.save._pending = [];
|
||||
require('fs').writeFileSync(opts.filepath, JSON.stringify(db, null, 2));
|
||||
|
||||
engine.primaryNameservers = db.primaryNameservers;
|
||||
|
@ -120,6 +143,52 @@ module.exports.create = function (opts) {
|
|||
cb(null, myRecords);
|
||||
});
|
||||
}
|
||||
, save: function (record, cb) {
|
||||
if (record.id) {
|
||||
console.log('update record!');
|
||||
engine.records.update(record, cb);
|
||||
} else {
|
||||
engine.records.create(record, cb);
|
||||
}
|
||||
}
|
||||
, update: function (record, cb) {
|
||||
var existing;
|
||||
var dirty;
|
||||
|
||||
db.records.some(function (r) {
|
||||
if (r.id === record.id) {
|
||||
existing = r;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!existing) {
|
||||
console.log('no existing record');
|
||||
cb(new Error("record for '" + record.id + "' does not exist"), null);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('found existing record');
|
||||
console.log(existing);
|
||||
console.log(record);
|
||||
Object.keys(record).forEach(function (key) {
|
||||
if (existing[key] !== record[key]) {
|
||||
dirty = true;
|
||||
console.log(existing[key], record[key]);
|
||||
existing[key] = record[key];
|
||||
}
|
||||
});
|
||||
|
||||
record.updatedAt = new Date().toISOString(); // Math.round(Date.now() / 1000);
|
||||
if (dirty) {
|
||||
record.changedAt = record.updatedAt;
|
||||
}
|
||||
|
||||
console.log('saving...');
|
||||
db.save(function (err) {
|
||||
cb(err, !err && existing || null);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return engine;
|
||||
|
|
Loading…
Reference in New Issue