nyx_server
Version:
Node内容发布
223 lines (207 loc) • 8.25 kB
JavaScript
var mysql = require('mysql');
var gitLoader = require("../GitClient");
var Promise = require("bluebird");
var log4js = require("log4js");
var log = log4js.getLogger("online");
var _ = require("lodash");
var projectFn = require("../Project");
var Project = require("../ProjectLoader").Project;
var config = require("../../config/default-config");
var DBTemplate = require("../../db/DBTemplate");
var dbtemplate = new DBTemplate(config.NYX_DB_CONFIG_NAME);
/**
* 保存或更新碎片信息
* @param {Object|Array}chipInfos
*/
function online(projectName, gitrepo, version, projects_cache_path) {
var promise = gitLoader.loadResource(projectName, gitrepo, version, projects_cache_path)
.then(function(projectInfo) {
return loadProject(projectInfo);
});
return promise.then(function(project) {
return dbtemplate.execute(function(connect) {
return _process(connect, project);
});
}).catch(function(err) {
console.log(err);
});
}
function _process(connect, project) {
//1、读取项目信息,验证项目名称是否重复。
var projectConfig = project.config;
var pname = projectConfig.name; //项目名称
var gitRepo = projectConfig.repository.url;
return Promise.resolve().then(function() {
console.log("检测项目是否重名..");
return checkProjectName(connect, pname, gitRepo);
}).then(function(exists) {
console.log("处理项目..", exists);
return _processProject(connect, project, exists);
}).then(function(_projectInfo) {
console.log("处理模板..");
return _processTemplate(connect, project, _projectInfo.id).then(function() {
console.log("处理碎片..");
return _processChip(connect, project, _projectInfo.id);
});
})
/*.then(function(){
console.log("处理碎片..");
return _processChip(connect , project);
})*/
.then(function() {
console.log("上线成功..");
}).catch(function(err) {
console.log("上线失败..");
console.log("_process", err);
throw err;
});
}
function _processProject(conn, project, isExist) {
var config = project.config;
var name = config.name;
var repo = config.repository.url;
var descr = config.description || "";
var version = config.version;
return Promise.resolve(true).then(function() {
if (!isExist) {
return conn.query("insert into project_info_t(name, repo , version , created_time , modify_time ,descr) values(?,?,?, now() ,now(),?)", [name, repo, version, descr])
.catch(function(err) {
throw err;
});
} else {
return conn.query("update project_info_t set version=? , descr=? , modify_time=now() where name=? and repo=?", [version, descr, name, repo])
.catch(function(err) {
throw err;
});
}
}).then(function() {
return conn.query('select * from project_info_t where name=?', [name]).then(function(result) {
console.log(result);
if (result.length > 0) {
return result[0];
}
throw new Error('项目不存在');
});
});
}
/**
* 检测项目明是否以及存在,如果数据库中存在相同项目名但repo地址不同,则视为重复项目名称
* @param {String}projectName 项目名称
* @param {String}repo 项目的git地址
* @return {boolean} 如果数据库中有已经创建的项目返回true,反之false
*/
function checkProjectName(connection, projectName, gitRepo) {
return connection.query("select name , repo from project_info_t where name=?", [projectName])
.then(function(results) {
if (results.length > 0) {
for (var i = 0; i < results.length; i++) {
var name = results[i].name;
var repo = results[i].repo;
if (name == projectName && gitRepo != repo) {
throw new Error("项目名称已经存在,请修改项目package.json中项目名称");
}
}
return true;
} else {
return false;
}
}).catch(function(err) {
throw err;
});
}
function _processTemplate(conn, project, projectId) {
//2、读取模板信息
return projectFn.loadTemplates(project).map(function(template) {
//处理模板信息
var tconfig = template.config;
var matchPath = tconfig.matchPath; //匹配路径
var supportDevices = template.getSupportDevices();
var descr = tconfig.description || "";
var fileType = template.getFileType();
var tname = template.name; //模板名称
var extra = tconfig.extra;
return {
"matchPath": matchPath,
"devices": supportDevices,
"fileType": fileType,
"name": tname,
"project": project.name,
"descr": descr,
"extra": extra
};
}).then(function(templateInfos) {
var ret = [];
//将模板信息平面化,将devices、extra 平面化
templateInfos.forEach(function(templateInfo) {
//console.log(templateInfo)
var devices = templateInfo.devices;
var extra = templateInfo.extra;
if (devices) {
devices = devices.split(",");
}
if (extra) {
extra = extra.split(",");
}
for (var i = 0; i < devices.length; i++) {
if (extra) {
for (var j = 0; j < extra.length; j++) {
var v = _.clone(templateInfo);
v.devices = devices[i];
v.extra = extra[j];
ret.push(v);
}
} else {
var v = _.clone(templateInfo);
v.devices = devices[i];
ret.push(v);
}
}
});
return ret;
}).map(function(templateInfo) {
//保存模板数据
var matchPath = templateInfo.matchPath;
var devices = templateInfo.devices;
var extra = templateInfo.extra;
var fileType = templateInfo.fileType;
var name = templateInfo.name;
var descr = templateInfo.description || "";
return conn.query("delete from template_info_t where project=?", [project.name])
.then(function(result) {
return conn.query("insert into template_info_t(name,project,path,type,device,extra,descr ,created_time , projectId) values(?,?,?,?,?,?,?,now(),?)", [name, project.name, matchPath, fileType, devices, extra, descr, projectId]);
}).catch(function(err) {
throw err;
});
}).catch(function(err) {
throw err;
});
}
function _processChip(conn, project, projectId) {
//3、读取碎片信息
return projectFn.loadChips(project).map(function(chip) {
//处理碎片信息
var chipConfig = chip.config;
var chipName = chipConfig.name; //碎片名称
var descr = chipConfig.description || "";
return {
"name": chipName,
"project": project.name,
"descr": descr
};
}).map(function(chipInfo) {
var name = chipInfo.name;
var projectName = project.name;
var descr = chipInfo.descr;
return conn.query("delete from chip_info_t where project=?", [projectName])
.then(function(result) {
return conn.query("insert into chip_info_t(name , project , descr , projectId) values(?,?,?,?)", [name, projectName, descr, projectId]);
});
}).catch(function(err) {
throw err;
});
}
function loadProject(projectInfo) {
var projectBaseDir = projectInfo.projectBaseDir;
return new Project(projectBaseDir);
}
module.exports = online;