Skip to content

Commit

Permalink
Merge branch 'master' into pluginbot-integration
Browse files Browse the repository at this point in the history
# Conflicts:
#	api/entity.js
#	api/service-templates.js
#	models/base/entity.js
#	package.json
  • Loading branch information
bsears90 committed Oct 7, 2017
2 parents b446dac + 21da2a7 commit ce114fb
Show file tree
Hide file tree
Showing 12 changed files with 260 additions and 185 deletions.
68 changes: 22 additions & 46 deletions api/entity.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ let store = require("../config/redux/store");
//todo - entity posting should have correct error handling, response should tell user what is wrong like if missing column
//todo - generify the method we use to "find all" and reduce code duplication in the getters
module.exports = function (router, model, resourceName, userCorrelator) {
let references = model.references;
let references = model.references || [];

if (userCorrelator) {
router.get(`/${resourceName}/own`, auth(), function (req, res, next) {
Expand Down Expand Up @@ -123,52 +123,28 @@ module.exports = function (router, model, resourceName, userCorrelator) {
});

//TODO Working for single update, need batch update method to work for children
router.put(`/${resourceName}/:id(\\d+)`, validate(model), auth(null, model, userCorrelator), function (req, res, next) {
let entity = res.locals.valid_object;
req.body.id = entity.get("id");
Object.assign(entity.data, req.body);
entity.update(function (err, updatedEntity) {

if(err){
res.status(500).send({ error: err })
}
else {
if (references === undefined || references.length == 0 || req.body.references === undefined || req.body.references.length == 0) {
res.locals.json = updatedEntity.data;
store.dispatchEvent(`${model.table}_updated`, updatedEntity);
EventLogs.logEvent(req.user.get('id'), `${resourceName} ${updatedEntity.get(model.primaryKey)} was updated by user ${req.user.get('email')}`);
next();
}
else {
let requestReferenceData = req.body.references;
updatedEntity.data.references = {};
let counter = 0;
for (let reference of references) {
if (!requestReferenceData[reference.model.table] || requestReferenceData[reference.model.table].length == 0) {
counter++;
if (counter == references.length) {
res.locals.json = updatedEntity.data;
store.dispatchEvent(`${model.table}_updated`, updatedEntity);
EventLogs.logEvent(req.user.get('id'), `${resourceName} ${updatedEntity.get(model.primaryKey)} was updated by user ${req.user.get('email')}`);
next();
}
}
else {
let referenceData = requestReferenceData[reference.model.table];
updatedEntity.updateReferences(referenceData, reference, function (modifiedEntity) {
counter++;
if (counter == references.length) {
store.dispatchEvent(`${model.table}_updated`, modifiedEntity);
res.locals.json = modifiedEntity.data;
EventLogs.logEvent(req.user.get('id'), `${resourceName} ${updatedEntity.get(model.primaryKey)} was updated by user ${req.user.get('email')}`);
next();
}
});
}
}
router.put(`/${resourceName}/:id(\\d+)`, validate(model), auth(null, model, userCorrelator),async function (req, res, next) {
try {
let entity = res.locals.valid_object;
req.body.id = entity.get("id");
Object.assign(entity.data, req.body);
let updatedEntity = await entity.update();
let requestReferences = req.body.references;

//todo: combine updateReferences into a single transaction
for (let reference of references) {
let referenceData = requestReferences[reference.model.table]
if (referenceData) {
let upsertedReferences = await updatedEntity.updateReferences(referenceData, reference);
}
}
})
res.locals.json = updatedEntity.data;
store.dispatchEvent(`${model.table}_updated`, updatedEntity);
next();
}catch(error){
console.error(error);
res.status(500).send({error});
}
});


Expand All @@ -195,7 +171,7 @@ module.exports = function (router, model, resourceName, userCorrelator) {
res.status(500).send({ error: err })
}
else {
if (references === undefined || references.length == 0 || req.body.references === undefined || req.body.references.length == 0) {
if (references.length === 0 || req.body.references === undefined || req.body.references.length == 0) {
res.locals.json = newEntity.data;
store.dispatchEvent(`${model.table}_created`, newEntity)
EventLogs.logEvent(req.user.get('id'), `${resourceName} ${newEntity.get(model.primaryKey)} was created by user ${req.user.get('email')}`);
Expand Down
31 changes: 22 additions & 9 deletions api/service-templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ let store = require("../config/redux/store");
//todo: generify single file upload for icon, image, avatar, right now duplicate code
let iconFilePath = ServiceTemplate.iconFilePath;
let imageFilePath = ServiceTemplate.imageFilePath;
let slug = require("slug");
let validateProperties = require("../lib/handleInputs").validateProperties;


Expand Down Expand Up @@ -243,7 +244,7 @@ module.exports = function (router) {
try {
let serviceTemplate = res.locals.valid_object;
let references = serviceTemplate.references;
let props = references ? references.service_template_properties : null;
let props = references ? (await references.service_template_properties) : null;
let req_body = req.body;
await authPromise(req, res);
let permission_array = res.locals.permissions || [];
Expand All @@ -257,10 +258,10 @@ module.exports = function (router) {


//todo: this doesn't do anthing yet, needs to check the "passed" props not the ones on the original...
let validationResult = props ? validateProperties(props, handlers) : [];
if (validationResult.length > 0) {
return res.status(400).json({error: validationResult});
}
// let validationResult = props ? validateProperties(props, handlers) : [];
// if (validationResult.length > 0) {
// return res.status(400).json({error: validationResult});
// }


if (props) {
Expand Down Expand Up @@ -301,7 +302,8 @@ module.exports = function (router) {
return next();

}catch(error){
console.error("error validating....");
console.error("error validating....", error);
res.status(500).json({error});
}
}

Expand Down Expand Up @@ -399,8 +401,7 @@ module.exports = function (router) {

//adjusted price...
req_body.amount = res.locals.adjusted_price;


//elevated accounts can override things
if (hasPermission) {
res.locals.overrides = {
user_id : req_body.client_id || req.user.get("id"),
Expand All @@ -413,7 +414,7 @@ module.exports = function (router) {
}else{
res.locals.overrides = {
user_id : req.user.get("id"),
requested_by : req.user.get("id")
requested_by : req.user.get("id"),

}
}
Expand All @@ -430,6 +431,8 @@ module.exports = function (router) {

//events!
if(isNew){
newInstance.set("api", responseJSON.api);
newInstance.set("url", responseJSON.url);
dispatchEvent("service_instance_requested_new_user", newInstance);

}else if(req.uid !== newInstance.get("user_id")){
Expand All @@ -449,6 +452,15 @@ module.exports = function (router) {

router.post("/service-templates", auth(), function (req, res, next) {
req.body.created_by = req.user.get("id");
let properties = req.body.references.service_template_properties
if(properties){
req.body.references.service_template_properties = properties.map(prop => {
return {
...prop,
name : slug(prop.prop_label)
};
});
}
ServiceTemplate.findAll("name", req.body.name, (templates) => {
if (templates && templates.length > 0) {
res.status(400).json({error: "Service template name already in use"})
Expand All @@ -458,6 +470,7 @@ module.exports = function (router) {
})
});


router.get("/service-templates/public", function (req, res, next) {
let key = "published";
let value = true;
Expand Down
3 changes: 2 additions & 1 deletion lib/promiseProxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ function promisifyHelper(resolve, reject){
let promiseProxy = function(functionToProxy, firstResolve = true){
return new Proxy(functionToProxy, {
apply : function(target, thisArg, argumentList){
if(typeof argumentList[argumentList.length - 1] === "function"){
if(target.length === argumentList.length){
// console.log("FUNCTION IS CALLING!", functionToProxy);
target.bind(thisArg)(...argumentList);
}
else{
Expand Down
92 changes: 52 additions & 40 deletions models/base/entity.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,18 @@ var whereFilter = require('knex-filter-loopback').whereFilter;

module.exports = function(tableName, references=[], primaryKey='id', database=knex) {
var Entity = function (data) {
let self = this;
this.data = data;
this.references = new Proxy({}, {
get: async function (target, name) {
let reference = references.find(ref => ref.model.table === name);
if (!reference) {
throw `Reference is not defined.`
}
return await self.getRelated(reference.model)
}

});
}

Entity.database = database;
Expand All @@ -41,32 +52,33 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
this.data[name] = value;
}

Entity.prototype.getRelated = function(model, callback){
if(Entity.references == null || Entity.references.length == 0){
function getRelated(model, callback) {
if (Entity.references == null || Entity.references.length == 0) {
callback([]);
}
let self = this;
let reference = Entity.references.find(rel => rel.model.table == model.table);
if(!reference){
if (!reference) {
callback([]);
return;
}
let referenceModel = reference.model;
let referenceField = reference.referenceField;
if(reference.direction == "from"){
referenceModel.findOnRelative(referenceField, self.get("id"), function(results){
if (reference.direction === "from") {
referenceModel.findOnRelative(referenceField, self.get("id"), function (results) {
console.log(callback);
callback(results);
})
}
else if(reference.direction == "to"){
referenceModel.findOnRelative(referenceModel.primaryKey, self.get(referenceField), function(results){
else if (reference.direction === "to") {
referenceModel.findOnRelative(referenceModel.primaryKey, self.get(referenceField), function (results) {
callback(results);
})
}

};

Entity.createPromise =function(entityData){
Entity.createPromise = function (entityData) {
let self = this
return Entity.database(Entity.table).columnInfo()
.then(function (info) {
Expand Down Expand Up @@ -101,7 +113,7 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
};


Entity.prototype.update = function (callback) {
function update(callback) {
var self = this;
var id = this.get(primaryKey);
if (!id) {
Expand Down Expand Up @@ -137,15 +149,15 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
});
};

Entity.prototype.attachReferences = function (callback) {
let attachReferences = function (callback) {
this.data.references = {};
let self = this;
if(references == null || references.length == 0){
if (references == null || references.length == 0) {
return callback(self);
}
for (let reference of references) {
let referenceModel = reference.model;
this.getRelated(referenceModel, function(results){
this.getRelated(referenceModel, function (results) {
self.data.references[referenceModel.table] = results.map(entity => entity.data);
if (Object.keys(self.data.references).length == references.length) {
callback(self);
Expand All @@ -154,9 +166,10 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
}
}


Entity.prototype.createReferences = function (referenceData, reference, callback) {
let self = this;
if(reference.readOnly){
if (reference.readOnly) {
console.log("Reference is readonly");
callback(self);
}
Expand All @@ -180,33 +193,28 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
}
}

Entity.prototype.updateReferences = function (referenceData, reference, callback) {
//todo - combine stuff into a single query
//todo - possibly dispatch events
Entity.prototype.updateReferences = async function (referenceData, reference) {
let self = this;
if(reference.readOnly){
if (reference.readOnly) {
console.log("Reference is readonly");
callback(self);
this;
}
else {
referenceData.forEach(newChild => (newChild[reference.referenceField] = this.get(primaryKey)));
console.log("referenceDate");
console.log(referenceData);
reference.model.batchUpdate(referenceData, function (response) {
/* if (reference.direction == "to") {
self.set(reference.referenceField, response[0][reference.model.primaryKey]);
self.update(function (updatedEntity) {
self.data.references[reference.model.table] = response;
callback(self);
})
}
else {
self.data.references[reference.model.table] = response;
callback(self);
}*/
self.data.references[reference.model.table] = response;
callback(self);
})
let references = await this.references[reference.model.table];
let removedReferences = await reference.model.batchDelete({
not : {id : {"in" : ids}},
[reference.referenceField] : self.get(primaryKey)
});
let upsertedReferences = await reference.model.batchUpdate(referenceData);

return upsertedReferences;


}
}
};

//TODO: think about no result case, not too happy how handling it now.

Expand Down Expand Up @@ -237,8 +245,8 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
};

//Find on relative function will call the findAll function by default. Allowing overrides at a model layer.
Entity.findOnRelative = function(key=true, value=true, callback){
Entity.findAll(key, value, function(result){
Entity.findOnRelative = function (key = true, value = true, callback) {
Entity.findAll(key, value, function (result) {
callback(result);
})
};
Expand Down Expand Up @@ -370,7 +378,9 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
});
};


Entity.batchDelete = async function(filter){
return knex(Entity.table).where(whereFilter(filter)).del();
};
/**
*
* @param dataArray - array of data objects that are going to be inserted
Expand All @@ -396,7 +406,6 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
})
})
};
//promise support

//TODO this batch update work
let batchUpdate = function (dataArray, callback) {
Expand Down Expand Up @@ -424,9 +433,12 @@ module.exports = function(tableName, references=[], primaryKey='id', database=kn
})
});
};
Entity.batchCreate = promiseProxy(batchCreate);
Entity.batchUpdate = promiseProxy(batchUpdate);
Entity.batchUpdate = promiseProxy(batchUpdate)
Entity.prototype.update = promiseProxy(update, false);
Entity.findOne = promiseProxy(findOne);
Entity.prototype.attachReferences = promiseProxy(attachReferences);
Entity.prototype.getRelated = promiseProxy(getRelated);
Entity.batchCreate = promiseProxy(batchCreate);


return Entity;
Expand Down
Loading

0 comments on commit ce114fb

Please sign in to comment.