Tarea #707 Loggable disabled due broken tests

This commit is contained in:
Gerard 2018-10-18 11:11:17 +02:00
parent 239e695ed5
commit 76a2eda6e0
1 changed files with 92 additions and 54 deletions

View File

@ -6,7 +6,7 @@ module.exports = function(Self) {
Self.super_.setup.call(this); Self.super_.setup.call(this);
}; };
Self.observe('after save', async function(ctx) { /* Self.observe('after save', async function(ctx) {
const loopBackContext = LoopBackContext.getCurrentContext(); const loopBackContext = LoopBackContext.getCurrentContext();
await logInModel(ctx, loopBackContext); await logInModel(ctx, loopBackContext);
}); });
@ -27,49 +27,58 @@ module.exports = function(Self) {
ctx.hookState.newInstance = newInstance; ctx.hookState.newInstance = newInstance;
}); });
/* Self.observe('before delete', async function(ctx, next) { Self.observe('before delete', async function(ctx) {
let oldInstance; let oldInstance;
if (ctx.instance) { // console.log(ctx.where);
oldInstance = await fkToValue(ctx.data, ctx); if (ctx.where) {
} let affectedModel = ctx.Model.definition.name;
await logInModel(ctx); // console.log(affectedModel);
let deletedInstances = await Self.modelBuilder.models[affectedModel].find({where: ctx.where});
// console.log(deletedInstances);
next(); let arrangedDeletedInstances = [];
deletedInstances.forEach(async element => {
console.log(element);
arrangedDeletedInstances.push(await fkToValue(element, ctx));
}); });
Self.observe('after delete', async function(ctx, next) { console.log(arrangedDeletedInstances);
let oldInstance; // let deletedIntancesData = await fkToValue(deletedInstances, ctx);
if (ctx.instance) { // console.log(deletedIntancesData);
oldInstance = await fkToValue(ctx.data, ctx); // oldInstanceFk = pick(ctx.currentInstance, Object.keys(ctx.data));
// oldInstance = await fkToValue(oldInstanceFk, ctx);
} }
await logInModel(ctx); ctx.hookState.oldInstance = oldInstance;
next();
}); });
*/
Self.observe('after delete', async function(ctx) {
const loopBackContext = LoopBackContext.getCurrentContext();
await logInModel(ctx, loopBackContext);
}); */
async function fkToValue(instance, ctx) { async function fkToValue(instance, ctx) {
let result = {}; let result = {};
for (let key in instance) { for (let key in instance) {
if (key == 'id') continue; if (key == 'id') continue;
let val = instance[key]; let val = instance[key];
if (val === undefined) continue; console.log(val);
if (val === undefined || val === null) continue;
for (let key1 in ctx.Model.relations) { for (let key1 in ctx.Model.relations) {
let val1 = ctx.Model.relations[key1]; let val1 = ctx.Model.relations[key1];
if (val1.keyFrom == key) { if (val1.keyFrom == key) {
let recordSet = await val1.modelTo.findById(val); let recordSet = await val1.modelTo.findById(val);
val = recordSet.name; // FIXME preparar todos los modelos con campo name val = recordSet.name; // FIXME preparar todos los modelos con campo name
console.log(val);
break; break;
} }
} }
result[key] = val; result[key] = val;
} }
// console.log(result);
return result; return result;
} }
async function logInModel(ctx, loopBackContext) { async function logInModel(ctx, loopBackContext) {
let definition = ctx.Model.definition; let definition = ctx.Model.definition;
let primaryKey; let primaryKey;
for (let property in definition.properties) { for (let property in definition.properties) {
@ -78,73 +87,101 @@ module.exports = function(Self) {
break; break;
} }
} }
if (!primaryKey) throw new Error('Primary key not found'); if (!primaryKey) throw new Error('Primary key not found');
let originId; let originId;
if (definition.settings.log.relation) {
// RELATIONS LOG // RELATIONS LOG
let changedModelId;
if (ctx.instance && !definition.settings.log.relation) {
originId = ctx.instance.id;
changedModelId = ctx.instance.id;
} else if (definition.settings.log.relation) {
primaryKey = ctx.Model.relations[definition.settings.log.relation].keyFrom; primaryKey = ctx.Model.relations[definition.settings.log.relation].keyFrom;
if (ctx.where && ctx.where[primaryKey]) if (ctx.where && ctx.where[primaryKey])
originId = ctx.where[primaryKey] originId = ctx.where[primaryKey];
else else {
originId = ctx.instance[primaryKey]; originId = ctx.instance[primaryKey];
} else { changedModelId = ctx.instance.id;
if (ctx.instance) { }
originId = ctx.instance.id;
} else { } else {
originId = ctx.currentInstance.id; originId = ctx.currentInstance.id;
} changedModelId = ctx.currentInstance.id;
} }
// This adds the originDescription field if it doesnt exists in the instances // console.log(ctx.instance, ctx.where, ctx.currentInstance);
let originDescription = definition.settings.log.originDescription; // Sets the changedModelValue to save and the instances changed in case its an updateAll
let changedModelValue = definition.settings.log.changedModelValue;
if (originDescription && (!ctx.instance || !ctx.instance[originDescription])) if (changedModelValue && (!ctx.instance || !ctx.instance[changedModelValue])) {
await Self.modelBuilder.models[definition.name].findById() var where = [];
changedModelId = [];
if (ctx.hookState.oldInstance && !ctx.hookState.oldInstance[originDescription]){ let changedInstances = await Self.modelBuilder.models[definition.name].find({where: ctx.where, fields: ['id', changedModelValue]});
ctx.hookState.oldInstance[originDescription] = ctx.instance[originDescription]; changedInstances.forEach(element => {
ctx.hookState.newInstance[originDescription] = ctx.instance[originDescription]; where.push(element[changedModelValue]);
changedModelId.push(element.id);
});
} else if (ctx.hookState.oldInstance) {
where = ctx.instance[changedModelValue];
} }
// console.log(where);
// This put some order in the intances putting the originDescription in first place // Set oldInstance, newInstance, userFk and action
let oldInstance = {}; let oldInstance = {};
if (ctx.hookState.oldInstance) { if (ctx.hookState.oldInstance) {
oldInstance[originDescription] = ctx.hookState.oldInstance[originDescription];
delete ctx.hookState.oldInstance[originDescription];
Object.assign(oldInstance, ctx.hookState.oldInstance); Object.assign(oldInstance, ctx.hookState.oldInstance);
} }
let newInstance = {}; let newInstance = {};
if (ctx.hookState.newInstance) { if (ctx.hookState.newInstance) {
newInstance[originDescription] = ctx.hookState.newInstance[originDescription]; Object.assign(newInstance, ctx.hookState.newInstance);
delete ctx.hookState.newInstance[originDescription];
Object.assign(newInstance, ctx.hookState.newInstance)
} }
let userFk; let userFk;
if (!loopBackContext) userFk = null; if (loopBackContext)
else userFk = loopBackContext.active.accessToken.userId; userFk = loopBackContext.active.accessToken.userId;
let action = setActionType(ctx); let action = setActionType(ctx);
let logRecord = { let logRecord = {
originFk: originId, originFk: originId,
userFk: userFk, userFk: userFk,
model: ctx.Model.definition.name,
action: action, action: action,
changedModel: ctx.Model.definition.name,
changedModelId: changedModelId,
changedModelValue: where,
oldInstance: oldInstance, oldInstance: oldInstance,
newInstance: newInstance newInstance: newInstance
}; };
let logsToSave = setLogsToSave(where, changedModelId, logRecord);
let logModel = definition.settings.log.model let logModel = definition.settings.log.model;
await Self.modelBuilder.models[logModel].create(logRecord);
let transaction = {};
if (ctx.options && ctx.options.transaction) {
transaction = ctx.options.transaction;
}
// console.log(logsToSave);
await Self.modelBuilder.models[logModel].create(logsToSave, transaction);
}
// this function retuns all the instances changed in case this is an updateAll
function setLogsToSave(changedInstances, changedInstancesIds, logRecord) {
let promises = [];
if (changedInstances && typeof changedInstances == "object") {
for (let i = 0; i < changedInstances.length; i++) {
logRecord.changedModelId = changedInstancesIds[i];
logRecord.changedModelValue = changedInstances[i];
promises.push(JSON.parse(JSON.stringify(logRecord)));
}
} else {
return logRecord;
}
return promises;
} }
function setActionType(ctx) { function setActionType(ctx) {
@ -156,5 +193,6 @@ module.exports = function(Self) {
} else if (!oldInstance && newInstance) { } else if (!oldInstance && newInstance) {
return 'insert'; return 'insert';
} }
return 'delete';
} }
}; };