Skip to content

Commit 36d2028

Browse files
committed
add script to add total size to all user accounts, add totalSize to user model, return totalSize from user api request
1 parent 5654ed1 commit 36d2028

File tree

6 files changed

+86
-39
lines changed

6 files changed

+86
-39
lines changed

server/controllers/aws.controller.js

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -108,54 +108,67 @@ export function copyObjectInS3(req, res) {
108108
});
109109
}
110110

111-
export function listObjectsInS3ForUser(req, res) {
112-
const { username } = req.user;
113-
findUserByUsername(username, (user) => {
114-
const userId = user.id;
111+
export function listObjectsInS3ForUser(userId) {
112+
let assets = [];
113+
return new Promise((resolve) => {
115114
const params = {
116115
s3Params: {
117116
Bucket: `${process.env.S3_BUCKET}`,
118117
Prefix: `${userId}/`
119118
}
120119
};
121-
let assets = [];
122120
client.listObjects(params)
123121
.on('data', (data) => {
124122
assets = assets.concat(data.Contents.map(object => ({ key: object.Key, size: object.Size })));
125123
})
126124
.on('end', () => {
127-
const projectAssets = [];
128-
getProjectsForUserId(userId).then((projects) => {
129-
let totalSize = 0;
130-
assets.forEach((asset) => {
131-
const name = asset.key.split('/').pop();
132-
const foundAsset = {
133-
key: asset.key,
134-
name,
135-
size: asset.size,
136-
url: `${process.env.S3_BUCKET_URL_BASE}${asset.key}`
137-
};
138-
totalSize += asset.size;
139-
projects.some((project) => {
140-
let found = false;
141-
project.files.some((file) => {
142-
if (!file.url) return false;
143-
if (file.url.includes(asset.key)) {
144-
found = true;
145-
foundAsset.name = file.name;
146-
foundAsset.sketchName = project.name;
147-
foundAsset.sketchId = project.id;
148-
foundAsset.url = file.url;
149-
return true;
150-
}
151-
return false;
152-
});
153-
return found;
154-
});
155-
projectAssets.push(foundAsset);
125+
resolve();
126+
});
127+
}).then(() => {
128+
return getProjectsForUserId(userId);
129+
}).then((projects) => {
130+
const projectAssets = [];
131+
let totalSize = 0;
132+
assets.forEach((asset) => {
133+
const name = asset.key.split('/').pop();
134+
const foundAsset = {
135+
key: asset.key,
136+
name,
137+
size: asset.size,
138+
url: `${process.env.S3_BUCKET_URL_BASE}${asset.key}`
139+
};
140+
totalSize += asset.size;
141+
projects.some((project) => {
142+
let found = false;
143+
project.files.some((file) => {
144+
if (!file.url) return false;
145+
if (file.url.includes(asset.key)) {
146+
found = true;
147+
foundAsset.name = file.name;
148+
foundAsset.sketchName = project.name;
149+
foundAsset.sketchId = project.id;
150+
foundAsset.url = file.url;
151+
return true;
152+
}
153+
return false;
156154
});
157-
res.json({ assets: projectAssets, totalSize });
155+
return found;
158156
});
157+
projectAssets.push(foundAsset);
159158
});
159+
return Promise.resolve({ assets: projectAssets, totalSize});
160+
}).catch((err) => {
161+
console.log('got an error');
162+
console.log(err);
163+
});
164+
}
165+
166+
export function listObjectsInS3ForUserRequestHandler(req, res) {
167+
const { username } = req.user;
168+
findUserByUsername(username, (user) => {
169+
const userId = user.id;
170+
listObjectsInS3ForUser(userId).then((objects) => {
171+
res.json(objects);
172+
});
160173
});
161174
}

server/controllers/user.controller.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ export function userResponse(user) {
1717
preferences: user.preferences,
1818
apiKeys: user.apiKeys,
1919
verified: user.verified,
20-
id: user._id
20+
id: user._id,
21+
totalSize: req.user.totalSize
2122
};
2223
}
2324

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import mongoose from 'mongoose';
2+
3+
import User from '../models/user';
4+
import { listObjectsInS3ForUser } from '../controllers/aws.controller';
5+
6+
// Connect to MongoDB
7+
mongoose.Promise = global.Promise;
8+
mongoose.connect(process.env.MONGO_URL, { useMongoClient: true });
9+
mongoose.connection.on('error', () => {
10+
console.error('MongoDB Connection Error. Please make sure that MongoDB is running.');
11+
process.exit(1);
12+
});
13+
14+
User.find({}, {}, { timeout: true }).cursor().eachAsync((user) => {
15+
console.log(user.id);
16+
if (user.totalSize !== undefined) {
17+
console.log('Already updated size for user: ' + user.username);
18+
return Promise.resolve();
19+
}
20+
return listObjectsInS3ForUser(user.id).then((objects) => {
21+
return User.findByIdAndUpdate(user.id, { $set: { totalSize: objects.totalSize } });
22+
}).then(() => {
23+
console.log('Updated new total size for user: ' + user.username);
24+
});
25+
}).then(() => {
26+
console.log('Done iterating over every user');
27+
process.exit(0);
28+
});

server/migrations/start.js

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

server/models/user.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ const userSchema = new Schema({
6666
soundOutput: { type: Boolean, default: false },
6767
theme: { type: String, default: 'light' },
6868
autorefresh: { type: Boolean, default: false }
69-
}
69+
},
70+
totalSize: { type: Number, default: 0 }
7071
}, { timestamps: true, usePushEach: true });
7172

7273
/**

server/routes/aws.routes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ const router = new Router();
77
router.post('/S3/sign', isAuthenticated, AWSController.signS3);
88
router.post('/S3/copy', isAuthenticated, AWSController.copyObjectInS3);
99
router.delete('/S3/:object_key', isAuthenticated, AWSController.deleteObjectFromS3);
10-
router.get('/S3/objects', AWSController.listObjectsInS3ForUser);
10+
router.get('/S3/objects', AWSController.listObjectsInS3ForUserRequestHandler);
1111

1212
export default router;

0 commit comments

Comments
 (0)