/** * get confidential fields from given schema based on attribute select: false * * @param {model} model model to compute * * @return {array} matching field names */ export const getConfidentialFields = (model) => { performance.mark('getConfidentialFields:start'); const schema = Object.entries(model.schema.paths); const confidentialFields = schema.filter(function (field) { return field[1].selected === false; }); performance.mark('getConfidentialFields:end'); return confidentialFields.map(field => field[0]); }; /** * remove fields from given object that are stated as confidential * * @param {model} model model to compute * @param {object} object object to compute * * @return {object} cleansed object */ export const hideConfidentialFields = (model, record) => { performance.mark('hideConfidentialFields:start'); // turn mongoose record into js object const object = record.toObject(); // get confidential fields from model const confidentialFields = getConfidentialFields(model); // delete confidential fields from object confidentialFields.forEach(field => delete object[field]); performance.mark('hideConfidentialFields:end'); return object; }; /** * get array of all field names from a given model * * @param {model} model model to compute * * @return {array} all found field names */ const getAllFieldnames = (model) => { return Object.keys(model.schema.paths); }; /** * get an object with key:value pairs * wipe out all fields, not corresponding with given model * * @param {model} model model to compute * @param {object} object object, contains key:value * * @return {object} object with key:values only for fields, found in schema */ export const prefillDocumentObject = (model, object) => { const allowedFields = getAllFieldnames(model); let result = Object.fromEntries(allowedFields.map((field) => { if (Object.hasOwnProperty.bind(object)(field)) { return [field, object[field]]; } }).filter(field => field)); return result; };