git-webserver
Version:
Web Server Integrated GIT Version Control System
221 lines (218 loc) • 8.22 kB
JavaScript
/**
* User collection schema in mongo DB
* @param {JSON} config Master Configuration JSON
*/
exports.usersMongoDB = function (config) {
var mongoose = require("mongoose"),
Schema = mongoose.Schema,
autoIncrement = require("mongoose-auto-increment-fix");
var bcrypt = require("bcryptjs");
if (mongoose.models && mongoose.models.users) {
return mongoose.models.users;
}
mongoose.Promise = global.Promise;
var mongoURI = "mongodb://" + config.dbURL + ":" + config.dbPort + "/" + config.dbName;
if (config.dbUser != "" && config.dbPassword != "") {
mongoURI = "mongodb://" + config.dbUser + ":" + config.dbPassword + "@" + config.dbURL + "/" + config.dbName;
}
mongoose.connect(mongoURI, {
useNewUrlParser: true
});
autoIncrement.initialize(mongoose);
var users = new Schema({
name: {
type: String,
required: true
},
userName: {
type: String,
unique: true,
required: true
},
userNameDisplay: {
type: String
},
eMail: {
type: String,
unique: true,
required: true
},
mailVerified: {
type: Boolean,
default: false
},
password: {
type: String,
required: true
},
timestamp: {
type: Date,
default: Date.now
}
});
users.pre("save", function (next) {
var data = this;
var hash = bcrypt.hashSync(data.password, 10);
data.password = hash;
next();
});
users.plugin(autoIncrement.plugin, {
model: "users",
field: "Si",
startAt: 1
});
return mongoose.model("users", users, "users");
};
/**
* Creates new user record in DB
* @param {object} req Request Object
* @param {object} res Response Object
* @param {{name:String,userName:String,eMail:Strings,password:String}} data Input data
* @param {JSON} config Master Configuration JSON
* @param {function} next Callback function(req,res,config)
* @returns {JSON} return config.exist
*/
exports.createUser = function (req, res, data, config, next) {
var validate = require("../modules/validation");
if (validate(data.name).isNotEmpty().hasLength(3).boolResult() &&
validate(data.userName).isNotEmpty().hasLength(3).boolResult() &&
validate(data.eMail).isNotEmpty().boolResult() /* TODO : regx Validation pending */ &&
validate(data.password).isNotEmpty().hasLength(8).boolResult()) {
data.eMail = data.eMail.toUpperCase();
data.userNameDisplay = data.userName;
data.userName = data.userName.toUpperCase();
if (config.database == "Mongo") {
var users = exports.usersMongoDB(config);
users.create(data, function (err) {
if (err) {
if (gLogging) console.log(err);
if (err.code == 11000) {
config.exist = true;
next(req, res, config);
} else {
res.status(503);
res.send();
}
} else {
config.exist = false;
next(req, res, config);
}
});
}
} else {
if (gLogging) console.log("Create User Missing Input Error");
res.status(403);
res.send();
}
};
/**
* Creates new user record in DB
* @param {object} req Request Object
* @param {object} res Response Object
* @param {{eMail:Strings,password:String}} data Input data
* @param {JSON} config Master Configuration JSON
* @param {function} next Callback function(req,res,config)
* @returns {JSON} return config.valid
* Note : Common login caller for both web and git authentication
*/
exports.loginUser = function (req, res, data, config, next) {
var validate = require("../modules/validation");
if ((validate(data.eMail).isNotEmpty().boolResult() /* TODO : regx Validation pending */ ) &&
validate(data.password).hasLength(8).isNotEmpty().boolResult()) {
if (data.eMail) data.eMail = data.eMail.toUpperCase();
if (config.database == "Mongo") {
var users = exports.usersMongoDB(config);
var query = {
$or: [{
eMail: data.eMail
},
{
userName: data.eMail
}
]
};
users.findOne(query, function (err, result) {
if (err) {
if (gLogging) {
console.log(err);
}
if (config.git) {
next(false);
} else {
res.status(503);
res.send();
}
} else {
if (result) {
var bcrypt = require("bcryptjs");
var validUser = bcrypt.compareSync(
data.password,
result.password
);
if (config.git) {
next(validUser);
} else {
if (validUser) {
config.valid = true;
config.result = result;
next(req, res, config);
} else {
config.valid = false;
next(req, res, config);
}
}
} else {
if (config.git) {
next(false);
} else {
config.valid = false;
next(req, res, config);
}
}
}
});
}
} else {
if (gLogging) console.log("Login User Missing Input Error");
res.status(403);
res.send();
}
};
/**
* return array of all user data in config.userResult
* @param {object} req Request Object
* @param {object} res Response Object
* @param {JSON} config Master Configuration JSON
* @param {function} next callback function(req,res,config)
*/
exports.getAllUsers = function (req, res, config, next) {
if (config.database == "Mongo") {
var user = exports.usersMongoDB(config);
user.find({}, function (err, userResult) {
if (err) {
if (gLogging) console.log(err);
res.status(500);
res.send();
} else {
var userAccess = require("./accessCntrl");
//TODO : Move to access cntrl sb schema
var accessCntrl = userAccess.accessCntrlMongoDB(config);
accessCntrl.find({}, function (err, accessResult) {
if (err) {
if (gLogging) console.log(err);
} else {
for (var i in userResult) {
for (var j in accessResult) {
if (userResult[i].userName == accessResult[j].userName) {
userResult[i] = JSON.parse(JSON.stringify(userResult[i]).substr(0, JSON.stringify(userResult[i]).length - 1) + "," + JSON.stringify(accessResult[j]).substr(1, JSON.stringify(accessResult[j]).length));
}
}
}
config.userResult = userResult;
next(req, res, config);
}
});
}
});
}
};