203 lines
4.6 KiB
JavaScript
203 lines
4.6 KiB
JavaScript
const mongoose = require('mongoose');
|
|
const options = {
|
|
loggerLevel: 'error',
|
|
useNewUrlParser: true,
|
|
reconnectInterval: 2000,
|
|
reconnectTries: 30, // Retry up to 30 times
|
|
useCreateIndex: true
|
|
};
|
|
|
|
// Connect to DB
|
|
mongoose.connect(process.env.MONGO_URI, options);
|
|
|
|
// When successfully connected
|
|
mongoose.connection.on('connected', () => {
|
|
console.log('MongoDB connected...');
|
|
});
|
|
|
|
// When successfully reconnected
|
|
mongoose.connection.on('reconnected', () => {
|
|
console.log('dbevent: reconnected');
|
|
});
|
|
|
|
// If the connection throws an error
|
|
mongoose.connection.on('error', (err) => {
|
|
console.log(`dbevent: error: ${err}`);
|
|
console.log(`Retry mongo connect`);
|
|
mongoose.connect(process.env.MONGO_URI, options);
|
|
});
|
|
|
|
// External Dependancies
|
|
const boom = require('boom');
|
|
|
|
// Get Data Models
|
|
const Provision = require('./models/Provision');
|
|
const Destroy = require('./models/Destroy');
|
|
const User = require('./models/User');
|
|
const Scenario = require('./models/Scenario');
|
|
const VmType = require('./models/VmType');
|
|
|
|
const getOid = async (oid, reply) => {
|
|
try {
|
|
const entity = await User.findOne({ oid: oid});
|
|
return entity;
|
|
} catch (err) {
|
|
throw boom.boomify(err)
|
|
}
|
|
}
|
|
|
|
const getScenarioByName = async (name, reply) => {
|
|
try {
|
|
const entity = await Scenario.findOne({ name: name});
|
|
return entity;
|
|
} catch (err) {
|
|
throw boom.boomify(err)
|
|
}
|
|
}
|
|
|
|
const get = async (model, filter, reply) => {
|
|
try {
|
|
const entity = await model.find(filter).sort({created: -1}).populate('user').populate('destroy');
|
|
return entity;
|
|
} catch (err) {
|
|
throw boom.boomify(err)
|
|
}
|
|
}
|
|
|
|
const getSingle = async (model, id, reply) => {
|
|
try {
|
|
const entity = await model.findById(id).populate('user').populate('destroy');
|
|
return entity;
|
|
} catch (err) {
|
|
throw boom.boomify(err);
|
|
}
|
|
};
|
|
|
|
const add = async (model, data, reply) => {
|
|
try {
|
|
const entity = new model(data)
|
|
return entity.save();
|
|
} catch (err) {
|
|
throw boom.boomify(err);
|
|
}
|
|
};
|
|
|
|
const update = async (model, id, body, reply) => {
|
|
try {
|
|
const { ...updateData } = body;
|
|
updateData.updated = new Date();
|
|
const update = await model.findByIdAndUpdate(id, updateData, { new: true }).populate('user').populate('destroy');
|
|
return update;
|
|
} catch (err) {
|
|
throw boom.boomify(err)
|
|
}
|
|
};
|
|
|
|
const del = async (model, id, reply) => {
|
|
try {
|
|
const entity = await model.findByIdAndRemove(id)
|
|
return entity;
|
|
} catch (err) {
|
|
throw boom.boomify(err)
|
|
}
|
|
}
|
|
|
|
function _m(model) {
|
|
return {
|
|
get: async (filter, reply) => {
|
|
return get(model, filter, reply);
|
|
},
|
|
getSingle: async (id, reply) => {
|
|
return getSingle(model, id, reply);
|
|
},
|
|
add: async (data, reply) => {
|
|
return add(model, data, reply);
|
|
},
|
|
update: async (id, data, reply) => {
|
|
return update(model, id, data, reply);
|
|
},
|
|
del: async (id, reply) => {
|
|
return del(model, id, reply);
|
|
}
|
|
}
|
|
}
|
|
|
|
const mScenarios = _m(Scenario);
|
|
mScenarios.getScenarioByName = getScenarioByName;
|
|
|
|
module.exports = {
|
|
provision: _m(Provision),
|
|
destroy: _m(Destroy),
|
|
scenario: mScenarios,
|
|
vmtype: _m(VmType),
|
|
user: {
|
|
get: async (filter, reply) => {
|
|
return get(User, filter, reply);
|
|
},
|
|
getOid: async (oid, reply) => {
|
|
return getOid(oid, reply);
|
|
},
|
|
getSingle: async (req, reply) => {
|
|
return getSingle(User, req, reply);
|
|
},
|
|
add: async (data, reply) => {
|
|
return add(User, data, reply);
|
|
},
|
|
update: async (data, reply) => {
|
|
return update(User, data, reply);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
async function asyncForEach(array, callback) {
|
|
for (let index = 0; index < array.length; index++) {
|
|
await callback(array[index], index, array);
|
|
}
|
|
}
|
|
|
|
async function toObjectId(model, fieldName, fieldNameTemp){
|
|
var filter = {};
|
|
filter[fieldName] = {$type : 2};
|
|
var results = await model.find(filter);
|
|
|
|
await asyncForEach(results, async function(d) {
|
|
console.log("doc", d);
|
|
var newId = mongoose.Types.ObjectId(d[fieldName]); // to ObjectId
|
|
var oldId = d[fieldName];
|
|
d[fieldName] = undefined;
|
|
d[fieldNameTemp] = newId;
|
|
await model.create(d);
|
|
|
|
var remFilter = {};
|
|
remFilter[fieldName] = oldId;
|
|
await model.remove(remFilter);
|
|
|
|
|
|
});
|
|
}
|
|
|
|
async function destroyStuff(){
|
|
|
|
var results = await Destroy.find({provId:{$type : 2}});
|
|
|
|
await asyncForEach(results, async function(d) {
|
|
console.log("doc", d);
|
|
var destroy = d._id;
|
|
|
|
await Provision.updateOne({_id: d.provId}, {destroy: destroy});
|
|
|
|
d.provId = undefined;
|
|
d.save();
|
|
|
|
});
|
|
}
|
|
|
|
toObjectId(Provision, "userId", "user");
|
|
toObjectId(Destroy, "userId", "user");
|
|
destroyStuff();
|
|
|
|
|
|
|
|
|