From 42c958734d9b0041b790e600cbe51659e3bc3607 Mon Sep 17 00:00:00 2001 From: Swapnil Sengupta Date: Wed, 25 Nov 2020 14:04:39 +0530 Subject: [PATCH 1/5] Refactor examples.js to use async/await --- server/scripts/examples.js | 73 +++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/server/scripts/examples.js b/server/scripts/examples.js index 32c9f59530..d422dfe717 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -46,7 +46,7 @@ mongoose.connection.on('error', () => { process.exit(1); }); -function getCategories() { +async function getCategories() { const categories = []; const options = { url: 'https://api.github.com/repos/processing/p5.js-website/contents/src/data/examples/en', @@ -57,7 +57,8 @@ function getCategories() { }, json: true }; - return rp(options).then((res) => { + try { + const res = await rp(options); res.forEach((metadata) => { let category = ''; for (let j = 1; j < metadata.name.split('_').length; j += 1) { @@ -65,15 +66,14 @@ function getCategories() { } categories.push({ url: metadata.url, name: category.trim() }); }); - return categories; - }).catch((err) => { - throw err; - }); + } catch (error) { + throw error; + } } function getSketchesInCategories(categories) { - return Q.all(categories.map((category) => { + return Q.all(categories.map(async (category) => { const options = { url: `${category.url.replace('?ref=main', '')}`, method: 'GET', @@ -83,8 +83,8 @@ function getSketchesInCategories(categories) { }, json: true }; - - return rp(options).then((res) => { + try { + const res = await rp(options); const projectsInOneCategory = []; res.forEach((example) => { let projectName; @@ -103,14 +103,14 @@ function getSketchesInCategories(categories) { } }); return projectsInOneCategory; - }).catch((err) => { - throw err; - }); + } catch (error) { + throw error; + } })); } function getSketchContent(projectsInAllCategories) { - return Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map((project) => { + return Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map(async (project) => { const options = { url: `${project.sketchUrl.replace('?ref=main', '')}`, method: 'GET', @@ -119,8 +119,8 @@ function getSketchContent(projectsInAllCategories) { Authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}` } }; - - return rp(options).then((res) => { + try { + const res = await rp(options); const noNumberprojectName = project.projectName.replace(/(\d+)/g, ''); if (noNumberprojectName === 'Instance Mode: Instance Container ') { for (let i = 0; i < 4; i += 1) { @@ -134,9 +134,9 @@ function getSketchContent(projectsInAllCategories) { project.sketchContent = res; } return project; - }).catch((err) => { - throw err; - }); + } catch (error) { + throw error; + } })))); } @@ -183,14 +183,13 @@ async function addAssetsToProject(assets, response, project) { }; // a function to await for the response that contains the content of asset file - const doRequest = function (optionsAsset) { - return new Promise(((resolve, reject) => { - rp(optionsAsset).then((res) => { - resolve(res); - }).catch((err) => { - reject(err); - }); - })); + const doRequest = async (optionsAsset) => { + try { + const res = await rp(optionsAsset); + return res; + } catch (error) { + throw error; + } }; assetContent = await doRequest(assetOptions); @@ -225,7 +224,7 @@ async function addAssetsToProject(assets, response, project) { } -function createProjectsInP5user(projectsInAllCategories) { +async function createProjectsInP5user(projectsInAllCategories) { const options = { url: 'https://api.github.com/repos/processing/p5.js-website/contents/src/data/examples/assets', method: 'GET', @@ -236,7 +235,8 @@ function createProjectsInP5user(projectsInAllCategories) { json: true }; - rp(options).then((res) => { + try { + const res = await rp(options); User.findOne({ username: 'p5' }, (err, user) => { if (err) throw err; @@ -347,14 +347,14 @@ function createProjectsInP5user(projectsInAllCategories) { process.exit(); }); }); - }).catch((err) => { - throw err; - }); + } catch (error) { + throw error; + } } function getp5User() { console.log('Getting p5 user'); - User.findOne({ username: 'p5' }, (err, user) => { + User.findOne({ username: 'p5' }, async (err, user) => { if (err) throw err; let p5User = user; @@ -380,10 +380,11 @@ function getp5User() { }); }); - return getCategories() - .then(getSketchesInCategories) - .then(getSketchContent) - .then(createProjectsInP5user); + const categories = await getCategories(); + const sketchesInCategories = await getSketchesInCategories(categories); + const sketchContent = await getSketchContent(sketchesInCategories); + const projects = createProjectsInP5user(sketchContent); + return projects; }); } From e75e5b3851d7b73c06f1fc8e480052cec0754ed5 Mon Sep 17 00:00:00 2001 From: Swapnil Sengupta Date: Thu, 26 Nov 2020 01:44:00 +0530 Subject: [PATCH 2/5] Remove dependency on async/eachSeries --- server/scripts/examples.js | 200 ++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 102 deletions(-) diff --git a/server/scripts/examples.js b/server/scripts/examples.js index d422dfe717..a33d3942e4 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -3,7 +3,6 @@ import Q from 'q'; import mongoose from 'mongoose'; import objectID from 'bson-objectid'; import shortid from 'shortid'; -import eachSeries from 'async/eachSeries'; import User from '../models/user'; import Project from '../models/project'; @@ -240,112 +239,109 @@ async function createProjectsInP5user(projectsInAllCategories) { User.findOne({ username: 'p5' }, (err, user) => { if (err) throw err; - eachSeries(projectsInAllCategories, (projectsInOneCategory, categoryCallback) => { - eachSeries(projectsInOneCategory, async (project, projectCallback) => { - let newProject; - const a = objectID().toHexString(); - const b = objectID().toHexString(); - const c = objectID().toHexString(); - const r = objectID().toHexString(); - const noNumberprojectName = project.projectName.replace(/(\d+)/g, ''); - if (noNumberprojectName === 'Instance Mode: Instance Container ') { - newProject = new Project({ - name: project.projectName, - user: user._id, - files: [ - { - name: 'root', - id: r, - _id: r, - children: [a, b, c], - fileType: 'folder' - }, - { - name: 'sketch.js', - content: '// Instance Mode: Instance Container, please check its index.html file', - id: a, - _id: a, - fileType: 'file', - children: [] - }, - { - name: 'index.html', - content: project.sketchContent, - isSelectedFile: true, - id: b, - _id: b, - fileType: 'file', - children: [] - }, - { - name: 'style.css', - content: defaultCSS, - id: c, - _id: c, - fileType: 'file', - children: [] - } - ], - _id: shortid.generate() - }); - } else { - newProject = new Project({ - name: project.projectName, - user: user._id, - files: [ - { - name: 'root', - id: r, - _id: r, - children: [a, b, c], - fileType: 'folder' - }, - { - name: 'sketch.js', - content: project.sketchContent, - id: a, - _id: a, - isSelectedFile: true, - fileType: 'file', - children: [] - }, - { - name: 'index.html', - content: defaultHTML, - id: b, - _id: b, - fileType: 'file', - children: [] - }, - { - name: 'style.css', - content: defaultCSS, - id: c, - _id: c, - fileType: 'file', - children: [] - } - ], - _id: shortid.generate() - }); - } + Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map(async (project) => { + let newProject; + const a = objectID().toHexString(); + const b = objectID().toHexString(); + const c = objectID().toHexString(); + const r = objectID().toHexString(); + const noNumberprojectName = project.projectName.replace(/(\d+)/g, ''); + if (noNumberprojectName === 'Instance Mode: Instance Container ') { + newProject = new Project({ + name: project.projectName, + user: user._id, + files: [ + { + name: 'root', + id: r, + _id: r, + children: [a, b, c], + fileType: 'folder' + }, + { + name: 'sketch.js', + content: '// Instance Mode: Instance Container, please check its index.html file', + id: a, + _id: a, + fileType: 'file', + children: [] + }, + { + name: 'index.html', + content: project.sketchContent, + isSelectedFile: true, + id: b, + _id: b, + fileType: 'file', + children: [] + }, + { + name: 'style.css', + content: defaultCSS, + id: c, + _id: c, + fileType: 'file', + children: [] + } + ], + _id: shortid.generate() + }); + } else { + newProject = new Project({ + name: project.projectName, + user: user._id, + files: [ + { + name: 'root', + id: r, + _id: r, + children: [a, b, c], + fileType: 'folder' + }, + { + name: 'sketch.js', + content: project.sketchContent, + id: a, + _id: a, + isSelectedFile: true, + fileType: 'file', + children: [] + }, + { + name: 'index.html', + content: defaultHTML, + id: b, + _id: b, + fileType: 'file', + children: [] + }, + { + name: 'style.css', + content: defaultCSS, + id: c, + _id: c, + fileType: 'file', + children: [] + } + ], + _id: shortid.generate() + }); + } - const assetsInProject = project.sketchContent.match(/assets\/[\w-]+\.[\w]*/g) - || project.sketchContent.match(/asset\/[\w-]*/g) || []; + const assetsInProject = project.sketchContent.match(/assets\/[\w-]+\.[\w]*/g) + || project.sketchContent.match(/asset\/[\w-]*/g) || []; + try { await addAssetsToProject(assetsInProject, res, newProject); + } catch (error) { + throw error; + } - newProject.save((saveErr, savedProject) => { - if (saveErr) throw saveErr; - console.log(`Created a new project in p5 user: ${savedProject.name}`); - projectCallback(); - }); - }, (categoryErr) => { - categoryCallback(); + newProject.save((saveErr, savedProject) => { + if (saveErr) throw saveErr; + console.log(`Created a new project in p5 user: ${savedProject.name}`); }); - }, (examplesErr) => { - process.exit(); - }); + })))); }); } catch (error) { throw error; From 65608e2b47a8014d559431cf83683790702749f1 Mon Sep 17 00:00:00 2001 From: Swapnil Sengupta Date: Thu, 3 Dec 2020 00:16:53 +0530 Subject: [PATCH 3/5] Add process.exit() --- server/scripts/examples.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/scripts/examples.js b/server/scripts/examples.js index a33d3942e4..794f1bd9f5 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -341,7 +341,8 @@ async function createProjectsInP5user(projectsInAllCategories) { if (saveErr) throw saveErr; console.log(`Created a new project in p5 user: ${savedProject.name}`); }); - })))); + })))) + .then(() => process.exit()); }); } catch (error) { throw error; From 943f966c6bf74d96d9c5878bd14a70a2677f3019 Mon Sep 17 00:00:00 2001 From: Swapnil Sengupta Date: Thu, 3 Dec 2020 13:09:28 +0530 Subject: [PATCH 4/5] Refactor mongoose queries to async/await --- server/scripts/examples.js | 245 ++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 127 deletions(-) diff --git a/server/scripts/examples.js b/server/scripts/examples.js index 794f1bd9f5..8463b89021 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -236,124 +236,117 @@ async function createProjectsInP5user(projectsInAllCategories) { try { const res = await rp(options); - User.findOne({ username: 'p5' }, (err, user) => { - if (err) throw err; - - Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map(async (project) => { - let newProject; - const a = objectID().toHexString(); - const b = objectID().toHexString(); - const c = objectID().toHexString(); - const r = objectID().toHexString(); - const noNumberprojectName = project.projectName.replace(/(\d+)/g, ''); - if (noNumberprojectName === 'Instance Mode: Instance Container ') { - newProject = new Project({ - name: project.projectName, - user: user._id, - files: [ - { - name: 'root', - id: r, - _id: r, - children: [a, b, c], - fileType: 'folder' - }, - { - name: 'sketch.js', - content: '// Instance Mode: Instance Container, please check its index.html file', - id: a, - _id: a, - fileType: 'file', - children: [] - }, - { - name: 'index.html', - content: project.sketchContent, - isSelectedFile: true, - id: b, - _id: b, - fileType: 'file', - children: [] - }, - { - name: 'style.css', - content: defaultCSS, - id: c, - _id: c, - fileType: 'file', - children: [] - } - ], - _id: shortid.generate() - }); - } else { - newProject = new Project({ - name: project.projectName, - user: user._id, - files: [ - { - name: 'root', - id: r, - _id: r, - children: [a, b, c], - fileType: 'folder' - }, - { - name: 'sketch.js', - content: project.sketchContent, - id: a, - _id: a, - isSelectedFile: true, - fileType: 'file', - children: [] - }, - { - name: 'index.html', - content: defaultHTML, - id: b, - _id: b, - fileType: 'file', - children: [] - }, - { - name: 'style.css', - content: defaultCSS, - id: c, - _id: c, - fileType: 'file', - children: [] - } - ], - _id: shortid.generate() - }); - } - - const assetsInProject = project.sketchContent.match(/assets\/[\w-]+\.[\w]*/g) - || project.sketchContent.match(/asset\/[\w-]*/g) || []; + const user = await User.findOne({ username: 'p5' }).exec(); + Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map(async (project) => { + let newProject; + const a = objectID().toHexString(); + const b = objectID().toHexString(); + const c = objectID().toHexString(); + const r = objectID().toHexString(); + const noNumberprojectName = project.projectName.replace(/(\d+)/g, ''); + if (noNumberprojectName === 'Instance Mode: Instance Container ') { + newProject = new Project({ + name: project.projectName, + user: user._id, + files: [ + { + name: 'root', + id: r, + _id: r, + children: [a, b, c], + fileType: 'folder' + }, + { + name: 'sketch.js', + content: '// Instance Mode: Instance Container, please check its index.html file', + id: a, + _id: a, + fileType: 'file', + children: [] + }, + { + name: 'index.html', + content: project.sketchContent, + isSelectedFile: true, + id: b, + _id: b, + fileType: 'file', + children: [] + }, + { + name: 'style.css', + content: defaultCSS, + id: c, + _id: c, + fileType: 'file', + children: [] + } + ], + _id: shortid.generate() + }); + } else { + newProject = new Project({ + name: project.projectName, + user: user._id, + files: [ + { + name: 'root', + id: r, + _id: r, + children: [a, b, c], + fileType: 'folder' + }, + { + name: 'sketch.js', + content: project.sketchContent, + id: a, + _id: a, + isSelectedFile: true, + fileType: 'file', + children: [] + }, + { + name: 'index.html', + content: defaultHTML, + id: b, + _id: b, + fileType: 'file', + children: [] + }, + { + name: 'style.css', + content: defaultCSS, + id: c, + _id: c, + fileType: 'file', + children: [] + } + ], + _id: shortid.generate() + }); + } - try { - await addAssetsToProject(assetsInProject, res, newProject); - } catch (error) { - throw error; - } + const assetsInProject = project.sketchContent.match(/assets\/[\w-]+\.[\w]*/g) + || project.sketchContent.match(/asset\/[\w-]*/g) || []; - newProject.save((saveErr, savedProject) => { - if (saveErr) throw saveErr; - console.log(`Created a new project in p5 user: ${savedProject.name}`); - }); - })))) - .then(() => process.exit()); - }); + try { + await addAssetsToProject(assetsInProject, res, newProject); + const savedProject = await newProject.save(); + console.log(`Created a new project in p5 user: ${savedProject.name}`); + } catch (error) { + throw error; + } + })))) + .then(() => process.exit()); } catch (error) { throw error; } } -function getp5User() { +async function getp5User() { console.log('Getting p5 user'); - User.findOne({ username: 'p5' }, async (err, user) => { - if (err) throw err; - + try { + const user = await User.findOne({ username: 'p5' }).exec(); let p5User = user; if (!p5User) { p5User = new User({ @@ -361,28 +354,26 @@ function getp5User() { email: process.env.EXAMPLE_USER_EMAIL, password: process.env.EXAMPLE_USER_PASSWORD }); - p5User.save((saveErr) => { - if (saveErr) throw saveErr; - console.log(`Created a user p5 ${p5User}`); - }); + await p5User.save(); + console.log(`Created a user p5 ${p5User}`); } - - Project.find({ user: p5User._id }, (projectsErr, projects) => { - // if there are already some sketches, delete them - console.log('Deleting old projects...'); - projects.forEach((project) => { - Project.remove({ _id: project._id }, (removeErr) => { - if (removeErr) throw removeErr; - }); - }); + const projects = await Project.find({ user: p5User._id }).exec(); + console.log('Deleting old projects...'); + projects.forEach(async (project) => { + try { + await Project.deleteOne({ _id: project._id }); + } catch (error) { + throw error; + } }); - const categories = await getCategories(); const sketchesInCategories = await getSketchesInCategories(categories); const sketchContent = await getSketchContent(sketchesInCategories); - const projects = createProjectsInP5user(sketchContent); - return projects; - }); + const projectsInUser = createProjectsInP5user(sketchContent); + return projectsInUser; + } catch (error) { + throw error; + } } getp5User(); From 361ee9dfc1744cb2706de445714aeebebcc89581 Mon Sep 17 00:00:00 2001 From: Cassie Tarakajian Date: Fri, 4 Dec 2020 13:48:05 -0500 Subject: [PATCH 5/5] [#1693] Remove promise for process.exit() --- server/scripts/examples.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/scripts/examples.js b/server/scripts/examples.js index 8463b89021..2b31c4dcbf 100644 --- a/server/scripts/examples.js +++ b/server/scripts/examples.js @@ -237,7 +237,7 @@ async function createProjectsInP5user(projectsInAllCategories) { try { const res = await rp(options); const user = await User.findOne({ username: 'p5' }).exec(); - Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map(async (project) => { + await Q.all(projectsInAllCategories.map(projectsInOneCategory => Q.all(projectsInOneCategory.map(async (project) => { let newProject; const a = objectID().toHexString(); const b = objectID().toHexString(); @@ -336,8 +336,8 @@ async function createProjectsInP5user(projectsInAllCategories) { } catch (error) { throw error; } - })))) - .then(() => process.exit()); + })))); + process.exit(); } catch (error) { throw error; }