nightscout
Version:
Nightscout acts as a web-based CGM (Continuous Glucose Monitor) to allow multiple caregivers to remotely view a patients glucose data in realtime.
63 lines (47 loc) • 1.88 kB
JavaScript
;
const apiConst = require('../../const.json')
, security = require('../../security')
, validate = require('./validate.js')
, path = require('path')
, opTools = require('../../shared/operationTools')
;
/**
* Replace existing document in the collection
* @param {Object} opCtx
* @param {any} doc - new version of document to set
* @param {any} storageDoc - old version of document (existing in the storage)
* @param {Object} options
*/
async function replace (opCtx, doc, storageDoc, options) {
const { ctx, auth, col, req, res } = opCtx;
const { isDeduplication } = options || {};
await security.demandPermission(opCtx, `api:${col.colName}:update`);
if (validate(opCtx, doc, storageDoc, { isDeduplication }) !== true)
return;
const now = new Date;
doc.srvModified = now.getTime();
doc.srvCreated = storageDoc.srvCreated || doc.srvModified;
if (auth && auth.subject && auth.subject.name) {
doc.subject = auth.subject.name;
}
const matchedCount = await col.storage.replaceOne(storageDoc.identifier, doc);
if (!matchedCount)
throw new Error('empty matchedCount');
res.setHeader('Last-Modified', now.toUTCString());
const fields = {
lastModified: now.getTime()
}
if (storageDoc.identifier !== doc.identifier || isDeduplication) {
res.setHeader('Location', path.posix.join(req.baseUrl, req.path, doc.identifier));
fields.identifier = doc.identifier;
fields.isDeduplication = true;
if (storageDoc.identifier !== doc.identifier) {
fields.deduplicatedIdentifier = storageDoc.identifier;
}
}
opTools.sendJSON({ res, status: apiConst.HTTP.OK, fields });
ctx.bus.emit('storage-socket-update', { colName: col.colName, doc });
col.autoPrune();
ctx.bus.emit('data-received');
}
module.exports = replace;