From e84880d3e872e85af3e29e0a0381a6a4ad8b4551 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 7 Dec 2014 14:35:09 +0100 Subject: [PATCH] feat(flag-message): add server methods --- public/js/controllers/groupsCtrl.js | 45 ++++++++++++++------------ public/js/services/groupServices.js | 1 + src/controllers/groups.js | 16 +++++++++ src/models/group.js | 14 +++++++- src/routes/apiv2.coffee | 11 +++++++ views/options/social/chat-message.jade | 2 +- views/shared/modals/members.jade | 2 +- 7 files changed, 67 insertions(+), 24 deletions(-) diff --git a/public/js/controllers/groupsCtrl.js b/public/js/controllers/groupsCtrl.js index a8f21adbbd..dfd5718247 100644 --- a/public/js/controllers/groupsCtrl.js +++ b/public/js/controllers/groupsCtrl.js @@ -105,24 +105,11 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $rootScope.openModal('private-message',{controller:'MemberModalCtrl'}); }); } - $scope.flagChatMessage = function(message) { - if(!message.flags) message.flags = {}; - if(message.flags[User.user._id]) - Notification.text(window.env.t('abuseAlreadyReported')); - else { - $scope.abuseObject = message; - Members.selectMember(message.uuid, function(){ - $rootScope.openModal('abuse-flag',{controller:'MemberModalCtrl', - scope: $scope - }); - }); - } - } } ]) - .controller("MemberModalCtrl", ['$scope', '$rootScope', 'Members', 'Shared', '$http', 'Notification', - function($scope, $rootScope, Members, Shared, $http, Notification) { + .controller("MemberModalCtrl", ['$scope', '$rootScope', 'Members', 'Shared', '$http', 'Notification', 'Groups', + function($scope, $rootScope, Members, Shared, $http, Notification, Groups) { $scope.timestamp = function(timestamp){ return moment(timestamp).format('MM/DD/YYYY'); } @@ -152,12 +139,12 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $scope.$close(); }) } - $scope.reportAbuse = function(reporter, message) { + $scope.reportAbuse = function(reporter, message, groupId) { message.flags[reporter._id] = true; - // @TODO @paglias API Call goes here - Notification.text(window.env.t('abuseReported')); - $rootScope.User.sync(); - $scope.$close(); + Groups.Group.flagChatMessage({gid: groupId, messageId: message.id}, undefined, function(data){ + Notification.text(window.env.t('abuseReported')); + $scope.$close(); + }); } } ]) @@ -217,7 +204,7 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' }); }]) - .controller('ChatCtrl', ['$scope', 'Groups', 'User', '$http', 'ApiUrlService', 'Notification', function($scope, Groups, User, $http, ApiUrlService, Notification){ + .controller('ChatCtrl', ['$scope', 'Groups', 'User', '$http', 'ApiUrlService', 'Notification', 'Members', '$rootScope', function($scope, Groups, User, $http, ApiUrlService, Notification, Members, $rootScope){ $scope.message = {content:''}; $scope._sending = false; @@ -282,6 +269,22 @@ habitrpg.controller("GroupsCtrl", ['$scope', '$rootScope', 'Shared', 'Groups', ' $http.post(ApiUrlService.get() + '/api/v2/groups/' + group._id + '/chat/' + message.id + '/like'); } + $scope.flagChatMessage = function(groupId,message) { + if(!message.flags) message.flags = {}; + if(message.flags[User.user._id]) + Notification.text(window.env.t('abuseAlreadyReported')); + else { + $scope.abuseObject = message; + $scope.groupId = groupId; + Members.selectMember(message.uuid, function(){ + $rootScope.openModal('abuse-flag',{ + controller:'MemberModalCtrl', + scope: $scope + }); + }); + } + } + $scope.sync = function(group){ group.$get(); } diff --git a/public/js/services/groupServices.js b/public/js/services/groupServices.js index 42dd787846..45ecc8b971 100644 --- a/public/js/services/groupServices.js +++ b/public/js/services/groupServices.js @@ -13,6 +13,7 @@ angular.module('groupServices', ['ngResource']). //query: {method: "GET", isArray:false}, postChat: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat'}, deleteChatMessage: {method: "DELETE", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat/:messageId'}, + flagChatMessage: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/chat/:messageId/flag'}, join: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/join'}, leave: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/leave'}, invite: {method: "POST", url: ApiUrlService.get() + '/api/v2/groups/:gid/invite'}, diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 50272cdab2..0be99d8fae 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -256,6 +256,22 @@ api.deleteChatMessage = function(req, res, next){ }); } +api.flagChatMessage = function(req, res, next){ + var user = res.locals.user + var group = res.locals.group; + var message = _.find(group.chat, {id: req.params.mid}); + + if(!message) return res.json(404, {err: "Message not found!"}); + if(message.uuid == user._id) return res.json(401, {err: "Can't report your own message."}); + + message.flags[user._id] = true; + group.markModified('chat'); + group.save(function(err,_saved){ + if(err) return next(err); + return res.send(204); + }); +} + api.seenMessage = function(req,res,next){ // Skip the auth step, we want this to be fast. If !found with uuid/token, then it just doesn't save // Check for req.params.gid to exist diff --git a/src/models/group.js b/src/models/group.js index af5e22dab2..3e00370b67 100644 --- a/src/models/group.js +++ b/src/models/group.js @@ -99,7 +99,7 @@ var chatDefaults = module.exports.chatDefaults = function(msg,user){ text: msg, timestamp: +new Date, likes: {}, - flags: {} // for @paglias, @crookedneighbor added this. + flags: {} }; if (user) { _.defaults(message, { @@ -317,6 +317,18 @@ GroupSchema.statics.bossQuest = function(user, progress, cb) { }) } +GroupSchema.methods.toJSON = function() { + var doc = this.toObject(); + if(doc.chat){ + doc.chat.forEach(function(msg){ + msg.flags = {}; + }); + } + + return doc; +}; + + module.exports.schema = GroupSchema; var Group = module.exports.model = mongoose.model("Group", GroupSchema); diff --git a/src/routes/apiv2.coffee b/src/routes/apiv2.coffee index 415577d565..5708bfac51 100644 --- a/src/routes/apiv2.coffee +++ b/src/routes/apiv2.coffee @@ -577,6 +577,17 @@ module.exports = (swagger, v2) -> middleware: [auth.auth, i18n.getUserLanguage, groups.attachGroup] action: groups.likeChatMessage + "/groups/{gid}/chat/{mid}/flag": + spec: + method: 'POST' + description: "Flag a chat message" + parameters: [ + path 'gid','Group id','string' + path 'mid','Message id','string' + ] + middleware: [auth.auth, i18n.getUserLanguage, groups.attachGroup] + action: groups.flagChatMessage + # --------------------------------- # Members # --------------------------------- diff --git a/views/options/social/chat-message.jade b/views/options/social/chat-message.jade index ab0dc37e0d..bbc4fed1db 100644 --- a/views/options/social/chat-message.jade +++ b/views/options/social/chat-message.jade @@ -26,7 +26,7 @@ mixin chatMessages(inbox) |         a(ng-click='#{inbox? "user.ops.deletePM({params:{id:message.$key}})" : "deleteChatMessage(group, message)"}', ng-if='#{inbox ? "true" : ":: user.contributor.admin || message.uuid == user.id"}') span.glyphicon.glyphicon-trash(tooltip=env.t('delete')) - a(ng-click="flagChatMessage(message)", ng-if='#{inbox ? "true" : ":: message.uuid != user.id && message.uuid != \'system\'"}') + a(ng-click="flagChatMessage(group._id, message)", ng-if='#{inbox ? "true" : ":: message.uuid != user.id && message.uuid != \'system\'"}') span.glyphicon.glyphicon-flag(tooltip="{{message.flags[user._id] ? env.t('abuseAlreadyReported') : env.t('abuseFlag')}}" ng-class='message.flags[user._id] ? "text-danger" : ""') span.float-label a.label.label-default.chat-message(ng-if=':: message.user', ng-class='::userLevelStyleFromLevel(message.contributor.level, message.backer.npc, style)', ng-click='clickMember(message.uuid, true)') diff --git a/views/shared/modals/members.jade b/views/shared/modals/members.jade index 3513b8b433..3dc12dfe1a 100644 --- a/views/shared/modals/members.jade +++ b/views/shared/modals/members.jade @@ -99,4 +99,4 @@ script(type='text/ng-template', id='modals/abuse-flag.html') p!=env.t('abuseFlagModalBody', {firstLinkStart: "", secondLinkStart: "", linkEnd: ""}) .modal-footer button.btn.btn-primary(ng-click='$close()')=env.t('cancel') - button.btn.btn-default(ng-click='reportAbuse(user, abuseObject)')=env.t("abuseFlagModalButton") + button.btn.btn-default(ng-click='reportAbuse(user, abuseObject, groupId)')=env.t("abuseFlagModalButton")