UNPKG

nyx_server

Version:

Node内容发布

223 lines (207 loc) 8.25 kB
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;