diff --git a/modules/core/client/app/trans-string-en.js b/modules/core/client/app/trans-string-en.js index 212d52b0..26943796 100644 --- a/modules/core/client/app/trans-string-en.js +++ b/modules/core/client/app/trans-string-en.js @@ -419,6 +419,13 @@ HOW_TO_GET_LEVEL: 'How to count user level?', HOW_TO_GET_SCORE: 'How to get score number?' }, + EXCHANGE_INVITATION: 'Exchange an invitation ({{score}} scores)', + EXCHANGE_INVITATION_CONFIRM_OK: 'Exchange', + EXCHANGE_INVITATION_CONFIRM_CANCEL: 'Cancel', + EXCHANGE_INVITATION_CONFIRM_HEADER_TEXT: 'Exchange Confirm', + EXCHANGE_INVITATION_CONFIRM_BODY_TEXT: 'Are you sure want to exchange an invitation with {{score}} scores?', + EXCHANGE_INVITATION_SUCCESSFULLY: 'Exchange invitation successfully', + EXCHANGE_INVITATION_ERROR: 'Exchange invitation failed', //user message box MESSAGES_INBOX: 'Messages Inbox', diff --git a/modules/core/client/app/trans-string-zh.js b/modules/core/client/app/trans-string-zh.js index f13f028a..56feb754 100644 --- a/modules/core/client/app/trans-string-zh.js +++ b/modules/core/client/app/trans-string-zh.js @@ -419,6 +419,13 @@ HOW_TO_GET_LEVEL: '怎么计算用户级别?', HOW_TO_GET_SCORE: '怎么取得用户积分?' }, + EXCHANGE_INVITATION: '兑换一个邀请 ({{score}} 积分)', + EXCHANGE_INVITATION_CONFIRM_OK: '兑换', + EXCHANGE_INVITATION_CONFIRM_CANCEL: '取消', + EXCHANGE_INVITATION_CONFIRM_HEADER_TEXT: '兑换确认', + EXCHANGE_INVITATION_CONFIRM_BODY_TEXT: '您确定要花 {{score}} 积分来兑换一个限时邀请么?', + EXCHANGE_INVITATION_SUCCESSFULLY: '限时邀请兑换成功', + EXCHANGE_INVITATION_ERROR: '限时邀请兑换失败', //user message box MESSAGES_INBOX: '消息收件箱', diff --git a/modules/core/client/controllers/header.client.controller.js b/modules/core/client/controllers/header.client.controller.js index d3587fae..f4712204 100644 --- a/modules/core/client/controllers/header.client.controller.js +++ b/modules/core/client/controllers/header.client.controller.js @@ -26,6 +26,11 @@ $scope.$on('$stateChangeSuccess', stateChangeSuccess); + $scope.$on('auth-user-score-changed', function(event, args) { + vm.user = Authentication.user; + vm.scoreLevelData = vm.user ? ScoreLevelService.getScoreLevelJson(vm.user.score) : undefined; + }); + function stateChangeSuccess() { // Collapsing the menu after navigation vm.isCollapsed = false; diff --git a/modules/core/client/directives/score-level.client.directive.js b/modules/core/client/directives/score-level.client.directive.js index 64443bae..5dc5f6f0 100644 --- a/modules/core/client/directives/score-level.client.directive.js +++ b/modules/core/client/directives/score-level.client.directive.js @@ -15,6 +15,8 @@ function link(scope, element, attrs) { scope.$watch(attrs.scoreLevel, function (level) { + console.log('level changed to ' + level); + var l = 'L' + (level ? level : 0); l = '' + l + ''; diff --git a/modules/invitations/server/controllers/invitations.server.controller.js b/modules/invitations/server/controllers/invitations.server.controller.js index 35f719d7..327147de 100644 --- a/modules/invitations/server/controllers/invitations.server.controller.js +++ b/modules/invitations/server/controllers/invitations.server.controller.js @@ -27,7 +27,21 @@ exports.create = function (req, res) { message: errorHandler.getErrorMessage(err) }); } else { - res.json(invitation); + //res.json(invitation); + var user = req.user; + user.update({ + $set: {score: user.score - config.meanTorrentConfig.invite.score_exchange} + }).exec(function (err, result) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + user.score = user.score - config.meanTorrentConfig.invite.score_exchange; + res.json(user); + } + }); + } }); }; diff --git a/modules/invitations/server/models/invitation.server.model.js b/modules/invitations/server/models/invitation.server.model.js index ea893f25..b55c6fd2 100644 --- a/modules/invitations/server/models/invitation.server.model.js +++ b/modules/invitations/server/models/invitation.server.model.js @@ -7,13 +7,6 @@ var mongoose = require('mongoose'), Schema = mongoose.Schema, validator = require('validator'); -/** - * A Validation function for local strategy email - */ -var validateLocalStrategyEmail = function (email) { - return validator.isEmail(email, {require_tld: false}); -}; - /** * Peer Schema */ @@ -28,12 +21,11 @@ var InvitationSchema = new Schema({ }, to_email: { type: String, - unique: 'email already exists', - required: 'Please fill in a email address', + //unique: 'email already exists', + //required: 'Please fill in a email address', lowercase: true, trim: true, - default: '', - validate: [validateLocalStrategyEmail, 'Please fill a valid email address'] + default: '' }, status: { type: Number, diff --git a/modules/users/client/controllers/score/score.client.controller.js b/modules/users/client/controllers/score/score.client.controller.js index 9de4fc49..3bfd05de 100644 --- a/modules/users/client/controllers/score/score.client.controller.js +++ b/modules/users/client/controllers/score/score.client.controller.js @@ -5,13 +5,14 @@ .module('users') .controller('ScoreController', ScoreController); - ScoreController.$inject = ['$scope', '$state', '$translate', '$timeout', 'Authentication', '$window', 'ScoreLevelService', 'getStorageLangService', - 'MeanTorrentConfig']; + ScoreController.$inject = ['$rootScope', '$scope', '$state', '$translate', '$timeout', 'Authentication', '$window', 'ScoreLevelService', 'getStorageLangService', + 'MeanTorrentConfig', 'ModalConfirmService', 'NotifycationService', 'InvitationsService']; - function ScoreController($scope, $state, $translate, $timeout, Authentication, $window, ScoreLevelService, getStorageLangService, MeanTorrentConfig) { + function ScoreController($rootScope, $scope, $state, $translate, $timeout, Authentication, $window, ScoreLevelService, getStorageLangService, MeanTorrentConfig, + ModalConfirmService, NotifycationService, InvitationsService) { var vm = this; vm.scoreConfig = MeanTorrentConfig.meanTorrentConfig.score; - + vm.inviteConfig = MeanTorrentConfig.meanTorrentConfig.invite; vm.lang = getStorageLangService.getLang(); vm.user = Authentication.user; @@ -22,11 +23,51 @@ $state.go('authentication.signin'); } + $scope.$on('auth-user-score-changed', function(event, args) { + vm.user = Authentication.user; + vm.scoreLevelData = vm.user ? ScoreLevelService.getScoreLevelJson(vm.user.score) : undefined; + }); + /** * init */ vm.init = function () { vm.scoreLevelData = ScoreLevelService.getScoreLevelJson(vm.user.score); }; + + /** + * exchangeInvitation + */ + vm.exchangeInvitation = function () { + var modalOptions = { + closeButtonText: $translate.instant('EXCHANGE_INVITATION_CONFIRM_CANCEL'), + actionButtonText: $translate.instant('EXCHANGE_INVITATION_CONFIRM_OK'), + headerText: $translate.instant('EXCHANGE_INVITATION_CONFIRM_HEADER_TEXT'), + bodyText: $translate.instant('EXCHANGE_INVITATION_CONFIRM_BODY_TEXT', {score: vm.inviteConfig.score_exchange}) + }; + + ModalConfirmService.showModal({}, modalOptions) + .then(function (result) { + var invitation = new InvitationsService(); + + invitation.$save(function (response) { + successCallback(response); + }, function (errorResponse) { + errorCallback(errorResponse); + }); + + function successCallback(res) { + if (res._id === vm.user._id) { + vm.user = Authentication.user = res; + $rootScope.$broadcast('auth-user-score-changed'); + } + NotifycationService.showSuccessNotify('EXCHANGE_INVITATION_SUCCESSFULLY'); + } + + function errorCallback(res) { + NotifycationService.showErrorNotify(res.data.message, 'EXCHANGE_INVITATION_ERROR'); + } + }); + }; } }()); diff --git a/modules/users/client/views/score/detail.client.view.html b/modules/users/client/views/score/detail.client.view.html index 407b558a..f71240c8 100644 --- a/modules/users/client/views/score/detail.client.view.html +++ b/modules/users/client/views/score/detail.client.view.html @@ -23,6 +23,15 @@ +