diff --git a/bower.json b/bower.json index 2d524fb..6942904 100644 --- a/bower.json +++ b/bower.json @@ -4,24 +4,25 @@ "homepage": "http://meanjs.org/", "license": "MIT", "dependencies": { - "bootstrap": "^3.3.7", - "angular": "~1.3", - "angular-resource": "~1.3", - "angular-animate": "~1.3", - "angular-mocks": "~1.3", - "angular-bootstrap": "~0.13", - "angular-ui-utils": "bower", - "angular-ui-router": "~0.2", - "angular-file-upload": "1.1.5", - "angular-messages": "~1.3.17", + "bootstrap": "^4.0.0", + "angular": "~1.8.0", + "angular-resource": "~1.8.0", + "angular-cache": "4.6.0", + "angular-animate": "~1.8.0", + "angular-mocks": "~1.8.0", + "angular-bootstrap": "~2.5.0", + "angular-ui-utils": "3.0.0", + "angular-ui-router": "~1.0.26", + "angular-file-upload": "2.6.0", + "angular-messages": "~1.8.0", "owasp-password-strength-test": "~1.3.0", - "eonasdan-bootstrap-datetimepicker": "~4.17.37", - "ngSweetAlert": "angular-sweetalert#^1.1.0", - "angular-formly": "^8.4.0", - "angular-formly-templates-bootstrap": "^6.3.2", + "eonasdan-bootstrap-datetimepicker": "~4.17.47", + "ngSweetAlert": "angular-sweetalert#^1.1.3", + "angular-formly": "^8.4.1", + "angular-formly-templates-bootstrap": "^6.2.0", "api-check": "^7.5.5", - "angularjs-slider": "^5.9.0", - "angular-ui-select": "^0.19.6" + "angularjs-slider": "^7.0.0", + "angular-ui-select": "^0.19.8" }, "resolutions": { "angular": "~1.3" diff --git a/config/assets/default.js b/config/assets/default.js index a846754..f81c95d 100644 --- a/config/assets/default.js +++ b/config/assets/default.js @@ -4,38 +4,38 @@ module.exports = { client: { lib: { css: [ - 'public/lib/bootstrap/dist/css/bootstrap.css', - 'public/lib/bootstrap/dist/css/bootstrap-theme.css', - 'public/lib/angular-bootstrap/ui-bootstrap-csp.js', - 'public/lib/angularjs-slider/dist/rzslider.css', - 'public/lib/sweetalert/dist/sweetalert.css', - 'public/lib/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css' + 'node_modules/@bower_components/bootstrap/dist/css/bootstrap.css', + 'node_modules/@bower_components/bootstrap/dist/css/bootstrap-theme.css', + 'node_modules/@bower_components/angular-bootstrap/ui-bootstrap-csp.js', + 'node_modules/@bower_components/angularjs-slider/dist/rzslider.css', + 'node_modules/@bower_components/sweetalert/dist/sweetalert.css', + 'node_modules/@bower_components/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css' ], js: [ - 'public/lib/api-check/dist/api-check.js', - 'public/lib/jquery/dist/jquery.min.js', - 'public/lib/bootstrap/dist/js/bootstrap.min.js', - 'public/lib/angular/angular.js', - 'public/lib/angular-formly/dist/formly.js', - 'public/lib/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.js', - 'public/lib/angularjs-slider/dist/rzslider.js', - 'public/lib/angular-resource/angular-resource.js', - 'public/lib/angular-animate/angular-animate.js', - 'public/lib/angular-messages/angular-messages.js', - 'public/lib/angular-ui-router/release/angular-ui-router.js', - 'public/lib/angular-ui-utils/ui-utils.js', - 'public/lib/angular-file-upload/angular-file-upload.js', - 'public/lib/angular-cache/dist/angular-cache.js', - 'public/lib/q/q.js', - 'public/lib/owasp-password-strength-test/owasp-password-strength-test.js', - 'public/lib/angular-bootstrap/ui-bootstrap.min.js', - 'public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js', - 'public/lib/moment/min/moment.min.js', - 'public/lib/sweetalert/dist/sweetalert.min.js', - 'public/lib/ngSweetAlert/SweetAlert.min.js', - 'public/lib/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js' + 'node_modules/@bower_components/api-check/dist/api-check.js', + 'node_modules/@bower_components/jquery/dist/jquery.min.js', + 'node_modules/@bower_components/bootstrap/dist/js/bootstrap.min.js', + 'node_modules/@bower_components/angular/angular.js', + 'node_modules/@bower_components/angular-formly/dist/formly.js', + 'node_modules/@bower_components/angular-formly-templates-bootstrap/dist/angular-formly-templates-bootstrap.js', + 'node_modules/@bower_components/angularjs-slider/dist/rzslider.js', + 'node_modules/@bower_components/angular-resource/angular-resource.js', + 'node_modules/@bower_components/angular-animate/angular-animate.js', + 'node_modules/@bower_components/angular-messages/angular-messages.js', + 'node_modules/@bower_components/angular-ui-router/release/angular-ui-router.js', + 'node_modules/@bower_components/angular-ui-utils/ui-utils.js', + 'node_modules/@bower_components/angular-file-upload/dist/angular-file-upload.js', + 'node_modules/@bower_components/angular-cache/dist/angular-cache.js', + 'node_modules/@bower_componentsb/q/q.js', + 'node_modules/@bower_components/owasp-password-strength-test/owasp-password-strength-test.js', + 'node_modules/@bower_components/angular-bootstrap/ui-bootstrap.min.js', + 'node_modules/@bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js', + 'node_modules/@bower_components/moment/min/moment.min.js', + 'node_modules/@bower_components/sweetalert/dist/sweetalert.min.js', + 'node_modules/@bower_components/ngSweetAlert/SweetAlert.min.js', + 'node_modules/@bower_components/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js' ], - tests: ['public/lib/angular-mocks/angular-mocks.js'] + tests: ['node_modules/@bower_components/angular-mocks/angular-mocks.js'] }, css: [ 'modules/*/client/css/*.css' diff --git a/config/env/default.js b/config/env/default.js index e713dab..bf38ccb 100644 --- a/config/env/default.js +++ b/config/env/default.js @@ -90,7 +90,7 @@ module.exports = { } }, seedDB: { - seed: process.env.MONGO_SEED === 'true' ? true : false, + seed: true,//process.env.MONGO_SEED === 'true' ? true : false, options: { logResults: process.env.MONGO_SEED_LOG_RESULTS === 'false' ? false : true, seedUser: { diff --git a/config/env/test.js b/config/env/test.js index d33aa40..2e0f3a2 100644 --- a/config/env/test.js +++ b/config/env/test.js @@ -1,3 +1,4 @@ + 'use strict'; var defaultEnvConfig = require('./default'); diff --git a/config/lib/app.js b/config/lib/app.js index d505989..3e6ca4b 100644 --- a/config/lib/app.js +++ b/config/lib/app.js @@ -1,54 +1,55 @@ -'use strict'; -/** - * Module dependencies. - */ -var config = require('../config'), - mongoose = require('./mongoose'), - express = require('./express'), - seed = require('./seed'), - chalk = require('chalk'); - -function seedDB() { - if (config.seedDB && config.seedDB.seed) { - console.log(chalk.bold.red('Warning: Database seeding is turned on')); - seed.start(); - } -} - -// Initialize Models -mongoose.loadModels(seedDB); -module.exports.loadModels = function loadModels() { - mongoose.loadModels(); -}; - -module.exports.init = function init(callback) { - mongoose.connect(function (db) { - // Initialize express - var app = express.init(db); - if (callback) callback(app, db, config); - }); -}; - -module.exports.start = function start(callback) { - var _this = this; - _this.init(function (app, db, config) { - // Start the app by listening on - app.listen(config.port, config.bindIp, function () { - // Logging initialization - console.log('--'); - console.log(chalk.green(config.app.title)); - console.log(chalk.green('Environment:\t\t\t' + process.env.NODE_ENV)); - console.log(chalk.green('Port:\t\t\t\t' + config.port)); - console.log(chalk.green('Database:\t\t\t\t' + config.db.uri)); - if (process.env.NODE_ENV === 'secure') { - console.log(chalk.green('HTTPs:\t\t\t\ton')); - } - console.log(chalk.green('App version:\t\t\t' + config.meanjs.version)); - if (config.meanjs['meanjs-version']) console.log(chalk.green( - 'MEAN.JS version:\t\t\t' + config.meanjs['meanjs-version'] - )); - console.log('--'); - if (callback) callback(app, db, config); - }); - }); -}; +'use strict'; + +/** + * Module dependencies. + */ +var config = require('../config'), + mongoose = require('./mongoose'), + express = require('./express'), + seed = require('./seed'), + chalk = require('chalk'); + +function seedDB() { + if (config.seedDB && config.seedDB.seed) { + console.log(chalk.bold.red('Warning: Database seeding is turned on')); + seed.start(); + } +} + +// Initialize Models +mongoose.loadModels(seedDB); +module.exports.loadModels = function loadModels() { + mongoose.loadModels(); +}; + +module.exports.init = function init(callback) { + mongoose.connect(function (db) { + // Initialize express + let app = express.init(db); + if (callback) callback(app, db, config); + }); +}; + +module.exports.start = function start(callback) { + let _this = this; + _this.init(function (app, db, config) { + // Start the app by listening on + app.listen(config.port, config.bindIp, function () { + // Logging initialization + console.log('--'); + console.log(chalk.green(config.app.title)); + console.log(chalk.green('Environment:\t\t\t' + process.env.NODE_ENV)); + console.log(chalk.green('Port:\t\t\t\t' + config.port)); + console.log(chalk.green('Database:\t\t\t\t' + config.db.uri)); + if (process.env.NODE_ENV === 'secure') { + console.log(chalk.green('HTTPs:\t\t\t\ton')); + } + console.log(chalk.green('App version:\t\t\t' + config.meanjs.version)); + if (config.meanjs['meanjs-version']) console.log(chalk.green( + 'MEAN.JS version:\t\t\t' + config.meanjs['meanjs-version'] + )); + console.log('--'); + if (callback) callback(app, db, config); + }); + }); +}; diff --git a/config/lib/express.js b/config/lib/express.js index f089d78..c93de8f 100644 --- a/config/lib/express.js +++ b/config/lib/express.js @@ -83,6 +83,8 @@ module.exports.initMiddleware = function (app) { app.locals.cache = 'memory'; } + app.use(express.static('./users/client/img/profile/uploads/')); + // Request body parsing middleware should be above methodOverride app.use(bodyParser.urlencoded({ extended: true @@ -112,6 +114,7 @@ module.exports.initViewEngine = function (app) { */ module.exports.initSession = function (app, db) { // Express MongoDB session storage + console.log(config.db.uri); app.use(session({ saveUninitialized: true, resave: true, @@ -233,7 +236,7 @@ module.exports.init = function (db) { // Initialize Express view engine this.initViewEngine(app); - + // Initialize Helmet security headers this.initHelmetHeaders(app); diff --git a/gulpfile.js b/gulpfile.js index 26e9c50..859aaf6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -31,11 +31,11 @@ gulp.task('env:dev', function () { gulp.task('env:prod', function () { process.env.NODE_ENV = 'production'; }); -// Nodemon task +// Nodemon task -- updated --debug arg to --inspect (deprecated) gulp.task('nodemon', function () { return plugins.nodemon({ script: 'server.js', - nodeArgs: ['--debug'], + nodeArgs: ['--inspect'], ext: 'js,html', watch: _.union(defaultAssets.server.views, defaultAssets.server.allJS, defaultAssets.server.config) }); diff --git a/modules/ctfEvents/client/controllers/ctfEvents-create.client.controller.js b/modules/ctfEvents/client/controllers/ctfEvents-create.client.controller.js index 38e1aeb..ffa3f30 100644 --- a/modules/ctfEvents/client/controllers/ctfEvents-create.client.controller.js +++ b/modules/ctfEvents/client/controllers/ctfEvents-create.client.controller.js @@ -69,10 +69,10 @@ angular.module('ctfEvents').controller('CreateEventsController', ['$scope', '$co }); CtfEvents.save(ctfEvent, function (response) { - $scope.socket.emit('invalidate', { id: response._id }) + $scope.socket.emit('invalidate', { id: response.data._id }) $scope.socket.emit('invalidateAll') - CtfEvents.get({ ctfEventId: response._id }).$promise.then(function (data) { console.info('grabbed ' + data) }) - $location.path('ctfEvents/' + response._id); + CtfEvents.get({ ctfEventId: response.data._id }).$promise.then(function (data) { console.info('grabbed ' + data) }) + $location.path('/ctfEvents/dash/' + response.data._id); }, function (errorResponse) { $scope.error = errorResponse.data.message; }); diff --git a/modules/ctfEvents/client/controllers/ctfEvents-list.client.controller.js b/modules/ctfEvents/client/controllers/ctfEvents-list.client.controller.js index 2466283..3115f58 100644 --- a/modules/ctfEvents/client/controllers/ctfEvents-list.client.controller.js +++ b/modules/ctfEvents/client/controllers/ctfEvents-list.client.controller.js @@ -11,14 +11,20 @@ angular.module('ctfEvents').controller('ListEventsController', ['$state', '$scop * Determines whether or not a user is registered for an event */ $scope.isRegistered = function (ctfEvent) { - return ctfEvent.users.indexOf(Authentication.user._id) > -1 ? 'ctfEvents.dashboard({ ctfEventId : ctfEvent._id })' : '-' + return ctfEvent.users.indexOf(Authentication.user._id) > -1 ? 'ctfEvents.dashboard({ ctfEventId : ctfEvent._id })' : 'false' } /* * Determines whether or not a user can register for an event + * --Update: stupid hack to actually get this working, wasn't before. Not sure why the HTML boolean recognition is so wack, + * but it's reading the hide as show, and nothing as hide :/ */ $scope.canRegister = function (ctfEvent) { - return ctfEvent.registrationStart < moment().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') && moment().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') < ctfEvent.registrationEnd + if((ctfEvent.registrationStart < moment().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')) && ((moment().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]') < ctfEvent.registrationEnd) || (!ctfEvent.registrationEnd)) && (ctfEvent.users.indexOf(Authentication.user._id) <= -1)) { + return 'ng-hide'; + } else { + return ''; + } } /* diff --git a/modules/ctfEvents/client/views/upcoming-events-ctfEvents.client.view.html b/modules/ctfEvents/client/views/upcoming-events-ctfEvents.client.view.html index ccd41e3..513d19e 100644 --- a/modules/ctfEvents/client/views/upcoming-events-ctfEvents.client.view.html +++ b/modules/ctfEvents/client/views/upcoming-events-ctfEvents.client.view.html @@ -10,13 +10,13 @@

Upcoming Events
+ ng-class="isRegistered(ctfEvent) === 'false' ? 'list-group-item disabled' : 'list-group-item'"> Created on
-

diff --git a/modules/ctfEvents/server/controllers/ctfEvents.server.controller.js b/modules/ctfEvents/server/controllers/ctfEvents.server.controller.js index b7ddb99..2b16fc8 100644 --- a/modules/ctfEvents/server/controllers/ctfEvents.server.controller.js +++ b/modules/ctfEvents/server/controllers/ctfEvents.server.controller.js @@ -11,7 +11,7 @@ var path = require('path'), errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')); exports.create = function (req, res) { - var ctfEvent = new CtfEvent(req.body.answers); + var ctfEvent = new CtfEvent(req.body); ctfEvent.save(function (err) { if (err) { return res.status(400).send({ diff --git a/modules/teams/client/controllers/teams.base.client.controller.js b/modules/teams/client/controllers/teams.base.client.controller.js index 0145a52..7b87b74 100644 --- a/modules/teams/client/controllers/teams.base.client.controller.js +++ b/modules/teams/client/controllers/teams.base.client.controller.js @@ -49,7 +49,7 @@ angular.module('teams') }) angular.forEach($scope.users, function (user) { if (user._id === message._id) { - user.joinRequestsFromUsers.push(message._id); + user.requestedToJoin.push(message._id); } }) }); diff --git a/modules/teams/server/controllers/teams.server.controller.js b/modules/teams/server/controllers/teams.server.controller.js index bafe18e..8abddab 100644 --- a/modules/teams/server/controllers/teams.server.controller.js +++ b/modules/teams/server/controllers/teams.server.controller.js @@ -1,191 +1,191 @@ -'use strict'; - -var path = require('path'), - mongoose = require('mongoose'), - Team = mongoose.model('Team'), - User = mongoose.model('User'), - errorHandler = require(path.resolve( - './modules/core/server/controllers/errors.server.controller')); - -var addUserToTeam = function (user, team) { - user.teams.push(team._id); - if (user.roles.indexOf('teamCaptain') === -1) { - user.roles.push('teamCaptain'); - } - user.save(function (err) { - if (err) { - return res.status(422) - .send({ - message: errorHandler.getErrorMessage(err) - }); - } - }) -} - -exports.create = function (req, res) { - var team = new Team(req.body); - team.save(function (err) { - if (!err) { - addUserToTeam(req.user, team); - res.json(req.team); - } else { - return res.status(422) - .send({ - message: errorHandler.getErrorMessage(err) - }); - } - }) -} - -exports.read = function (req, res) { - Team.find({ - '_id': { - $in: req.params.teamId - } - }).exec(function (err, teams) { - if (err) { - return res.status(422) - .send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - res.json(teams[0]); - } - }); -}; - -exports.list = function (req, res) { - Team.find() - .sort('-created') - .exec(function (err, teams) { - if (err) { - return res.status(422) - .send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - res.json(teams); - } - }); -}; - -exports.update = function (req, res) { - Team.update({ - '_id': req.body._id - },{ - teamName : req.body.teamName, - joinRequestsFromUsers : req.body.joinRequestsFromUsers, - joinRequestsToUsers : req.body.joinRequestsToUsers, - members : req.body.members - },function (err, found, team) { - if (err) { - return res.status(422).send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - res.json(team); - } - }); -}; - -exports.delete = function (req, res) { - Team.findOne({ - '_id': req.params.teamId - }).exec(function (err, team) { - User.find({ - '_id': { - $in: team.members - } - }, function (err, users) { - if (err) { - return res.status(422).send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - for (var index = 0, len = users.length; index < len; ++index) { - adjustRoles(users[index], team) - } - } - }); - - User.find({ - '_id': { - $in: team.joinRequestsToUsers - } - }, function (err, users) { - if (err) { - return res.status(422).send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - for (var index = 0, len = users.length; index < len; ++index) { - removeUserRequests(users[index], team) - } - } - }); - - User.find({ - '_id': { - $in: team.joinRequestsFromUsers - } - }, function (err, users) { - if (err) { - return res.status(422).send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - for (var index = 0, len = users.length; index < len; ++index) { - removeCaptainRequests(users[index], team) - } - } - }); - - team.remove(function (err) { - if (err) { - return res.status(422).send({ - message: errorHandler.getErrorMessage(err) - }); - } else { - res.json(team); - } - }); - }) -}; - -var adjustRoles = function (user, team) { - var index = user.teams.indexOf(team._id); - user.teams.splice(index, 1); - if (user.teams.length === 0) { - user.roles.splice(user.roles.indexOf('teamMember'), 1); - } - Team.find({ - '_id': { $in: user.teams } - }, function (err, teams) { - var captain = false; - for (var index = 0, len = teams.length; index < len; ++index) { - if (user._id = teams[index].teamCaptain) { - captain = true; - } - } - if (!captain && user.roles.indexOf('teamCaptain') > 0) { - user.roles.splice(user.roles.indexOf('teamCaptain'), 1); - } - user.save(); - }); -} - -var removeUserRequests = function (user, team) { - var index = user.requestedToJoin.indexOf(team._id); - if (index > -1) { - user.requestedToJoin.splice(index, 1); - } - user.save(); -} - -var removeCaptainRequests = function (user, team) { - var index = user.wasAskedToJoin.indexOf(team._id); - if (index > -1) { - user.wasAskedToJoin.splice(index, 1); - } - user.save(); -} +'use strict'; + +var path = require('path'), + mongoose = require('mongoose'), + Team = mongoose.model('Team'), + User = mongoose.model('User'), + errorHandler = require(path.resolve( + './modules/core/server/controllers/errors.server.controller')); + +var addUserToTeam = function (user, team, res) { + user.teams = user.teams.concat([team._id]); + if (user.roles.indexOf('teamCaptain') === -1) { + user.roles = user.roles.concat(['teamCaptain']); + } + user.save(function (err) { + if (err) { + return res.status(422) + .send({ + message: errorHandler.getErrorMessage(err) + }); + } + }) +} + +exports.create = function (req, res) { + var team = new Team(req.body); + team.save(function (err) { + if (!err) { + addUserToTeam(req.user, team, res); + res.json(team); + } else { + return res.status(422) + .send({ + message: errorHandler.getErrorMessage(err) + }); + } + }) +} + +exports.read = function (req, res) { + Team.find({ + '_id': { + $in: req.params.teamId + } + }).exec(function (err, teams) { + if (err) { + return res.status(422) + .send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(teams[0]); + } + }); +}; + +exports.list = function (req, res) { + Team.find() + .sort('-created') + .exec(function (err, teams) { + if (err) { + return res.status(422) + .send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(teams); + } + }); +}; + +exports.update = function (req, res) { + Team.update({ + '_id': req.body._id + },{ + teamName : req.body.teamName, + joinRequestsFromUsers : req.body.joinRequestsFromUsers, + joinRequestsToUsers : req.body.joinRequestsToUsers, + members : req.body.members + },function (err, found, team) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(team); + } + }); +}; + +exports.delete = function (req, res) { + Team.findOne({ + '_id': req.params.teamId + }).exec(function (err, team) { + User.find({ + '_id': { + $in: team.members + } + }, function (err, users) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + for (var index = 0, len = users.length; index < len; ++index) { + adjustRoles(users[index], team) + } + } + }); + + User.find({ + '_id': { + $in: team.joinRequestsToUsers + } + }, function (err, users) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + for (var index = 0, len = users.length; index < len; ++index) { + removeUserRequests(users[index], team) + } + } + }); + + User.find({ + '_id': { + $in: team.joinRequestsFromUsers + } + }, function (err, users) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + for (var index = 0, len = users.length; index < len; ++index) { + removeCaptainRequests(users[index], team) + } + } + }); + + team.remove(function (err) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(team); + } + }); + }) +}; + +var adjustRoles = function (user, team) { + var index = user.teams.indexOf(team._id); + user.teams.splice(index, 1); + if (user.teams.length === 0) { + user.roles.splice(user.roles.indexOf('teamMember'), 1); + } + Team.find({ + '_id': { $in: user.teams } + }, function (err, teams) { + var captain = false; + for (var index = 0, len = teams.length; index < len; ++index) { + if (user._id = teams[index].teamCaptain) { + captain = true; + } + } + if (!captain && user.roles.indexOf('teamCaptain') > 0) { + user.roles.splice(user.roles.indexOf('teamCaptain'), 1); + } + user.save(); + }); +} + +var removeUserRequests = function (user, team) { + var index = user.requestedToJoin.indexOf(team._id); + if (index > -1) { + user.requestedToJoin.splice(index, 1); + } + user.save(); +} + +var removeCaptainRequests = function (user, team) { + var index = user.wasAskedToJoin.indexOf(team._id); + if (index > -1) { + user.wasAskedToJoin.splice(index, 1); + } + user.save(); +} diff --git a/modules/userAuths/server/config/strategy/facebook.strategy.config.js b/modules/userAuths/server/config/strategy/facebook.strategy.config.js index 7aad06f..e3fc843 100644 --- a/modules/userAuths/server/config/strategy/facebook.strategy.config.js +++ b/modules/userAuths/server/config/strategy/facebook.strategy.config.js @@ -17,30 +17,30 @@ module.exports = function (userAuth) { profileFields: ['id', 'name', 'displayName', 'emails', 'photos'], passReqToCallback: true }, - function (req, accessToken, refreshToken, profile, done) { - // Set the provider data and include tokens - var providerData = profile._json; - providerData.accessToken = accessToken; - providerData.refreshToken = refreshToken; + function (req, accessToken, refreshToken, profile, done) { + // Set the provider data and include tokens + let providerData = profile._json; + providerData.accessToken = accessToken; + providerData.refreshToken = refreshToken; - // Create the user OAuth profile - var providerUserProfile = { - firstName: profile.name.givenName, - lastName: profile.name.familyName, - displayName: profile.displayName, - email: profile.emails ? profile.emails[0].value : undefined, - username: profile.username || generateUsername(profile), - profileImageURL: (profile.id) ? '//graph.facebook.com/' + profile.id + '/picture?type=large' : undefined, - provider: 'facebook', - providerIdentifierField: 'id', - providerData: providerData - }; + // Create the user OAuth profile + let providerUserProfile = { + firstName: profile.name.givenName, + lastName: profile.name.familyName, + displayName: profile.displayName, + email: profile.emails ? profile.emails[0].value : undefined, + username: profile.username || generateUsername(profile), + profileImageURL: (profile.id) ? '//graph.facebook.com/' + profile.id + '/picture?type=large' : undefined, + provider: 'facebook', + providerIdentifierField: 'id', + providerData: providerData + }; - // Save the user OAuth profile - users.saveOAuthUserProfile(req, providerUserProfile, done); + // Save the user OAuth profile + users.saveOAuthUserProfile(req, providerUserProfile, done); function generateUsername(profile) { - var username = ''; + let username = ''; if (profile.emails) { username = profile.emails[0].value.split('@')[0]; diff --git a/modules/users/client/controllers/settings/change-profile-picture.client.controller.js b/modules/users/client/controllers/settings/change-profile-picture.client.controller.js index 36f5bb1..1d930c0 100644 --- a/modules/users/client/controllers/settings/change-profile-picture.client.controller.js +++ b/modules/users/client/controllers/settings/change-profile-picture.client.controller.js @@ -2,14 +2,58 @@ angular.module('users').controller('ChangeProfilePictureController', ['$scope', '$timeout', '$window', 'Authentication', 'FileUploader', function ($scope, $timeout, $window, Authentication, FileUploader) { + $scope.user = Authentication.user; $scope.imageURL = $scope.user.profileImageURL; // Create file uploader instance $scope.uploader = new FileUploader({ - url: 'api/users/picture' + url: '/api/users/picture', + disableMultipart: true }); + const form = document.getElementById( "image_form" ); + form.addEventListener( "submit", function ( event ) { + event.preventDefault(); + + sendData(); + } ); + + function sendData() { + const XHR = new XMLHttpRequest(); + + // Bind the FormData object and the form element + const FD = new FormData( form ); + + // Define what happens on successful data submission + XHR.addEventListener( "load", function(response) { + // Populate user object + $scope.user = Authentication.user = JSON.parse(response.target.response); + + // Clear upload buttons + $scope.cancelUpload(true); + //Janky hack to successfully show the error/success text + $("#change_profile_pic").trigger("click"); + } ); + + // Define what happens in case of error + XHR.addEventListener( "error", function(response) { + // Clear upload buttons + $scope.cancelUpload(false); + + // Show error message + $scope.error = response.target.response; + //Janky hack to successfully show the error/success text + $("#change_profile_pic").trigger("click"); + } ); + + // Set up our request + XHR.open( "POST", "/api/users/picture" ); + + // The data sent is what the user provided in the form + XHR.send( FD ); + } + // Set file uploader image filter $scope.uploader.filters.push({ name: 'imageFilter', @@ -57,14 +101,14 @@ angular.module('users').controller('ChangeProfilePictureController', ['$scope', // Change user profile picture $scope.uploadProfilePicture = function () { // Clear messages - $scope.success = $scope.error = null; - - // Start upload - $scope.uploader.uploadAll(); + //$scope.success = $scope.error = null; + //$scope.uploader.uploadAll(); }; // Cancel the upload process - $scope.cancelUpload = function () { + $scope.cancelUpload = function (success) { + // Show success message + $scope.success = success; $scope.uploader.clearQueue(); $scope.imageURL = $scope.user.profileImageURL; }; diff --git a/modules/users/client/views/settings/change-profile-picture.client.view.html b/modules/users/client/views/settings/change-profile-picture.client.view.html index b632fee..0c0b260 100644 --- a/modules/users/client/views/settings/change-profile-picture.client.view.html +++ b/modules/users/client/views/settings/change-profile-picture.client.view.html @@ -1,17 +1,21 @@
+
-