Last active
January 31, 2022 17:53
-
-
Save sailsinaction/22601ba11f523acccd67 to your computer and use it in GitHub Desktop.
Chapter 7 - Gists
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.d8888b. 888 888 8888888888 .d8888b. d8b 888 | |
d88P Y88b 888 888 d88P d88P Y88b Y8P 888 | |
888 888 888 888 d88P 888 888 888 | |
888 88888b. 8888b. 88888b. 888888 .d88b. 888d888 d88P 888 888 .d8888b 888888 .d8888b | |
888 888 "88b "88b 888 "88b 888 d8P Y8b 888P" 88888888 888 88888 888 88K 888 88K | |
888 888 888 888 .d888888 888 888 888 88888888 888 d88P 888888 888 888 888 "Y8888b. 888 "Y8888b. | |
Y88b d88P 888 888 888 888 888 d88P Y88b. Y8b. 888 d88P Y88b d88P 888 X88 Y88b. X88 | |
"Y8888P" 888 888 "Y888888 88888P" "Y888 "Y8888 888 d88P "Y8888P88 888 88888P' "Y888 88888P' | |
888 | |
888 | |
888 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// build up the user into a dictionary | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
password: req.param('password') | |
}; | |
// respond with the new user dictionary | |
return res.json(options); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// build up the user into a dictionary | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
password: req.param('password') | |
}; | |
// respond with the new user dictionary | |
return res.json(options); | |
}, | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
return res.json(result); | |
} | |
}); | |
} | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options dictionary | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
return res.json(options); | |
} | |
}); | |
} | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options dictionary | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function (err, createdUser) { | |
if (err) { | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
angular.module('brushfire').controller('signupPageController', ['$scope', '$http', 'toastr', function($scope, $http, toastr){ | |
// set-up loading state | |
$scope.signupForm = { | |
loading: false | |
}; | |
$scope.submitSignupForm = function(){ | |
// Set the loading state (i.e. show loading spinner) | |
$scope.signupForm.loading = true; | |
// Submit a POST request to /user [This is using blueprints.] | |
// $http.post('/user', { | |
// // Submit a POST request to Sails. [The signup action has been created.] | |
$http.post('/user/signup', { | |
email: $scope.signupForm.email, | |
username: $scope.signupForm.username, | |
password: $scope.signupForm.password | |
}) | |
.then(function onSuccess(sailsResponse){ | |
// Redirect to the profile page [This is after we have a profile page built] | |
// window.location = '#/profile/' + sailsResponse.data.id; | |
// Redirect to the user blueprint record [This is before we have the profile page built] | |
window.location = '/user/' + sailsResponse.data.id; | |
}) | |
.catch(function onError(sailsResponse){ | |
console.log(sailsResponse.data.invalidAttributes); | |
// Handle known error type(s). | |
if (sailsResponse.status == 409) { | |
toastr.error(sailsResponse.data); | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (sailsResponse.data || sailsResponse.status); | |
return; | |
} | |
if (sailsResponse.data.invalidAttributes) { | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (JSON.stringify(sailsResponse.data.invalidAttributes)); | |
return; | |
} | |
// Handle unknown error type(s). | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (JSON.stringify(sailsResponse.data) || sailsResponse.status); | |
}) | |
.finally(function eitherWay(){ | |
$scope.signupForm.loading = false; | |
}); | |
}; | |
}]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.send(409, 'Email address is already taken by another user, please try again.'); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.send(409, 'Username is already taken by another user, please try again.'); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
angular.module('brushfire').controller('signupPageController', ['$scope', '$http', 'toastr', function($scope, $http, toastr){ | |
// set-up loading state | |
$scope.signupForm = { | |
loading: false | |
}; | |
$scope.submitSignupForm = function(){ | |
// Set the loading state (i.e. show loading spinner) | |
$scope.signupForm.loading = true; | |
// Submit a POST request to /user [This is using blueprints.] | |
// $http.post('/user', { | |
// // Submit a POST request to Sails. [The signup action has been created.] | |
$http.post('/user/signup', { | |
email: $scope.signupForm.email, | |
username: $scope.signupForm.username, | |
password: $scope.signupForm.password | |
}) | |
.then(function onSuccess(sailsResponse){ | |
// Redirect to the profile page [This is after we have a profile page built] | |
// window.location = '#/profile/' + sailsResponse.data.id; | |
// Redirect to the user blueprint record [This is before we have the profile page built] | |
window.location = '/user/' + sailsResponse.data.id; | |
}) | |
.catch(function onError(sailsResponse){ | |
console.log(sailsResponse.data.invalidAttributes); | |
// Handle known error type(s). | |
if (sailsResponse.status == 409) { | |
toastr.error(sailsResponse.data); | |
// $scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (sailsResponse.data || sailsResponse.status); | |
return; | |
} | |
if (sailsResponse.data.invalidAttributes) { | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (JSON.stringify(sailsResponse.data.invalidAttributes)); | |
return; | |
} | |
// Handle unknown error type(s). | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (JSON.stringify(sailsResponse.data) || sailsResponse.status); | |
}) | |
.finally(function eitherWay(){ | |
$scope.signupForm.loading = false; | |
}); | |
}; | |
}]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = function alreadyInUse (err){ | |
// Get access to `res` | |
// (since the arguments are up to us) | |
var res = this.res; | |
if (err.invalidAttributes.email) { | |
return res.send(409, 'Email address is already taken by another user, please try again.'); | |
} | |
if (err.invalidAttributes.username) { | |
return res.send(409, 'Username is already taken by another user, please try again.'); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Bootstrap | |
* (sails.config.bootstrap) | |
* | |
* An asynchronous bootstrap function that runs before your Sails app gets lifted. | |
* This gives you an opportunity to set up your data model, run jobs, or perform some special logic. | |
* | |
* For more information on bootstrapping your app, check out: | |
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.bootstrap.html | |
*/ | |
module.exports.bootstrap = function(cb) { | |
// Return the number of records in the video model | |
Video.count().exec(function(err, numVideos) { | |
if (err) { | |
return cb(err); | |
} | |
// If there's at least one log the number to the console. | |
if (numVideos > 0) { | |
// return cb(); | |
return createTestUsers(); | |
} | |
// Add machinepack-youtube as a depedency | |
var Youtube = require('machinepack-youtube'); | |
// List Youtube videos which match the specified search query. | |
Youtube.searchVideos({ | |
query: 'grumpy cat', | |
apiKey: sails.config.google.apiKey, | |
limit: 15, | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
}, | |
// OK. | |
success: function(foundVideos) { | |
_.each(foundVideos, function(video) { | |
video.src = 'https://www.youtube.com/embed/' + video.id; | |
delete video.description; | |
delete video.publishedAt; | |
delete video.id; | |
delete video.url; | |
}); | |
Video.create(foundVideos).exec(function(err, videoRecordsCreated) { | |
if (err) { | |
return cb(err); | |
} | |
// return cb(); | |
return createTestUsers(); | |
}); | |
}, | |
}); | |
}); | |
function createTestUsers() { | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
User.findOne({ | |
email: 'sailsinaction@gmail.com' | |
}).exec(function(err, foundUser) { | |
if (foundUser){ | |
return cb(); | |
} | |
Passwords.encryptPassword({ | |
password: 'abc123', | |
}).exec({ | |
error: function(err) { | |
return cb(err); | |
}, | |
success: function(result) { | |
var options = {}; | |
try { | |
options.gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: 'sailsinaction@gmail.com' | |
}).execSync(); | |
} catch (err) { | |
return cb(err); | |
} | |
options.email = 'sailsinaction@gmail.com'; | |
options.encryptedPassword = result; | |
options.username = 'sailsinaction'; | |
options.deleted = false; | |
options.admin = false; | |
options.banned = false; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
return cb(err); | |
} | |
return cb(); | |
}); | |
} | |
}); | |
}); | |
} | |
}; | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(user); | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
angular.module('brushfire').controller('signupPageController', ['$scope', '$http', 'toastr', function($scope, $http, toastr){ | |
// set-up loading state | |
$scope.signupForm = { | |
loading: false | |
}; | |
$scope.submitSignupForm = function(){ | |
// Set the loading state (i.e. show loading spinner) | |
$scope.signupForm.loading = true; | |
// Submit a POST request to /user [This is using blueprints.] | |
// $http.post('/user', { | |
// // Submit a POST request to Sails. [The signup action has been created.] | |
$http.post('/user/signup', { | |
email: $scope.signupForm.email, | |
username: $scope.signupForm.username, | |
password: $scope.signupForm.password | |
}) | |
.then(function onSuccess(sailsResponse){ | |
// Redirect to the profile page [This is after we have a profile page built] | |
window.location = '#/profile/' + sailsResponse.data.id; | |
// Redirect to the user blueprint record [This is before we have the profile page built] | |
// window.location = '/user/' + sailsResponse.data.id; | |
}) | |
.catch(function onError(sailsResponse){ | |
console.log(sailsResponse.data.invalidAttributes); | |
// Handle known error type(s). | |
if (sailsResponse.status == 409) { | |
toastr.error(sailsResponse.data); | |
// $scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (sailsResponse.data || sailsResponse.status); | |
return; | |
} | |
if (sailsResponse.data.invalidAttributes) { | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (JSON.stringify(sailsResponse.data.invalidAttributes)); | |
return; | |
} | |
// Handle unknown error type(s). | |
$scope.signupForm.errorMsg = 'An unexpected error occurred: ' + (JSON.stringify(sailsResponse.data) || sailsResponse.status); | |
}) | |
.finally(function eitherWay(){ | |
$scope.signupForm.loading = false; | |
}); | |
}; | |
}]); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(user); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- Error state --> | |
<div class="alert alert-info toggle" ng-show="userProfile.errorMsg"> | |
<h5>Oops!</h5> | |
<p>Looks like an error occurred.</p> | |
<code> | |
{{userProfile.errorMsg}} | |
</code> | |
</div> | |
<!-- Loading state --> | |
<div ng-show="userProfile.loading"> | |
<span class="overlord-loading-spinner fa fa-spinner"></span> | |
<span>Loading user data...</span> | |
</div> | |
<div ng-hide="userProfile.loading"> | |
<div ng-hide="loading"> | |
<div class="col-md-3"> | |
<img src={{userProfile.properties.gravatarURL}}/> | |
</div> | |
</div> | |
</div> | |
<div class="col-md-3" ng-hide="userProfile.noProfile"> | |
<h1>{{userProfile.properties.username}}</h1> | |
<h3> <a href="mailto:{{userProfile.properties.email}}">{{userProfile.properties.email}}</a></h3> | |
<div> | |
<a href="#/profile/edit/{{userProfile.properties.id}}" class="btn btn-lg btn-primary">Edit</a> | |
<!-- Hard Delete --> | |
<!-- <a ng-click="deleteProfile()" class="btn btn-lg btn-primary btn-danger">Delete</a> --> | |
<!-- Soft Delete --> | |
<a ng-click="removeProfile()" class="btn btn-lg btn-primary btn-danger">Delete</a> | |
</div> | |
</div> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(user); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
removeProfile: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.update({ | |
id: req.param('id') | |
},{ | |
deleted: true | |
}, function(err, removedUser){ | |
if (err) return res.negotiate(err); | |
if (removedUser.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(user); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
removeProfile: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.update({ | |
id: req.param('id') | |
},{ | |
deleted: true | |
}, function(err, removedUser){ | |
if (err) return res.negotiate(err); | |
if (removedUser.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
restoreProfile: function(req, res) { | |
User.findOne({ | |
email: req.param('email') | |
}, function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
if (!user) return res.notFound(); | |
Passwords.checkPassword({ | |
passwordAttempt: req.param('password'), | |
encryptedPassword: user.encryptedPassword | |
}).exec({ | |
error: function(err) { | |
return res.negotiate(err); | |
}, | |
incorrect: function() { | |
return res.notFound(); | |
}, | |
success: function() { | |
User.update({ | |
id: user.id | |
}, { | |
deleted: false | |
}).exec(function(err, updatedUser) { | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(options); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
removeProfile: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.update({ | |
id: req.param('id') | |
},{ | |
deleted: true | |
}, function(err, removedUser){ | |
if (err) return res.negotiate(err); | |
if (removedUser.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
restoreProfile: function(req, res) { | |
User.findOne({ | |
email: req.param('email') | |
}, function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
if (!user) return res.notFound(); | |
Passwords.checkPassword({ | |
passwordAttempt: req.param('password'), | |
encryptedPassword: user.encryptedPassword | |
}).exec({ | |
error: function(err) { | |
return res.negotiate(err); | |
}, | |
incorrect: function() { | |
return res.notFound(); | |
}, | |
success: function() { | |
User.update({ | |
id: user.id | |
}, { | |
deleted: false | |
}).exec(function(err, updatedUser) { | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}); | |
}, | |
restoreGravatarURL: function(req, res) { | |
try { | |
var restoredGravatarURL = gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email') | |
}).execSync(); | |
return res.json(restoredGravatarURL); | |
} catch (err) { | |
return res.serverError(err); | |
} | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(options); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
removeProfile: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.update({ | |
id: req.param('id') | |
},{ | |
deleted: true | |
}, function(err, removedUser){ | |
if (err) return res.negotiate(err); | |
if (removedUser.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
restoreProfile: function(req, res) { | |
User.findOne({ | |
email: req.param('email') | |
}, function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
if (!user) return res.notFound(); | |
Passwords.checkPassword({ | |
passwordAttempt: req.param('password'), | |
encryptedPassword: user.encryptedPassword | |
}).exec({ | |
error: function(err) { | |
return res.negotiate(err); | |
}, | |
incorrect: function() { | |
return res.notFound(); | |
}, | |
success: function() { | |
User.update({ | |
id: user.id | |
}, { | |
deleted: false | |
}).exec(function(err, updatedUser) { | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}); | |
}, | |
restoreGravatarURL: function(req, res) { | |
try { | |
var restoredGravatarURL = gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email') | |
}).execSync(); | |
return res.json(restoredGravatarURL); | |
} catch (err) { | |
return res.serverError(err); | |
} | |
}, | |
updateProfile: function(req, res) { | |
User.update({ | |
id: req.param('id') | |
}, { | |
gravatarURL: req.param('gravatarURL') | |
}, function(err, updatedUser) { | |
if (err) return res.negotiate(err); | |
return res.json(updatedUser); | |
}); | |
}, | |
changePassword: function(req, res) { | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
User.update({ | |
id: req.param('id') | |
}, { | |
encryptedPassword: result | |
}).exec(function(err, updatedUser) { | |
if (err) { | |
return res.negotiate(err); | |
} | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(options); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
removeProfile: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.update({ | |
id: req.param('id') | |
},{ | |
deleted: true | |
}, function(err, removedUser){ | |
if (err) return res.negotiate(err); | |
if (removedUser.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
restoreProfile: function(req, res) { | |
User.findOne({ | |
email: req.param('email') | |
}, function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
if (!user) return res.notFound(); | |
Passwords.checkPassword({ | |
passwordAttempt: req.param('password'), | |
encryptedPassword: user.encryptedPassword | |
}).exec({ | |
error: function(err) { | |
return res.negotiate(err); | |
}, | |
incorrect: function() { | |
return res.notFound(); | |
}, | |
success: function() { | |
User.update({ | |
id: user.id | |
}, { | |
deleted: false | |
}).exec(function(err, updatedUser) { | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}); | |
}, | |
restoreGravatarURL: function(req, res) { | |
try { | |
var restoredGravatarURL = gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email') | |
}).execSync(); | |
return res.json(restoredGravatarURL); | |
} catch (err) { | |
return res.serverError(err); | |
} | |
}, | |
updateProfile: function(req, res) { | |
User.update({ | |
id: req.param('id') | |
}, { | |
gravatarURL: req.param('gravatarURL') | |
}, function(err, updatedUser) { | |
if (err) return res.negotiate(err); | |
return res.json(updatedUser); | |
}); | |
}, | |
changePassword: function(req, res) { | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
User.update({ | |
id: req.param('id') | |
}, { | |
encryptedPassword: result | |
}).exec(function(err, updatedUser) { | |
if (err) { | |
return res.negotiate(err); | |
} | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}, | |
adminUsers: function(req, res) { | |
User.find().exec(function(err, users){ | |
if (err) return res.negotiate(err); | |
return res.json(users); | |
}); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* UserController | |
* | |
* @description :: Server-side logic for managing users | |
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers | |
*/ | |
var Emailaddresses = require('machinepack-emailaddresses'); | |
var Passwords = require('machinepack-passwords'); | |
var Gravatar = require('machinepack-gravatar'); | |
module.exports = { | |
signup: function(req, res) { | |
// email is required | |
if (_.isUndefined(req.param('email'))) { | |
return res.badRequest('An email address is required!'); | |
} | |
// password is required | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
// password must be at least 6 characters | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
// username is required | |
if (_.isUndefined(req.param('username'))) { | |
return res.badRequest('A username is required!'); | |
} | |
// username must be at least 6 characters | |
if (req.param('username').length < 6) { | |
return res.badRequest('Username must be at least 6 characters!'); | |
} | |
// Username must contain only numbers and letters. | |
if (!_.isString(req.param('username')) || req.param('username').match(/[^a-z0-9]/i)) { | |
return res.badRequest('Invalid username: must consist of numbers and letters only.'); | |
} | |
// Determine whether or not the provided string is an email address. | |
Emailaddresses.validate({ | |
string: req.param('email'), | |
}).exec({ | |
// An unexpected error occurred. | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
// The provided string is not an email address. | |
invalid: function() { | |
return res.badRequest('Doesn\'t look like an email address to me!'); | |
}, | |
// OK. | |
success: function() { | |
// Encrypt the password | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
try { | |
// Create Gravatar URL | |
var gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email'), | |
}).execSync(); | |
} catch(err) { | |
return res.serverError(err); | |
} | |
// Build up options | |
var options = { | |
email: req.param('email'), | |
username: req.param('username'), | |
encryptedPassword: result, | |
gravatarURL: gravatarURL | |
}; | |
User.create(options).exec(function(err, createdUser) { | |
if (err) { | |
if (err.invalidAttributes && err.invalidAttributes.email && err.invalidAttributes.email[0] && err.invalidAttributes.email[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
if (err.invalidAttributes && err.invalidAttributes.username && err.invalidAttributes.username[0] && err.invalidAttributes.username[0].rule === 'unique') { | |
return res.alreadyInUse(err); | |
} | |
return res.negotiate(err); | |
} | |
return res.json(createdUser); | |
}); | |
} | |
}); | |
} | |
}); | |
}, | |
profile: function(req, res) { | |
User.findOne(req.param('id')).exec(function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
// Handle no user being found | |
if (!user) return res.notFound(); | |
// Build up user options | |
var options = { | |
email: user.email, | |
username: user.username, | |
gravatarURL: user.gravatarURL, | |
deleted: user.deleted, | |
admin: user.admin, | |
banned: user.banned, | |
id: user.id | |
}; | |
// Return the user | |
return res.json(options); | |
}); | |
}, | |
delete: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.destroy({ | |
id: req.param('id') | |
}).exec(function (err, usersDestroyed){ | |
if (err) return res.negotiate(err); | |
if (usersDestroyed.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
removeProfile: function(req, res) { | |
if (!req.param('id')){ | |
return res.badRequest('id is a required parameter.'); | |
} | |
User.update({ | |
id: req.param('id') | |
},{ | |
deleted: true | |
}, function(err, removedUser){ | |
if (err) return res.negotiate(err); | |
if (removedUser.length === 0) { | |
return res.notFound(); | |
} | |
return res.ok(); | |
}); | |
}, | |
restoreProfile: function(req, res) { | |
User.findOne({ | |
email: req.param('email') | |
}, function foundUser(err, user) { | |
if (err) return res.negotiate(err); | |
if (!user) return res.notFound(); | |
Passwords.checkPassword({ | |
passwordAttempt: req.param('password'), | |
encryptedPassword: user.encryptedPassword | |
}).exec({ | |
error: function(err) { | |
return res.negotiate(err); | |
}, | |
incorrect: function() { | |
return res.notFound(); | |
}, | |
success: function() { | |
User.update({ | |
id: user.id | |
}, { | |
deleted: false | |
}).exec(function(err, updatedUser) { | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}); | |
}, | |
restoreGravatarURL: function(req, res) { | |
try { | |
var restoredGravatarURL = gravatarURL = Gravatar.getImageUrl({ | |
emailAddress: req.param('email') | |
}).execSync(); | |
return res.json(restoredGravatarURL); | |
} catch (err) { | |
return res.serverError(err); | |
} | |
}, | |
updateProfile: function(req, res) { | |
User.update({ | |
id: req.param('id') | |
}, { | |
gravatarURL: req.param('gravatarURL') | |
}, function(err, updatedUser) { | |
if (err) return res.negotiate(err); | |
return res.json(updatedUser); | |
}); | |
}, | |
changePassword: function(req, res) { | |
if (_.isUndefined(req.param('password'))) { | |
return res.badRequest('A password is required!'); | |
} | |
if (req.param('password').length < 6) { | |
return res.badRequest('Password must be at least 6 characters!'); | |
} | |
Passwords.encryptPassword({ | |
password: req.param('password'), | |
}).exec({ | |
error: function(err) { | |
return res.serverError(err); | |
}, | |
success: function(result) { | |
User.update({ | |
id: req.param('id') | |
}, { | |
encryptedPassword: result | |
}).exec(function(err, updatedUser) { | |
if (err) { | |
return res.negotiate(err); | |
} | |
return res.json(updatedUser); | |
}); | |
} | |
}); | |
}, | |
adminUsers: function(req, res) { | |
User.find().exec(function(err, users){ | |
if (err) return res.negotiate(err); | |
return res.json(users); | |
}); | |
}, | |
updateAdmin: function(req, res) { | |
User.update(req.param('id'), { | |
admin: req.param('admin') | |
}).exec(function(err, update){ | |
if (err) return res.negotiate(err); | |
res.ok(); | |
}); | |
}, | |
updateBanned: function(req, res) { | |
User.update(req.param('id'), { | |
banned: req.param('banned') | |
}).exec(function(err, update){ | |
if (err) return res.negotiate(err); | |
res.ok(); | |
}); | |
}, | |
updateDeleted: function(req, res) { | |
User.update(req.param('id'), { | |
deleted: req.param('deleted') | |
}).exec(function(err, update){ | |
if (err) return res.negotiate(err); | |
res.ok(); | |
}); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment