From 374d11b0e4f23f6e29f950c191f4da09fbfcb23a Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 5 Apr 2016 12:02:00 +0200 Subject: [PATCH] v3 adapt v2: port chat routes and group.update --- test/api/v2/groups/POST-groups_id.test.js | 3 +- .../groups/chat/DELETE-groups_id_chat.test.js | 2 +- .../v2/groups/chat/GET-groups_id_chat.test.js | 2 +- .../groups/chat/POST-groups_id_chat.test.js | 2 +- .../POST-groups_id_chat_id_clearflags.test.js | 2 +- .../chat/POST-groups_id_chat_id_flag.test.js | 2 +- .../chat/POST-groups_id_chat_id_like.test.js | 2 +- .../api-integration/v2/object-generators.js | 21 +++++++++++++- website/src/controllers/api-v2/groups.js | 29 ++++++++++++------- 9 files changed, 47 insertions(+), 18 deletions(-) diff --git a/test/api/v2/groups/POST-groups_id.test.js b/test/api/v2/groups/POST-groups_id.test.js index ebdf5c0305..8a6dbba1a0 100644 --- a/test/api/v2/groups/POST-groups_id.test.js +++ b/test/api/v2/groups/POST-groups_id.test.js @@ -1,10 +1,11 @@ import { generateGroup, + createAndPopulateGroup, generateUser, translate as t, } from '../../../helpers/api-integration/v2'; -xdescribe('POST /groups/:id', () => { +describe('POST /groups/:id', () => { context('user is not the leader of the group', () => { let user, otherUser, groupUserDoesNotOwn; diff --git a/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js b/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js index 8f0506723d..dc575b0ec6 100644 --- a/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js +++ b/test/api/v2/groups/chat/DELETE-groups_id_chat.test.js @@ -3,7 +3,7 @@ import { translate as t, } from '../../../../helpers/api-integration/v2'; -xdescribe('DELETE /groups/:id/chat', () => { +describe('DELETE /groups/:id/chat', () => { let group, message, user; beforeEach(async () => { diff --git a/test/api/v2/groups/chat/GET-groups_id_chat.test.js b/test/api/v2/groups/chat/GET-groups_id_chat.test.js index 0a5acc5a0c..d6dc691af7 100644 --- a/test/api/v2/groups/chat/GET-groups_id_chat.test.js +++ b/test/api/v2/groups/chat/GET-groups_id_chat.test.js @@ -2,7 +2,7 @@ import { createAndPopulateGroup, } from '../../../../helpers/api-integration/v2'; -xdescribe('GET /groups/:id/chat', () => { +describe('GET /groups/:id/chat', () => { context('group with multiple messages', () => { let group, member, user; diff --git a/test/api/v2/groups/chat/POST-groups_id_chat.test.js b/test/api/v2/groups/chat/POST-groups_id_chat.test.js index d9803e0a3a..cc280077aa 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat.test.js @@ -3,7 +3,7 @@ import { translate as t, } from '../../../../helpers/api-integration/v2'; -xdescribe('POST /groups/:id/chat', () => { +describe('POST /groups/:id/chat', () => { let group, user; beforeEach(async () => { diff --git a/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js b/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js index 6cd3b8aec0..0b6a54c429 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat_id_clearflags.test.js @@ -4,7 +4,7 @@ import { translate as t, } from '../../../../helpers/api-integration/v2'; -xdescribe('POST /groups/:id/chat/:id/clearflags', () => { +describe('POST /groups/:id/chat/:id/clearflags', () => { let guild; beforeEach(async () => { diff --git a/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js b/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js index 4133b7c77f..cd813061b2 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat_id_flag.test.js @@ -4,7 +4,7 @@ import { translate as t, } from '../../../../helpers/api-integration/v2'; -xdescribe('POST /groups/:id/chat/:id/flag', () => { +describe('POST /groups/:id/chat/:id/flag', () => { context('another member\'s message', () => { let group, member, message, user; diff --git a/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js b/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js index 83f0c4901e..9c8ff4c586 100644 --- a/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js +++ b/test/api/v2/groups/chat/POST-groups_id_chat_id_like.test.js @@ -4,7 +4,7 @@ import { translate as t, } from '../../../../helpers/api-integration/v2'; -xdescribe('POST /groups/:id/chat/:id/like', () => { +describe('POST /groups/:id/chat/:id/like', () => { context('another member\'s message', () => { let group, member, message, user; diff --git a/test/helpers/api-integration/v2/object-generators.js b/test/helpers/api-integration/v2/object-generators.js index e30f96c7b8..96013ffabe 100644 --- a/test/helpers/api-integration/v2/object-generators.js +++ b/test/helpers/api-integration/v2/object-generators.js @@ -1,5 +1,6 @@ import { times, + map, } from 'lodash'; import Q from 'q'; import { v4 as generateUUID } from 'uuid'; @@ -41,11 +42,29 @@ export async function generateGroup (leader, details = {}, update = {}) { details.privacy = details.privacy || 'private'; details.name = details.name || 'test group'; + let members; + + if (details.members) { + members = details.members; + delete details.members; + } + let group = await leader.post('/groups', details); let apiGroup = new ApiGroup(group); - await apiGroup.update(update); + const groupMembershipTypes = { + party: { 'party._id': group._id}, + guild: { guilds: [group._id] }, + }; + await Q.all( + map(members, (member) => { + return member.update(groupMembershipTypes[group.type]); + }) + ); + + await apiGroup.update(update); + await apiGroup.sync(); return apiGroup; } diff --git a/website/src/controllers/api-v2/groups.js b/website/src/controllers/api-v2/groups.js index f1e42a68da..4d6ddfc627 100644 --- a/website/src/controllers/api-v2/groups.js +++ b/website/src/controllers/api-v2/groups.js @@ -265,7 +265,7 @@ api.update = function(req, res, next) { return res.status(401).json({err: shared.i18n.t('messageGroupOnlyLeaderCanUpdate')}); 'name description logo logo leaderMessage leader leaderOnly'.split(' ').forEach(function(attr){ - group[attr] = req.body[attr]; + if (req.body[attr]) group[attr] = req.body[attr]; }); group.save(function(err, saved){ @@ -279,8 +279,10 @@ api.update = function(req, res, next) { // TODO remove from api object? api.attachGroup = function(req, res, next) { var user = res.locals.user; - var gid = req.params.gid; - var q = (gid == 'party') ? Group.findOne({type: 'party', members: {'$in': [res.locals.user._id]}}) : Group.findById(gid); + var gid = req.params.gid === 'party' ? user.party._id : req.params.gid; + + let q = Group.findOne({_id: gid}) + q.exec(function(err, group){ if(err) return next(err); if(!group) return res.status(404).json({err: shared.i18n.t('messageGroupNotFound')}); @@ -298,13 +300,20 @@ api.getChat = function(req, res, next) { // TODO: This code is duplicated from api.get - pull it out into a function to remove duplication. var user = res.locals.user; var gid = req.params.gid; - var q = (gid == 'party') - ? Group.findOne({type: 'party', members: {$in:[user._id]}}) - : Group.findOne({$or:[ - {_id:gid, privacy:'public'}, - {_id:gid, privacy:'private', members: {$in:[user._id]}} - ]}); - populateQuery(gid, q); + + var q; + let isUserGuild = user.guilds.indexOf(gid) !== -1; + + if (gid === 'party' || gid === user.party._id) { + q = Group.findOne({_id: user.party._id, type: 'party'}) + } else { + if (isUserGuild) { + q = Group.findOne({type: 'guild', _id: gid}); + } else { + q = Group.findOne({type: 'guild', privacy: 'public', _id: gid}); + } + } + q.exec(function(err, group){ if (err) return next(err); if (!group && gid!=='party') return res.status(404).json({err: shared.i18n.t('messageGroupNotFound')});