Skip to content

Commit 8f60b35

Browse files
committed
Merge branch 'feature/error-output' of https://github.com/ghalestrilo/p5.js-web-editor into feature/error-output
2 parents c942753 + a1accc1 commit 8f60b35

20 files changed

+591
-107
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ localhost.key
1919
privkey.pem
2020

2121
storybook-static
22+
duplicates.json

client/i18n.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const fallbackLng = ['en-US'];
77
const availableLanguages = ['en-US', 'es-419'];
88

99
const options = {
10-
loadPath: 'locales/{{lng}}/translations.json',
10+
loadPath: '/locales/{{lng}}/translations.json',
1111
requestOptions: { // used for fetch, can also be a function (payload) => ({ method: 'GET' })
1212
mode: 'no-cors'
1313
},

client/modules/IDE/actions/project.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import {
1616
import { clearState, saveState } from '../../../persistState';
1717

1818
const ROOT_URL = getConfig('API_URL');
19+
const S3_BUCKET_URL_BASE = getConfig('S3_BUCKET_URL_BASE');
20+
const S3_BUCKET = getConfig('S3_BUCKET');
1921

2022
export function setProject(project) {
2123
return {
@@ -287,7 +289,7 @@ export function cloneProject(id) {
287289

288290
// duplicate all files hosted on S3
289291
each(newFiles, (file, callback) => {
290-
if (file.url && file.url.includes('amazonaws')) {
292+
if (file.url && (file.url.includes(S3_BUCKET_URL_BASE) || file.url.includes(S3_BUCKET))) {
291293
const formParams = {
292294
url: file.url
293295
};

package-lock.json

Lines changed: 13 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "p5.js-web-editor",
3-
"version": "1.0.5",
3+
"version": "1.0.6",
44
"description": "The web editor for p5.js.",
55
"scripts": {
66
"clean": "rimraf dist",
@@ -200,7 +200,7 @@
200200
"react-helmet": "^5.1.3",
201201
"react-hot-loader": "^4.12.19",
202202
"react-i18next": "^11.5.0",
203-
"react-redux": "^5.1.2",
203+
"react-redux": "^7.2.0",
204204
"react-router": "^3.2.5",
205205
"react-split-pane": "^0.1.89",
206206
"react-tabs": "^2.3.1",

server/config/passport.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ passport.deserializeUser((id, done) => {
2424
* Sign in using Email/Username and Password.
2525
*/
2626
passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
27-
User.findByMailOrName(email.toLowerCase())
27+
User.findByEmailOrUsername(email)
2828
.then((user) => { // eslint-disable-line consistent-return
2929
if (!user) {
3030
return done(null, false, { msg: `Email ${email} not found.` });
@@ -43,7 +43,7 @@ passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, don
4343
* Authentificate using Basic Auth (Username + Api Key)
4444
*/
4545
passport.use(new BasicStrategy((userid, key, done) => {
46-
User.findOne({ username: userid }, (err, user) => { // eslint-disable-line consistent-return
46+
User.findByUsername(userid, (err, user) => { // eslint-disable-line consistent-return
4747
if (err) { return done(err); }
4848
if (!user) { return done(null, false); }
4949
user.findMatchingKey(key, (innerErr, isMatch, keyDocument) => {
@@ -98,9 +98,7 @@ passport.use(new GitHubStrategy({
9898
const emails = getVerifiedEmails(profile.emails);
9999
const primaryEmail = getPrimaryEmail(profile.emails);
100100

101-
User.findOne({
102-
email: { $in: emails },
103-
}, (findByEmailErr, existingEmailUser) => {
101+
User.findByEmail(emails, (findByEmailErr, existingEmailUser) => {
104102
if (existingEmailUser) {
105103
existingEmailUser.email = existingEmailUser.email || primaryEmail;
106104
existingEmailUser.github = profile.id;
@@ -141,11 +139,9 @@ passport.use(new GoogleStrategy({
141139

142140
const primaryEmail = profile._json.emails[0].value;
143141

144-
User.findOne({
145-
email: primaryEmail,
146-
}, (findByEmailErr, existingEmailUser) => {
142+
User.findByEmail(primaryEmail, (findByEmailErr, existingEmailUser) => {
147143
let username = profile._json.emails[0].value.split('@')[0];
148-
User.findOne({ username }, (findByUsernameErr, existingUsernameUser) => {
144+
User.findByUsername(username, (findByUsernameErr, existingUsernameUser) => {
149145
if (existingUsernameUser) {
150146
const adj = friendlyWords.predicates[Math.floor(Math.random() * friendlyWords.predicates.length)];
151147
username = slugify(`${username} ${adj}`);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export const getObjectKey = jest.mock();
22
export const deleteObjectsFromS3 = jest.fn();
33
export const signS3 = jest.fn();
4-
export const copyObjectInS3 = jest.fn();
4+
export const copyObjectInS3RequestHandler = jest.fn();
55
export const listObjectsInS3ForUser = jest.fn();

server/controllers/aws.controller.js

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function getExtension(filename) {
2828
export function getObjectKey(url) {
2929
const urlArray = url.split('/');
3030
let objectKey;
31-
if (urlArray.length === 6) {
31+
if (urlArray.length === 5) {
3232
const key = urlArray.pop();
3333
const userId = urlArray.pop();
3434
objectKey = `${userId}/${key}`;
@@ -98,24 +98,72 @@ export function signS3(req, res) {
9898
res.json(result);
9999
}
100100

101-
export function copyObjectInS3(req, res) {
101+
export function copyObjectInS3(url, userId) {
102+
return new Promise((resolve, reject) => {
103+
const objectKey = getObjectKey(url);
104+
const fileExtension = getExtension(objectKey);
105+
const newFilename = uuid.v4() + fileExtension;
106+
const headParams = {
107+
Bucket: `${process.env.S3_BUCKET}`,
108+
Key: `${objectKey}`
109+
};
110+
client.s3.headObject(headParams, (headErr) => {
111+
if (headErr) {
112+
reject(new Error(`Object with key ${process.env.S3_BUCKET}/${objectKey} does not exist.`));
113+
return;
114+
}
115+
const params = {
116+
Bucket: `${process.env.S3_BUCKET}`,
117+
CopySource: `${process.env.S3_BUCKET}/${objectKey}`,
118+
Key: `${userId}/${newFilename}`,
119+
ACL: 'public-read'
120+
};
121+
const copy = client.copyObject(params);
122+
copy.on('err', (err) => {
123+
reject(err);
124+
});
125+
copy.on('end', (data) => {
126+
resolve(`${s3Bucket}${userId}/${newFilename}`);
127+
});
128+
});
129+
});
130+
}
131+
132+
export function copyObjectInS3RequestHandler(req, res) {
102133
const { url } = req.body;
103-
const objectKey = getObjectKey(url);
104-
const fileExtension = getExtension(objectKey);
105-
const newFilename = uuid.v4() + fileExtension;
106-
const userId = req.user.id;
107-
const params = {
108-
Bucket: `${process.env.S3_BUCKET}`,
109-
CopySource: `${process.env.S3_BUCKET}/${objectKey}`,
110-
Key: `${userId}/${newFilename}`,
111-
ACL: 'public-read'
112-
};
113-
const copy = client.copyObject(params);
114-
copy.on('err', (err) => {
115-
console.log(err);
134+
copyObjectInS3(url, req.user.id).then((newUrl) => {
135+
res.json({ url: newUrl });
116136
});
117-
copy.on('end', (data) => {
118-
res.json({ url: `${s3Bucket}${userId}/${newFilename}` });
137+
}
138+
139+
export function moveObjectToUserInS3(url, userId) {
140+
return new Promise((resolve, reject) => {
141+
const objectKey = getObjectKey(url);
142+
const fileExtension = getExtension(objectKey);
143+
const newFilename = uuid.v4() + fileExtension;
144+
const headParams = {
145+
Bucket: `${process.env.S3_BUCKET}`,
146+
Key: `${objectKey}`
147+
};
148+
client.s3.headObject(headParams, (headErr) => {
149+
if (headErr) {
150+
reject(new Error(`Object with key ${process.env.S3_BUCKET}/${objectKey} does not exist.`));
151+
return;
152+
}
153+
const params = {
154+
Bucket: `${process.env.S3_BUCKET}`,
155+
CopySource: `${process.env.S3_BUCKET}/${objectKey}`,
156+
Key: `${userId}/${newFilename}`,
157+
ACL: 'public-read'
158+
};
159+
const move = client.moveObject(params);
160+
move.on('err', (err) => {
161+
reject(err);
162+
});
163+
move.on('end', (data) => {
164+
resolve(`${s3Bucket}${userId}/${newFilename}`);
165+
});
166+
});
119167
});
120168
}
121169

server/controllers/collection.controller/collectionForUserExists.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default function collectionForUserExists(username, collectionId, callback
1111
}
1212

1313
function findUser() {
14-
return User.findOne({ username });
14+
return User.findByUsername(username);
1515
}
1616

1717
function findCollection(owner) {

server/controllers/collection.controller/listCollections.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import User from '../../models/user';
33

44
async function getOwnerUserId(req) {
55
if (req.params.username) {
6-
const user = await User.findOne({ username: req.params.username });
6+
const user =
7+
await User.findByUsername(req.params.username);
78
if (user && user._id) {
89
return user._id;
910
}

server/controllers/project.controller.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function updateProject(req, res) {
6464

6565
export function getProject(req, res) {
6666
const { project_id: projectId, username } = req.params;
67-
User.findOne({ username }, (err, user) => { // eslint-disable-line
67+
User.findByUsername(username, (err, user) => { // eslint-disable-line
6868
if (!user) {
6969
return res.status(404).send({ message: 'Project with that username does not exist' });
7070
}
@@ -141,7 +141,7 @@ export function projectExists(projectId, callback) {
141141
}
142142

143143
export function projectForUserExists(username, projectId, callback) {
144-
User.findOne({ username }, (err, user) => {
144+
User.findByUsername(username, (err, user) => {
145145
if (!user) {
146146
callback(false);
147147
return;

server/controllers/project.controller/getProjectsForUser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const UserNotFoundError = createApplicationErrorClass('UserNotFoundError');
77

88
function getProjectsForUserName(username) {
99
return new Promise((resolve, reject) => {
10-
User.findOne({ username }, (err, user) => {
10+
User.findByUsername(username, (err, user) => {
1111
if (err) {
1212
reject(err);
1313
return;

0 commit comments

Comments
 (0)