Skip to content

Commit b126a69

Browse files
committed
[#1317] Begin writing duplicate email script
1 parent 6259f58 commit b126a69

File tree

3 files changed

+124
-1
lines changed

3 files changed

+124
-1
lines changed

server/controllers/aws.controller.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,27 @@ export function copyObjectInS3(req, res) {
119119
});
120120
}
121121

122+
export function moveObjectToUserInS3(url, userId) {
123+
return new Promise((resolve, reject) => {
124+
const objectKey = getObjectKey(url);
125+
const fileExtension = getExtension(objectKey);
126+
const newFilename = uuid.v4() + fileExtension;
127+
const params = {
128+
Bucket: `${process.env.S3_BUCKET}`,
129+
CopySource: `${process.env.S3_BUCKET}/${objectKey}`,
130+
Key: `${userId}/${newFilename}`,
131+
ACL: 'public-read'
132+
};
133+
const move = client.moveObject(params);
134+
move.on('err', (err) => {
135+
reject(err);
136+
});
137+
move.on('end', (data) => {
138+
resolve(`${s3Bucket}${userId}/${newFilename}`);
139+
});
140+
});
141+
}
142+
122143
export function listObjectsInS3ForUser(userId) {
123144
let assets = [];
124145
return new Promise((resolve) => {
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import mongoose from 'mongoose';
2+
import User from '../models/user';
3+
import Project from '../models/project';
4+
import Collection from '../models/collection';
5+
import { moveObjectToUserInS3 } from '../controllers/aws.controller';
6+
7+
8+
const mongoConnectionString = process.env.MONGO_URL;
9+
const { ObjectId } = mongoose.Types;
10+
// Connect to MongoDB
11+
mongoose.Promise = global.Promise;
12+
mongoose.connect(mongoConnectionString, { useNewUrlParser: true, useUnifiedTopology: true });
13+
mongoose.set('useCreateIndex', true);
14+
mongoose.connection.on('error', () => {
15+
console.error('MongoDB Connection Error. Please make sure that MongoDB is running.');
16+
process.exit(1);
17+
});
18+
19+
/*
20+
* Requires the MongoDB Node.js Driver
21+
* https://mongodb.github.io/node-mongodb-native
22+
*/
23+
24+
const agg = [
25+
{
26+
$project: {
27+
email: {
28+
$toLower: [
29+
'$email'
30+
]
31+
}
32+
}
33+
}, {
34+
$group: {
35+
_id: '$email',
36+
total: {
37+
$sum: 1
38+
}
39+
}
40+
}, {
41+
$match: {
42+
total: {
43+
$gt: 1
44+
}
45+
}
46+
}, {
47+
$sort: {
48+
total: -1
49+
}
50+
}
51+
];
52+
53+
let currentUser = null;
54+
let duplicates = null;
55+
User.aggregate(agg).then((result) => {
56+
const email = result[0]._id;
57+
return User.find({ email }).collation({ locale: 'en', strength: 2 })
58+
.sort({ createdAt: 1 }).exec();
59+
}).then((result) => {
60+
[currentUser, ...duplicates] = result;
61+
duplicates = duplicates.map(dup => dup._id);
62+
console.log(duplicates);
63+
return Project.find({
64+
user: { $in: duplicates }
65+
}).exec();
66+
}).then((sketches) => {
67+
const saveSketchPromises = [];
68+
sketches.forEach((sketch) => {
69+
const moveSketchFilesPromises = [];
70+
sketch.files.forEach((file) => {
71+
if (file.url.includes('assets.editor.p5js.org')) {
72+
const fileSavePromise = moveObjectToUserInS3(file.url, currentUser._id)
73+
.then((newUrl) => {
74+
file.url = newUrl;
75+
});
76+
moveSketchFilesPromises.push(fileSavePromise);
77+
}
78+
});
79+
const sketchSavePromise = Promise.all(moveSketchFilesPromises).then(() => {
80+
sketch.user = ObjectId(currentUser._id);
81+
return sketch.save();
82+
});
83+
saveSketchPromises.push(sketchSavePromise);
84+
});
85+
return Promise.all(saveSketchPromises);
86+
// iterate through the results
87+
// check if any files are on AWS
88+
// if so, move them to the right user bucket
89+
// then, update the user to currentUser
90+
// then, after updating all of the projects
91+
// also update the collections
92+
// delete other users
93+
// update user email so it is all lowercase
94+
// then, send the email
95+
}).then(() => Collection.updateMany(
96+
{ owner: { $in: duplicates } },
97+
{ $set: { owner: ObjectId(currentUser.id) } }
98+
)).then(() => User.deleteMany({ _id: { $in: duplicates } })).catch((err) => {
99+
console.log(err);
100+
});
101+

server/migrations/start.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ require('@babel/register');
22
require('@babel/polyfill');
33
const path = require('path');
44
require('dotenv').config({ path: path.resolve('.env') });
5-
require('./populateTotalSize');
5+
require('./emailConsolidation');
6+
// require('./populateTotalSize');
67
// require('./moveBucket');
78
// require('./truncate');

0 commit comments

Comments
 (0)