From ce6f3a95ceeb9142f823b1f7b3c02a63ff77c5d2 Mon Sep 17 00:00:00 2001
From: jweg <jweg@informatik.uni-kiel.de>
Date: Thu, 6 Jul 2017 16:50:10 +0200
Subject: [PATCH] work in progress: promises for zip

---
 app.js | 211 ++++++++++++++++++++++++---------------------------------
 1 file changed, 88 insertions(+), 123 deletions(-)

diff --git a/app.js b/app.js
index 2c89efe..a75048d 100644
--- a/app.js
+++ b/app.js
@@ -14,10 +14,10 @@ var exphbs = require('express-handlebars');
 //initializer
 var nanit = require('nanit');
 //load names of available download files
-var downloadFiles = require('./downloadFiles.json');
-var downloadNames = Object.keys(downloadFiles);
+const downloadFiles = require('./downloadFiles.json');
+const downloadNames = Object.keys(downloadFiles);
 
-var app = express();
+let app = express();
 
 app.use(bodyParser.urlencoded({
   extended: true
@@ -29,13 +29,13 @@ app.engine('.hbs', exphbs({extname: '.hbs'}));
 app.set('view engine', '.hbs');
 
 //initialize the git repos
-//TODO error handling is not working properly, error returned is not in var error, but in req + req and res are undefined!
+//TODO error handling is not working properly, error returned is not in let error, but in req + req and res are undefined!
 // nanit.initialize(downloadFiles, function(req,res,err){
 // // console.log('err in nanit.initialize:', err);
 // // console.log('req in nanit.initialize:', req);
 // // console.log('res in nanit.initialize:', res);
 
-// var response = 
+// let response = 
 //           'There was an error during cloning the git repositories. ' +
 //           'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
 //           'and add the following information: ' + req;
@@ -69,14 +69,11 @@ app.get('/download', function(req, res){
 const promiseArray = []
 const checkedFiles = req.query.checkedFiles.split(',');
 
-const zip = new JSZip();
 // create a file to stream archive data to. 
+const zip = new JSZip();
 zip.file("README.txt", "text for README");
 
-var frontendFinished = false;
-var backendFinished = false;
 
-//----------------------------------------------------------------backend
 backendChecked = checkedFiles.find(function(file){
 return file === 'explorviz-ui-backend';
 });
@@ -86,30 +83,26 @@ if (backendChecked){
  const fileName = backendChecked;
  const downloadURL = downloadFiles[backendChecked]; 
 
-const backendPromise = new Promise((resolve, reject)=> {
+ const backendPromise = new Promise((resolve, reject)=> {
 
  		exec('git pull ' + ' && cd ' + fileName + ' && mvn compile war:war ', (error, stdout, stderr) => {
 
- //addBackend();
-   
-    console.log('error in exec', error);
    	 if (error) {
     	reject(error);
-     // res.send(response); beim promise.all
-      return;
+        return;
     }
 
     console.log(stdout);
     console.log(stderr);
-resolve({fileName:"backend.war", path:"explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war"});
+
+resolve({zipFileName:'backend.war', path:'explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war'});
     
 }); 
 })
 
-promiseArray.push(backendPromise);
-console.log('promiseArray:',promiseArray);
+ promiseArray.push(backendPromise);
+ console.log('promiseArray:',promiseArray);
 } 
-//--------------------------------------------------------------------------------frontend
 
 frontendChecked = checkedFiles.find(function(file){
 return file === 'explorviz-ui-frontend';
@@ -119,123 +112,113 @@ if (frontendChecked){
  const fileName = frontendChecked;
  const downloadURL = downloadFiles[frontendChecked]; 
 
-exec('git pull ', (error, stdout, stderr) => {
-installAddons();
-  var response = 
-          'There was an error during your build. ' +
-          'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-          'and add the following information: ' + error;
+const frontendPullPromise = new Promise((resolve, reject) => {
+	console.log('resolve frontendPullPromise', resolve);
+	exec('cd ' +  fileName + ' git pull ', (error, stdout, stderr) => {
 
-    if (error) {
-      res.send(response);
-      return;
-    }
+    	if (error) {
+      	reject(error)
+      	return;
+    	}
 
-});
+    console.log(stdout);
+    console.log(stderr);
+resolve();
+	});
+})
+promiseArray.push(frontendPullPromise);
+console.log('promiseArray.push(frontendPullPromise):',promiseArray);
 
-};
 
-function installAddons(){
-console.log('in installAddons()');
-checkedPlugins = checkedFiles.filter(function(file){
-  return /\bexplorviz-frontend-plugin-\w*/.exec(file);
-});
+// const frontendInstallAddons = frontendPullPromise.then((resolve, reject) => {
 
- checkedPlugins.forEach((pluginName) => {
-  exec('cd ' + 'explorviz-ui-frontend ' + 'ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => {
- 
-  var response = 
-          'There was an error during your build. ' +
-          'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-          'and add the following information: ' + error;
+// console.log('in installAddons()');
+// checkedPlugins = checkedFiles.filter(function(file){
+//   return /\bexplorviz-frontend-plugin-\w*/.exec(file);
+// });
+// console.log('checkedPlugins', checkedPlugins);
+//  checkedPlugins.forEach((pluginName) => {
+//   exec('cd ' + 'explorviz-ui-frontend ' + 'ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => {
+//   	console.log('in exec plugin install');
+//  console.log('error in exec plugin install', error);
+//     if (error) {
+//       reject(error);
+//       return;
+//     }
 
-    if (error) {
-      res.send(response);
-      return;
-    }
+// console.log(stdout);
+// console.log(stderr);
 
-console.log(stdout);
-console.log(stderr);
+// resolve({zipFileName:'Zwischenschritt2', path:'./explorviz-ui-frontend/dist/'});
 
-  });
+//   });
 
-});
- buildFrontend();
-};
+// })
 
+// })
+//promiseArray.push(frontendInstallAddons);
+//console.log('promiseArray.push(frontendInstallAddons):',promiseArray);
 
-function buildFrontend(){
-	console.log('buildFrontend()');
+const frontendBuildPromise = frontendPullPromise.then((resolve)=> {
+console.log('resolve frontendBuildPromise', resolve);
 //build everything you have
-exec('cd explorviz-ui-frontend && ember build --environment=production', (error, stdout, stderr) => {
-//exec('cd explorviz-ui-frontend', (error, stdout, stderr) => {
+exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => {
 
-addFrontend(); 
+   	// if (error) {
+    //   	reject(error);
+    //   	return;
+    // }
 
+	console.log(stdout);
+	console.log(stderr);
 
-  var response = 
-          'There was an error during your build. ' +
-          'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-          'and add the following information: ' + error;
-
-    if (error) {
-      res.send(response);
-      return;
-    }
+	resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'});
+ });
 
-console.log(stdout);
-console.log(stderr);
 
 
- });
- }; // ------------------------------------------ember build
-
-
-// function addBackend(){
-// // read a file as a stream and add it to a zip
-// console.log('addBackend()');
-// const backendStream = fs.createReadStream("explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war");
-// zip.file("backend.war", backendStream);
-// backendFinished = true;
-// createZip();
-// };
-
-function addFrontend(){
-	console.log("in addFrontend");
-
-var stream = fsReaddir('./explorviz-ui-frontend/dist/')
-.on('error', function(err) {
-  console.log('error:', err);
-}).on('data', function(data){
-	
-	for (var i=0; i<data.length; i++) {
-		const frontendStream = fs.createReadStream(data[i]);
-		zip.file(data[i], frontendStream);
-}
+})
+console.log('frontendBuildPromise:', frontendBuildPromise);
+promiseArray.push(frontendBuildPromise);
+console.log('promiseArray:',promiseArray);
 
-}).on('finish',function(){
-	frontendFinished = true;
-	createZip();
-});
 };
 
 
 
-Promise.all(promiseArray).then(files => { 
-//if (files.fileName === "backend.war"){
 
-console.log('files.path' ,files.path);
-console.log('files.fileName', files.fileName);
 
-	backendStream = fs.createReadStream(files.path);
-zip.file(files.fileName, backendStream);
 
+Promise.all(promiseArray).then(files => {
+console.log('in promise.all: promiseArray', promiseArray); 
+	files.forEach(file => {
+ 		if (file.zipFileName === 'backend.war'){
+			backendStream = fs.createReadStream(file.path);
+			zip.file(file.zipFileName, backendStream);
+		}
+		if(file.zipFileName === 'frontend'){
+			console.log('zipFileName: frontend', file.zipFileName);
+			const stream = fsReaddir(file.path)
+				.on('error', function(err) {
+  					console.log('error:', err);
+				}).on('data', function(data){
+					for (let i=0; i<data.length; i++) {
+					const frontendStream = fs.createReadStream(data[i]);
+					zip.file(data[i], frontendStream);
+					}
+
+				})
+
+		}
+
+
+	});
 
 zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
 	console.log('explorviz-builds.zip written.');
     res.download('explorviz-builds.zip');
 }); 
-	}).catch(function(error) {let response = 
+}).catch(function(error) {let response = 
           'There was an error during your build. ' +
           'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
           'and add the following information: ' + error;
@@ -243,24 +226,6 @@ zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWrite
 })
 
 
-
-
-
-// function createZip(){
-// 	console.log('frontendFinished', frontendFinished);
-// 	console.log('backendFinished', backendFinished);
-
-// //create zip and download it
-//     zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
-//     // JSZip generates a readable stream with a "end" event,
-//     // but is piped here in a writable stream which emits a "finish" event.
-//     console.log("explorviz-builds.zip written.");
-//     res.download('explorviz-builds.zip');
-// }); 
-
-
-// };
-
 });
 
 
-- 
GitLab