const fs = require('fs') //const SamlStrategy = require('passport-saml').Strategy const dbconn = require('./dbconn') const methods = require('./methods') // pwd encryption //const bcrypt = require('bcryptjs'); //const saltRounds = 10; //const salt = 64; // salt length // forgot pwd const async = require('async') //const crypto = require('crypto') //const mailer = require('./mailer') const helpers = require('./helpers') const pictSizeLimit = 1000000 // 1 MB const axios = require('axios') module.exports = function (app) { // ======== APP ROUTES - PROJECT ==================== var lang = 'DE' app.get('/mailinglists', function (req, res) { async.waterfall([ function(done) { methods.getAllMailinglists(function(mailinglistOverview, err) { if (!err) { done(err, mailinglistOverview) } }) }, // create JSON object of mailinglists for front-end function(mailinglistOverview, done) { var allMailingLists = [] // JSON object for (let i = 0; i < mailinglistOverview.length; i++) { // add data to JSON object allMailingLists.push({ id: mailinglistOverview[i].id, name: mailinglistOverview[i].name, src: mailinglistOverview[i].src, projectstatus: mailinglistOverview[i].projectstatus, project_title: mailinglistOverview[i].project_title, keywords: mailinglistOverview[i].keywords }); } res.render(lang+'/project/mailinglists', { isUserAuthenticated: req.isAuthenticated(), user: req.user, mailinglists: allMailingLists }); } ]) }) app.get('/project_', function (req, res) { async.waterfall([ // get all projects from projectdb function(done) { methods.getAllProjects(function(projectsOverview, err) { if (!err) { done(err, projectsOverview) } }) }, // create JSON object for front-end function(projectsOverview, done) { var activeProjects = [] var nonActiveProjects = [] for (var i = 0; i < projectsOverview.length; i++) { var project = { id: projectsOverview[i].id, logo: projectsOverview[i].logo, akronym: projectsOverview[i].pname, title: projectsOverview[i].title, summary: projectsOverview[i].onelinesummary, category: projectsOverview[i].category, cp: projectsOverview[i].contact_email, gitlab: projectsOverview[i].gitlab } if (projectsOverview[i].projectstatus == 0) { nonActiveProjects.push(project) } else if (projectsOverview[i].projectstatus == 1) { activeProjects.push(project) } } // render the page if (req.isAuthenticated()) { res.render(lang+'/project/projects', { isUserAuthenticated: true, nonActive: nonActiveProjects, active: activeProjects }); } else { res.render(lang+'/project/projects', { isUserAuthenticated: false, nonActive: nonActiveProjects, active: activeProjects }); } } ]) }) app.get('/', function (req, res) { res.render(lang+'/project/project-simplified', { isUserAuthenticated: req.isAuthenticated(), user: req.user }); }) app.get('/addprojectoverview', function (req, res) { if (req.isAuthenticated()) { res.render(lang+'/project/addProjectOverview') } else { res.redirect('/login') } }) app.post('/addprojectoverview__', function (req, res) { if (req.isAuthenticated()) { var wiki = 0 if (req.body.wiki) wiki = 1 var projectTerm = req.body.termForm + " - " + req.body.termTo var projectOverviewData = { pname: req.body.pname, title: req.body.title, onelinesummary: req.body.summary, category: req.body.category, logo: req.body.logo, gitlab: req.body.gitlabURL, wiki: wiki, overview: req.body.overview, question: req.body.question, approach: req.body.approach, result: req.body.result, keywords: req.body.keywords, announcement: req.body.announcement, term: projectTerm, further_details: req.body.furtherDetails, website: req.body.website, src: req.body.src, caption: req.body.caption, contact_lastname: req.body.contactName, contact_email: req.body.contactEmail, leader_lastname: req.body.leaderName, leader_email: req.body.leaderEmail } methods.addProjectOverview(projectOverviewData, function(err){ if (err) { //req.flash('error', "Failed") req.flash('error', "Fehlgeschlagen") res.redirect('/addProjectOverview'); } else { req.flash('success', 'Your project has been created.') res.redirect('/project'); } }) } }) app.post('/addprojectoverview', function (req, res) { if (req.isAuthenticated()) { var wiki = 0 if (req.body.wiki) wiki = 1 var projectLogo = req.files.logo var projectPicture = req.files.src var projectLogoPath, projectPicturePath if (projectLogo) { // raise error if size limit is exceeded if (projectLogo.size === pictSizeLimit) { req.flash('error', 'Projektlogo exceeds 1 MB'); res.redirect('/addprojectoverview'); } else { // TEST PATH FOR DEVELOPMENT (LOCALHOST) projectLogoPath = './folder-in-server-to-save-projektlogo/'+req.body.pname+'/'+projectLogo.name // PATH FOR TEST/LIVE SERVER // var projectLogoPath = to-be-defined } } if (projectPicture) { // raise error if size limit is exceeded if (projectPicture.size === pictSizeLimit) { req.flash('error', 'Projektbild exceeds 1 MB'); res.redirect('/addprojectoverview'); } else { // TEST PATH FOR DEVELOPMENT (LOCALHOST) projectPicturePath = './folder-in-server-to-save-projektbild/'+req.body.pname+'/'+projectPicture.name // PATH FOR TEST/LIVE SERVER // var projectPicturePath = to-be-defined } } var projectTerm = req.body.termForm + " - " + req.body.termTo var projectOverviewData = { pname: req.body.pname, title: req.body.title, onelinesummary: req.body.summary, category: req.body.category, logo: projectLogoPath, gitlab: req.body.gitlabURL, wiki: wiki, overview: req.body.overview, question: req.body.question, approach: req.body.approach, result: req.body.result, keywords: req.body.keywords, announcement: req.body.announcement, term: projectTerm, further_details: req.body.furtherDetails, website: req.body.website, src: projectPicturePath, caption: req.body.caption, contact_lastname: req.body.contactName, contact_email: req.body.contactEmail, leader_lastname: req.body.leaderName, leader_email: req.body.leaderEmail } // save pictures if (projectLogo) { projectLogo.mv(projectLogoPath, function(err) { if (err) { console.error(err) res.status(500).render(lang+'/500', { error: err }) } }); } if (projectPicture) { projectPicture.mv(projectPicturePath, function(err) { if (err) { console.error(err) res.status(500).render(lang+'/500', { error: err }) } }); } /* RS: Temporary solution while Project DB is still in early phase. When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction. */ var userId // todo: make this global variable? async.waterfall([ // get userId by email from userdb function(done) { methods.getUserIdByEmail(req.user.email, function(id, err) { if (!err) { userId = id done(err) } }) }, // add project overview function(done) { methods.addProjectOverview(projectOverviewData, function(data, err){ if (err) { res.status(500).render(lang+'/500', { error: err }) } else { done(err, data.insertId) } }) }, // assign the created overview to logged-in user function(projectOverviewId, done) { var userProjectRoleData = { project_id: projectOverviewId, user_id: userId, role_id: 3 // OVERVIEW_CREATOR } methods.addUserProjectRole(userProjectRoleData, function(userProjects, err) { if (err) { //req.flash('error', "Failed") req.flash('error', "Fehlgeschlagen") res.redirect('/addProjectOverview'); } else { req.flash('success', 'Your project has been created.') res.redirect('/project'); } }) } ]) } }) app.get('/updateprojectoverview', function (req, res) { // only their own project }) app.post('/updateprojectoverview', function (req, res) { // only their own project }) app.get('/projectoverview', function(req, res){ async.waterfall([ function(done) { methods.getProjectOverviewById(req.query.projectID, function(projectOverview, err) { if (!err) { done(err, projectOverview) } }) }, function(projectOverview,done){ methods.getProjectImagesById(req.query.projectID, function(projectImages, err) { if (!err) { done(err, projectImages, projectOverview) } }) }, // render projectOverview page function(projectImages, projectOverview, done) { console.log(projectImages) partnerWebsites = helpers.stringToArray(projectOverview[0].partner_website) partnerNames = helpers.stringToArray(projectOverview[0].partner_name) awardSites = helpers.stringToArray(projectOverview[0].award_website) awardNames = helpers.stringToArray(projectOverview[0].award_name) sponsorWebsites = helpers.stringToArray(projectOverview[0].sponsor_website) sponsorImgs = helpers.stringToArray(projectOverview[0].sponsor_img) sponsorNames = helpers.stringToArray(projectOverview[0].sponsor_name) res.render(lang+'/project/projectOverview', { isUserAuthenticated: req.isAuthenticated(), user: req.user, projectOV: projectOverview, projectImgs: projectImages, partnerWS: partnerWebsites, partnerN: partnerNames, awardWS: awardSites, awardN: awardNames, sponsorWS: sponsorWebsites, sponsorIMG: sponsorImgs, sponsorN: sponsorNames }); } ]) }) async function getProjectsFromGitlab(perPage, idAfter) { // public projects return await axios.get('https://transfer.hft-stuttgart.de/gitlab/api/v4/projects?visibility=public&pagination=keyset&per_page='+ perPage+'&order_by=id&sort=asc&id_after='+idAfter) } // Projektdaten app.get('/projektdaten', async function(req, res){ let projectArr = [] let isProject = true let firstId = 0 while (isProject == true) { let projects = await getProjectsFromGitlab(10, firstId) let projectData = projects.data if (projectData.length == 0) { isProject = false } else { for(let i = 0; i < projectData.length; i++){ // skip template project if (projectData[i].name == "template_gitlab_page") { continue } // only repo if (!projectData[i].tag_list.includes('website')) { // M4_LAB logo for all projects that do not have logo if (projectData[i].avatar_url == null) { projectData[i].avatar_url = "https://m4lab.hft-stuttgart.de/img/footer/M4_LAB_LOGO_Graustufen.png" } // for all projects that have no description if (projectData[i].description == "") { projectData[i].description = "- no description -" } let project = { logo: projectData[i].avatar_url, name: projectData[i].name, weburl: projectData[i].web_url, desc: projectData[i].description, keywords: projectData[i].tag_list } projectArr.push(project) } } firstId = projectData[projectData.length-1].id } } res.render(lang+'/project/projectList', { project: projectArr }) }) // Projektinformationen app.get('/projektinformationen', async function(req, res){ let pagesArr = [] let isProject = true let firstId = 0 while (isProject == true) { let projects = await getProjectsFromGitlab(10, firstId) let projectData = projects.data if (projectData.length == 0) { isProject = false } else { for(let i = 0; i < projectData.length; i++){ // skip template project if (projectData[i].name == "template_gitlab_page") { continue } // websites if (projectData[i].tag_list.includes('website')) { // M4_LAB logo for all projects that do not have logo if (projectData[i].avatar_url == null) { projectData[i].avatar_url = "https://m4lab.hft-stuttgart.de/img/footer/M4_LAB_LOGO_Graustufen.png" } // for all projects that have no description if (projectData[i].description == "") { projectData[i].description = "- no description -" } // customize website name if (projectData[i].name == "Visualization") { projectData[i].web_url = "https://transfer.hft-stuttgart.de/pages/visualization" } else if (projectData[i].name == "IN-Source") { projectData[i].web_url = "https://transfer.hft-stuttgart.de/pages/INsource" } else if (projectData[i].name == "3DS_Visualization_Cesium") { projectData[i].web_url = "https://transfer.hft-stuttgart.de/pages/3ds_visualization_cesium" } else { projectData[i].web_url = "https://transfer.hft-stuttgart.de/pages/"+projectData[i].name } // remove 'website' from tag list const index = projectData[i].tag_list.indexOf('website'); if (index > -1) { projectData[i].tag_list.splice(index, 1); } // fill in pagesArr let pages = { logo: projectData[i].avatar_url, name: projectData[i].name, weburl: projectData[i].web_url, desc: projectData[i].description, keywords: projectData[i].tag_list } pagesArr.push(pages) } } firstId = projectData[projectData.length-1].id } } res.render(lang+'/project/pagesList', { pages: pagesArr }) }) };