From 42e5a06750042bab60a5446d96d0c171fbc4ef93 Mon Sep 17 00:00:00 2001 From: febbweiss Date: Thu, 5 Nov 2015 07:58:55 +0000 Subject: [PATCH] Refactoring: reorganize files between client and server + initiate deployment --- .meteor/packages | 1 + .meteor/versions | 1 + client/projects.js | 121 +++++++++--------- client/projects.service.js | 7 + client/subscriptions.js | 1 - server/constants.js | 24 ++++ server/lib/command_runner.js | 36 ++++++ server/lib/deployment.service.js | 33 +++++ .../lib/projects.methods.js | 8 +- .../lib/projects.service.js | 0 server/publications.js | 4 + 11 files changed, 177 insertions(+), 59 deletions(-) create mode 100644 client/projects.service.js delete mode 100644 client/subscriptions.js create mode 100644 server/constants.js create mode 100644 server/lib/command_runner.js create mode 100644 server/lib/deployment.service.js rename lib/methods.js => server/lib/projects.methods.js (64%) rename lib/projects.js => server/lib/projects.service.js (100%) diff --git a/.meteor/packages b/.meteor/packages index dab1b95..0d971aa 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -21,3 +21,4 @@ twbs:bootstrap-noglyph fortawesome:fontawesome iron:router zenorocha:clipboard +simple:reactive-method diff --git a/.meteor/versions b/.meteor/versions index 68d05df..06a9d43 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -61,6 +61,7 @@ reload@1.1.4 retry@1.0.4 routepolicy@1.0.6 session@1.1.1 +simple:reactive-method@1.0.2 spacebars@1.0.7 spacebars-compiler@1.0.7 standard-minifiers@1.0.1 diff --git a/client/projects.js b/client/projects.js index a55100c..4fbfd58 100644 --- a/client/projects.js +++ b/client/projects.js @@ -1,64 +1,71 @@ - Template.management.helpers({ - projects: function () { - return ProjectService.list(); - } - }); +Template.management.onCreated(function(){ + Meteor.subscribe('projects'); +}); - Template.projectForm.onRendered(function() { - new Clipboard('.btn.clipboard'); - }); - - Template.projectForm.events({ - 'submit .new-project': function (event) { - event.preventDefault(); - var form = event.target; - if( form.id.value ) { - Meteor.call('editProject',form.id.value, form.label.value, form.git_url.value, form.public_url.value, form.commands.value); - form.id.value = ''; - } else { - Meteor.call('addProject', form.label.value, form.git_url.value, form.public_url.value, form.commands.value); - } - - Session.set('projectToEdit', undefined); - form.label.value = ''; - form.git_url.value = ''; - form.public_url.value = ''; - form.commands.value = ''; - }, - - 'click .cancel': function(event) { +Template.management.helpers({ + projects: function () { + return ProjectService.list(); + } +}); + +Template.projectForm.onRendered(function() { + new Clipboard('.btn.clipboard'); +}); + +Template.projectForm.events({ + 'submit .new-project': function (event) { event.preventDefault(); + var form = event.target; + if( form.id.value ) { + Meteor.call('editProject',form.id.value, form.label.value, form.git_url.value, form.public_url.value, form.commands.value, function(errors, result) { + console.log(errors); + console.log(result); + }); + form.id.value = ''; + } else { + Meteor.call('addProject', form.label.value, form.git_url.value, form.public_url.value, form.commands.value); + } Session.set('projectToEdit', undefined); - }, - - 'click .trash': function(event) { - event.preventDefault(); - - Meteor.call('deleteProject', Session.get('projectToEdit')._id); - Session.set('projectToEdit', undefined); - } - }); + form.label.value = ''; + form.git_url.value = ''; + form.public_url.value = ''; + form.commands.value = ''; + }, - Template.projectForm.helpers({ - project: function() { - return Session.get('projectToEdit'); - }, + 'click .cancel': function(event) { + event.preventDefault(); - editionMode: function() { - return Session.get('projectToEdit') ? '' : 'hidden'; - }, - - deployLink: function() { - return Meteor.absoluteUrl('deploy?token=XXXX&project_id=' + Session.get('projectToEdit')._id); - } - }); + Session.set('projectToEdit', undefined); + }, - Template.project.events({ - 'click .edit': function(event) { - event.preventDefault(); - return Meteor.call('getProject', this._id, function(error, result) { - Session.set('projectToEdit', result); - }); - }, - }); \ No newline at end of file + 'click .trash': function(event) { + event.preventDefault(); + + Meteor.call('deleteProject', Session.get('projectToEdit')._id); + Session.set('projectToEdit', undefined); + } +}); + +Template.projectForm.helpers({ + project: function() { + return Session.get('projectToEdit'); + }, + + editionMode: function() { + return Session.get('projectToEdit') ? '' : 'hidden'; + }, + + deployLink: function() { + return Meteor.absoluteUrl('deploy?token=XXXX&project_id=' + Session.get('projectToEdit')._id); + } +}); + +Template.project.events({ + 'click .edit': function(event) { + event.preventDefault(); + return Meteor.call('getProject', this._id, function(error, result) { + Session.set('projectToEdit', result); + }); + }, +}); \ No newline at end of file diff --git a/client/projects.service.js b/client/projects.service.js new file mode 100644 index 0000000..39d0302 --- /dev/null +++ b/client/projects.service.js @@ -0,0 +1,7 @@ +Projects = new Mongo.Collection('projects'); + +ProjectService = { + list: function() { + return Projects.find({}, {sort: {label: 1}}); + } +}; diff --git a/client/subscriptions.js b/client/subscriptions.js deleted file mode 100644 index a25c3ef..0000000 --- a/client/subscriptions.js +++ /dev/null @@ -1 +0,0 @@ -Meteor.subscribe('projects'); \ No newline at end of file diff --git a/server/constants.js b/server/constants.js new file mode 100644 index 0000000..9066beb --- /dev/null +++ b/server/constants.js @@ -0,0 +1,24 @@ +var DEPLOYMENT_FOLDER = 'deployment', + + SCRIPTS = { + CREATE : [ + { + cmd: 'mkdir %CWD%', + options : { + cwd: '%ROOT_CWD%' + } + }, + { + cmd: 'cd %CWD%', + options : { + cwd: '%ROOT_CWD%' + } + }, + { + cmd: 'git clone %GIT% .', + options : { + cwd: '%ROOT_CWD%/%CWD%' + } + } + ] + }; \ No newline at end of file diff --git a/server/lib/command_runner.js b/server/lib/command_runner.js new file mode 100644 index 0000000..0b5b7ad --- /dev/null +++ b/server/lib/command_runner.js @@ -0,0 +1,36 @@ + +var exec = Npm.require('child_process').exec, + execSync = function(cmd, options, stdoutHandler, stderrHandler) { + exec(cmd, + options, + Meteor.bindEnvironment( + function(error, stdout, stderr) { + if( stdout != '' ) { + stdoutHandler(stdout); + } + if( stderr != '' ) { + stderrHandler(stderr); + } + } + ) + ); + }; + +var CommandRunner = { + run: function( script, deployment, stdout, stderr, counter, callback ) { + var command = script[command].cmd.replace('%ROOT_CWD%', DEPLOYMENT_FOLDER).replace('%CWD%', deployment._id), + options = script[command].options; + options.cwd.replace('%ROOT_CWD%', DEPLOYMENT_FOLDER).replace('%CWD%', deployment._id); + + execSync(command, options, stdout, stderr, function() { + counter++; + if( counter > script.length ) { + if( callback ) { + callback(); + } + } else { + CommandRunner.run(script, deployment, stdout, stderr, counter, callback); + } + }); + } +} \ No newline at end of file diff --git a/server/lib/deployment.service.js b/server/lib/deployment.service.js new file mode 100644 index 0000000..6005586 --- /dev/null +++ b/server/lib/deployment.service.js @@ -0,0 +1,33 @@ +Deployments = new Mongo.Collection('deployments'); + +DeploymentService = { + get: function(id) { + return Deployments.find({_id: id}, {date: 1}); + }, + + appendLog: function(id, data, error) { + Deployments.update({ _id: id },{ $push: { + output: { + timestamp : new Date().getTime(), + data : data + } + }}); + }, + create: function(project, callback) { + return Deployment.insert({ + project_id: projet._id, + timestamp: new Date().getTime(), + output: [] + }, function(errors, deploymentId) { + _execSync(cmd, function(data) { + DeploymentService.appendLog(deploymentId, data, false); + }, function(data) { + DeploymentService.appendLog(deploymentId, data, true); + }); + }); + }, + + deploy: function(project) { + + } +} \ No newline at end of file diff --git a/lib/methods.js b/server/lib/projects.methods.js similarity index 64% rename from lib/methods.js rename to server/lib/projects.methods.js index 0afd4f5..e59d288 100644 --- a/lib/methods.js +++ b/server/lib/projects.methods.js @@ -8,7 +8,13 @@ Meteor.methods({ }, addProject: function(label, git_url, public_url ,commands) { - ProjectService.insert(label, git_url, public_url ,commands); + return ProjectService.insert(label, git_url, public_url ,commands, function(errors, id) { + if( id ) { + /*DeploymentService.deploy(ProjectService.get(id), function(errors, deploymentId) { + + });*/ + } + }); }, editProject: function(id, label, git_url, public_url ,commands) { diff --git a/lib/projects.js b/server/lib/projects.service.js similarity index 100% rename from lib/projects.js rename to server/lib/projects.service.js diff --git a/server/publications.js b/server/publications.js index 8a28989..d6fa922 100644 --- a/server/publications.js +++ b/server/publications.js @@ -1,3 +1,7 @@ Meteor.publish('projects', function() { return ProjectService.list(); +}); + +Meteor.publish('deployment', function(id) { + return DeploymentService.get(id); }); \ No newline at end of file