Skip to content
This repository was archived by the owner on Aug 30, 2021. It is now read-only.

Commit 7ecf933

Browse files
committed
updating profile upload with a new version of multer
1 parent 3a4c51a commit 7ecf933

File tree

7 files changed

+89
-13
lines changed

7 files changed

+89
-13
lines changed

config/env/default.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,13 @@ module.exports = {
2828
sessionKey: 'sessionId',
2929
sessionCollection: 'sessions',
3030
logo: 'modules/core/client/img/brand/logo.png',
31-
favicon: 'modules/core/client/img/brand/favicon.ico'
31+
favicon: 'modules/core/client/img/brand/favicon.ico',
32+
uploads: {
33+
profileUpload: {
34+
dest: './modules/users/client/img/profile/uploads/', // Profile upload destination path
35+
limits: {
36+
fileSize: 1*1024*1024 // Max file size in bytes (1 MB)
37+
}
38+
}
39+
}
3240
};

config/lib/express.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ var config = require('../config'),
99
bodyParser = require('body-parser'),
1010
session = require('express-session'),
1111
MongoStore = require('connect-mongo')(session),
12-
multer = require('multer'),
1312
favicon = require('serve-favicon'),
1413
compress = require('compression'),
1514
methodOverride = require('method-override'),
@@ -88,12 +87,6 @@ module.exports.initMiddleware = function (app) {
8887
// Add the cookie parser and flash middleware
8988
app.use(cookieParser());
9089
app.use(flash());
91-
92-
// Add multipart handling middleware
93-
app.use(multer({
94-
dest: './uploads/',
95-
inMemory: true
96-
}));
9790
};
9891

9992
/**

config/lib/multer.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use strict';
2+
3+
module.exports.profileUploadFileFilter = function (req, file, cb) {
4+
if (file.mimetype !== 'image/png' && file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/gif') {
5+
return cb(new Error('Only image files are allowed!'), false);
6+
}
7+
cb(null, true);
8+
};

modules/users/client/controllers/settings/change-profile-picture.client.controller.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ angular.module('users').controller('ChangeProfilePictureController', ['$scope',
77

88
// Create file uploader instance
99
$scope.uploader = new FileUploader({
10-
url: 'api/users/picture'
10+
url: 'api/users/picture',
11+
alias: 'newProfilePicture'
1112
});
1213

1314
// Set file uploader image filter

modules/users/server/controllers/users/users.profile.server.controller.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ var _ = require('lodash'),
88
path = require('path'),
99
errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')),
1010
mongoose = require('mongoose'),
11+
multer = require('multer'),
12+
config = require(path.resolve('./config/config')),
1113
User = mongoose.model('User');
1214

1315
/**
@@ -54,15 +56,20 @@ exports.update = function (req, res) {
5456
exports.changeProfilePicture = function (req, res) {
5557
var user = req.user;
5658
var message = null;
59+
var upload = multer(config.uploads.profileUpload).single('newProfilePicture');
60+
var profileUploadFileFilter = require(path.resolve('./config/lib/multer')).profileUploadFileFilter;
61+
62+
// Filtering to upload only images
63+
upload.fileFilter = profileUploadFileFilter;
5764

5865
if (user) {
59-
fs.writeFile('./modules/users/client/img/profile/uploads/' + req.files.file.name, req.files.file.buffer, function (uploadError) {
60-
if (uploadError) {
66+
upload(req, res, function (uploadError) {
67+
if(uploadError) {
6168
return res.status(400).send({
6269
message: 'Error occurred while uploading profile picture'
6370
});
6471
} else {
65-
user.profileImageURL = 'modules/users/client/img/profile/uploads/' + req.files.file.name;
72+
user.profileImageURL = config.uploads.profileUpload.dest + req.file.filename;
6673

6774
user.save(function (saveError) {
6875
if (saveError) {

modules/users/tests/server/user.server.routes.tests.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,65 @@ describe('User CRUD tests', function () {
847847
});
848848
});
849849

850+
it('should be able to change profile picture if signed in', function (done) {
851+
agent.post('/api/auth/signin')
852+
.send(credentials)
853+
.expect(200)
854+
.end(function (signinErr, signinRes) {
855+
// Handle signin error
856+
if (signinErr) {
857+
return done(signinErr);
858+
}
859+
860+
agent.post('/api/users/picture')
861+
.attach('newProfilePicture', './modules/users/client/img/profile/default.png')
862+
.send(credentials)
863+
.expect(200)
864+
.end(function (userInfoErr, userInfoRes) {
865+
// Handle change profile picture error
866+
if (userInfoErr) {
867+
return done(userInfoErr);
868+
}
869+
870+
userInfoRes.body.should.be.instanceof(Object);
871+
userInfoRes.body.profileImageURL.should.be.a.String();
872+
userInfoRes.body._id.should.be.equal(String(user._id));
873+
874+
return done();
875+
});
876+
});
877+
});
878+
879+
it('should not be able to change profile picture if not signed in', function (done) {
880+
agent.post('/api/users/picture')
881+
.attach('newProfilePicture', './modules/users/client/img/profile/default.png')
882+
.send(credentials)
883+
.expect(400)
884+
.end(function (userInfoErr, userInfoRes) {
885+
done(userInfoErr);
886+
});
887+
});
888+
889+
it('should not be able to change profile picture if attach a picture with a different field name', function (done) {
890+
agent.post('/api/auth/signin')
891+
.send(credentials)
892+
.expect(200)
893+
.end(function (signinErr, signinRes) {
894+
// Handle signin error
895+
if (signinErr) {
896+
return done(signinErr);
897+
}
898+
899+
agent.post('/api/users/picture')
900+
.attach('fieldThatDoesntWork', './modules/users/client/img/profile/default.png')
901+
.send(credentials)
902+
.expect(400)
903+
.end(function (userInfoErr, userInfoRes) {
904+
done(userInfoErr);
905+
});
906+
});
907+
});
908+
850909
afterEach(function (done) {
851910
User.remove().exec(done);
852911
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"mocha": "~1.20.0",
4747
"mongoose": "^4.0.6",
4848
"morgan": "^1.6.1",
49-
"multer": "0.1.8",
49+
"multer": "~1.0.5",
5050
"nodemailer": "^1.4.0",
5151
"owasp-password-strength-test": "^1.3.0",
5252
"passport": "~0.2.2",

0 commit comments

Comments
 (0)