diff options
| author | Jules Laplace <jules@okfoc.us> | 2014-06-09 12:44:59 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2014-06-09 12:44:59 -0400 |
| commit | b1974b9c2fe6ee1f35b3e34895f134d906299cec (patch) | |
| tree | 288f0cff83dc2e656fb8782d83addf49f68c42fb | |
| parent | e5dc46846ce9fb1c990d291ef852c0cad3f74957 (diff) | |
save profile, update avatar
| -rw-r--r-- | package.json | 4 | ||||
| -rw-r--r-- | public/assets/javascripts/vendor/ModalFormView.js | 31 | ||||
| -rw-r--r-- | server/index.js | 5 | ||||
| -rw-r--r-- | server/lib/api.js | 41 | ||||
| -rw-r--r-- | server/lib/upload.js | 24 | ||||
| -rw-r--r-- | views/partials/edit-profile.ejs | 4 |
6 files changed, 77 insertions, 32 deletions
diff --git a/package.json b/package.json index 62197f8..b0feaf0 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,9 @@ "mongoose-lifecycle": "~1.0.0", "knox": "~0.8.10", "moment": "~2.6.0", - "html-entities": "~1.0.10" + "html-entities": "~1.0.10", + "multer": "~0.1.0", + "body-parser": "1.3.0" }, "devDependencies": { "grunt": "~0.4.1", diff --git a/public/assets/javascripts/vendor/ModalFormView.js b/public/assets/javascripts/vendor/ModalFormView.js index 16d63b2..bb926d1 100644 --- a/public/assets/javascripts/vendor/ModalFormView.js +++ b/public/assets/javascripts/vendor/ModalFormView.js @@ -1,7 +1,7 @@ var ModalFormView = ModalView.extend({ - method: "put", + method: "post", events: { "submit form": "submit" @@ -44,18 +44,33 @@ var ModalFormView = ModalView.extend({ return } } - - var fields = this.$form.serializeArray() - fields.forEach(function(pair){ - if (pair.name.indexOf("password") !== -1 && pair.value.length > 0) { - pair.value = SHA1.hex('lol$' + pair.value + '$vvalls') + + var fd = new FormData() + + this.$("input[name], select[name], textarea[name]").each( function(){ + if (this.type == "file") { + if (this.files.length > 0) { + fd.append(this.name, this.files[0]); + console.log(this.name) + } } - }) + else if (this.type == "password") { + if (this.value.length > 0) { + fd.append(this.name, SHA1.hex('lol$' + this.value + '$vvalls')) + } + } + else { + fd.append(this.name, $(this).val()); + } + }); var request = $.ajax({ url: this.action, type: this.method, - data: $.param(fields) + data: fd, + dataType: "json", + processData: false, + contentType: false, }); request.done($.proxy(function (response) { if (response.error) { diff --git a/server/index.js b/server/index.js index 3f9aad0..a1efaf2 100644 --- a/server/index.js +++ b/server/index.js @@ -11,6 +11,8 @@ var config = require('../config.json'), var http = require('http'), express = require('express'), + bodyParser = require('body-parser'), + multer = require('multer'), MongoStore = require('connect-mongo')(express), passport = require('passport'), path = require('path'), @@ -39,7 +41,8 @@ app.use(express.session({ cookie: { domain: '.' + config.hostName, maxAge: 43200000 }, store: SessionStore })); -app.use(express.bodyParser()); +app.use(bodyParser()); +app.use(multer()); app.use(express.query()); app.use(express.csrf()); app.use(express.methodOverride()); diff --git a/server/lib/api.js b/server/lib/api.js index 85c5b85..cf2a911 100644 --- a/server/lib/api.js +++ b/server/lib/api.js @@ -6,6 +6,7 @@ var passport = require('passport'), crypto = require('crypto'), _ = require('lodash'), util = require('./util'), + upload = require('./upload'), config = require('../../config.json'), User = require('./schemas/User'); @@ -21,9 +22,9 @@ var api = { update: function(req, res){ var data = util.cleanQuery(req.body) - if (data.new_password.length) { - if (req.user.checkPassword(data.old_password)) { - res.json({ error: { errors: { username: { message: "Old password is incorrect" } } } }) + if (data.new_password && data.new_password.length) { + if (! data.old_password || ! req.user.checkPassword(data.old_password)) { + res.json({ error: { errors: { password: { message: "Old password is incorrect" } } } }) } var shasum = crypto.createHash('sha1') @@ -35,11 +36,35 @@ var api = { delete data.old_password delete data.new_password delete data.isAdmin - _.extend( req.user, data ) - req.user.save(function(err, msg) { - err ? res.json({ status: "FAIL", error: err }) - : res.json({ status: "OK", payload: req.user }) - }) + + if (req.files.avatar) { + // handle the upload here + console.log("GOT SOME FILES") + upload.put("avatars", req.files.avatar, { + acceptable: function(){ + console.log("acceptable") + }, + unacceptable: function(err){ + console.log("unacceptable") + res.json({ error: { errors: { avatar: { message: "Problem saving avatar: " + err } } } }) + }, + success: function(url){ + data.photo = url + done() + } + }) + } + else { + done() + } + + function done () { + _.extend( req.user, data ) + req.user.save(function(err, msg) { + err ? res.json({ status: "FAIL", error: err }) + : res.json({ status: "OK", payload: req.user }) + }) + } } } diff --git a/server/lib/upload.js b/server/lib/upload.js index 5c130a2..4346a99 100644 --- a/server/lib/upload.js +++ b/server/lib/upload.js @@ -16,18 +16,18 @@ var acceptableuploadTypes = { 'image/png': 'png' } -module.exports.put = function (key, image, opt) { - var imageSize, imageType, filename +module.exports.put = function (key, file, opt) { + var fileSize, fileType, filename var err var now = new Date() var ts = moment().format('YYYYMMDD') - var extension = acceptableuploadTypes[image.type] + var extension = acceptableuploadTypes[file.mimetype] filename = (+now) + "-" - + image.name.replace(/\..*$/,"") + + file.originalname.replace(/\..*$/,"") .replace(/[^0-9a-zA-Z]+/g,"-") - .substr(-64) + .substr(-128) + "." + extension; var remote_path = "/images/" + key + "/" + ts + "/" + filename @@ -35,10 +35,10 @@ module.exports.put = function (key, image, opt) { if (! extension) { err = "unacceptable filetype" } - else if (image.size < 10) { + else if (file.size < 10) { err = "file too small" } - else if (image.size > 2097152) { // 2mb limit + else if (file.size > 2097152) { // 2mb limit err = "file too large" } @@ -51,9 +51,9 @@ module.exports.put = function (key, image, opt) { opt.acceptable && opt.acceptable(err) console.log("upload > ", remote_path) - s3.putFile(image.path, remote_path, { - 'Content-Length': image.size, - 'Content-Type': image.type, + s3.putFile(file.path, remote_path, { + 'Content-Length': file.size, + 'Content-Type': file.mimetype, 'x-amz-acl': 'public-read' }, function(err, s3res) { if (err || s3res.statusCode !== 200) { @@ -62,9 +62,9 @@ module.exports.put = function (key, image, opt) { return; } - var image_url = s3res.url || s3res.req.url + var file_url = s3res.url || s3res.req.url - opt.success && opt.success(image_url) + opt.success && opt.success(file_url) }).on('error', function(err, s3res){ console.error(err) s3res && s3res.resume && s3res.resume() diff --git a/views/partials/edit-profile.ejs b/views/partials/edit-profile.ejs index 1a288db..f5807ee 100644 --- a/views/partials/edit-profile.ejs +++ b/views/partials/edit-profile.ejs @@ -53,7 +53,7 @@ <li> <label class="description" for="profile_avatar">Upload Avatar:</label> <div> - <input id="profile_avatar" name="avatar" class="element file" type="file"/> + <input id="profile_avatar" name="avatar" class="element file" type="file"> </div> <p class="guidelines"><img id="load_avatar"><small>please choose a picture at least 500px wide</small></p> </li> @@ -81,7 +81,7 @@ </li> <li class="buttons"> - <input id="saveForm" class="button_text" type="submit" name="submit" value="Submit" /> + <input id="saveForm" class="button_text" type="submit" value="Submit" /> </li> <div class="errors"> <div>There was a problem with your submission:</div> |
