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.
123 lines (84 loc) • 3.08 kB
JavaScript
;
const apiConst = require('../../const.json')
, security = require('../../security')
, opTools = require('../../shared/operationTools')
;
/**
* DELETE: Deletes a document from the collection
*/
async function doDelete (opCtx) {
const { col, req } = opCtx;
await security.demandPermission(opCtx, `api:${col.colName}:delete`);
if (await validateDelete(opCtx) !== true)
return;
if (req.query.permanent && req.query.permanent === "true") {
await deletePermanently(opCtx);
} else {
await markAsDeleted(opCtx);
}
}
async function validateDelete (opCtx) {
const { col, req, res } = opCtx;
const identifier = req.params.identifier;
const result = await col.storage.findOne(identifier);
if (!result)
throw new Error('empty result');
if (result.length === 0) {
return opTools.sendJSON({ res, status: apiConst.HTTP.NOT_FOUND });
}
else {
const storageDoc = result[0];
if (storageDoc.isReadOnly === true || storageDoc.readOnly === true || storageDoc.readonly === true) {
return opTools.sendJSONStatus(res, apiConst.HTTP.UNPROCESSABLE_ENTITY,
apiConst.MSG.HTTP_422_READONLY_MODIFICATION);
}
}
return true;
}
async function deletePermanently (opCtx) {
const { ctx, col, req, res } = opCtx;
const identifier = req.params.identifier;
const result = await col.storage.deleteOne(identifier);
if (!result)
throw new Error('empty result');
if (!result.deleted) {
return opTools.sendJSON({ res, status: apiConst.HTTP.NOT_FOUND });
}
col.autoPrune();
ctx.bus.emit('storage-socket-delete', { colName: col.colName, identifier });
ctx.bus.emit('data-received');
return opTools.sendJSON({ res, status: apiConst.HTTP.OK });
}
async function markAsDeleted (opCtx) {
const { ctx, col, req, res, auth } = opCtx;
const identifier = req.params.identifier;
const setFields = { 'isValid': false, 'srvModified': (new Date).getTime() };
if (auth && auth.subject && auth.subject.name) {
setFields.modifiedBy = auth.subject.name;
}
const result = await col.storage.updateOne(identifier, setFields);
if (!result)
throw new Error('empty result');
if (!result.updated) {
return opTools.sendJSON({ res, status: apiConst.HTTP.NOT_FOUND });
}
ctx.bus.emit('storage-socket-delete', { colName: col.colName, identifier });
col.autoPrune();
ctx.bus.emit('data-received');
return opTools.sendJSON({ res, status: apiConst.HTTP.OK });
}
function deleteOperation (ctx, env, app, col) {
return async function operation (req, res) {
const opCtx = { app, ctx, env, col, req, res };
try {
opCtx.auth = await security.authenticate(opCtx);
await doDelete(opCtx);
} catch (err) {
console.error(err);
if (!res.headersSent) {
return opTools.sendJSONStatus(res, apiConst.HTTP.INTERNAL_ERROR, apiConst.MSG.STORAGE_ERROR);
}
}
};
}
module.exports = deleteOperation;