Browse Source

chat room invite fixes

- add `recipientType` and `recipient` to KaleidoscopeEvent
- guard against multiple accepts of invites
- navigate to chat room after accepting invite
pull/2/head
Rob Colbert 3 years ago
parent
commit
e7c46e88f9
  1. 9
      app/controllers/chat.js
  2. 3
      app/models/kaleidoscope-event.js
  3. 25
      app/services/chat.js

9
app/controllers/chat.js

@ -168,16 +168,11 @@ class ChatController extends SiteController {
switch (response) { switch (response) {
case 'accept': case 'accept':
await chatService.acceptRoomInvite(res.locals.invite); await chatService.acceptRoomInvite(res.locals.invite);
displayList.showNotification( displayList.navigateTo(`/chat/room/${res.locals.invite.room._id}`);
`Chat room invite accepted`,
'success',
'top-center',
5000,
);
break; break;
case 'reject': case 'reject':
await chatService.acceptRoomInvite(res.locals.invite); await chatService.rejectRoomInvite(res.locals.invite);
displayList.showNotification( displayList.showNotification(
`Chat room invite rejected`, `Chat room invite rejected`,
'success', 'success',

3
app/models/kaleidoscope-event.js

@ -7,10 +7,13 @@
const mongoose = require('mongoose'); const mongoose = require('mongoose');
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
const RECIPIENT_TYPE_LIST = ['User','CoreUser'];
const EMITTER_TYPE_LIST = ['User','CoreUser','OAuth2Client']; const EMITTER_TYPE_LIST = ['User','CoreUser','OAuth2Client'];
const KaleidoscopeEventSchema = new Schema({ const KaleidoscopeEventSchema = new Schema({
created: { type: Date, default: Date.now, required: true, index: -1, expires: '30d' }, created: { type: Date, default: Date.now, required: true, index: -1, expires: '30d' },
recipientType: { type: String, enum: RECIPIENT_TYPE_LIST },
recipient: { type: Schema.ObjectId, index: 1, refPath: 'recipientType' },
action: { type: String, required: true, lowercase: true }, action: { type: String, required: true, lowercase: true },
label: { type: String }, label: { type: String },
content: { type: String }, content: { type: String },

25
app/services/chat.js

@ -367,6 +367,8 @@ class ChatService extends SiteService {
room.owner.type = room.ownerType; room.owner.type = room.ownerType;
const event = { const event = {
recipientType: member.type,
recipient: member._id,
action: 'room-invite-create', action: 'room-invite-create',
emitter: room.owner, emitter: room.owner,
label: 'Chat Room Invitation', label: 'Chat Room Invitation',
@ -396,6 +398,19 @@ class ChatService extends SiteService {
} }
async acceptRoomInvite (invite) { async acceptRoomInvite (invite) {
if ((invite.status === 'accepted') ||
(invite.room.members.find((member) => member.member._id.equals(invite.member._id)))) {
throw SiteError(400, "You have already accepted membership in this room.");
}
this.log.debug('updating chat invite', { inviteId: invite._id, status: 'accepted' });
await ChatRoomInvite.updateOne(
{ _id: invite._id },
{
$set: { status: 'accepted' },
},
);
this.log.info('accepting invite to chat room', { this.log.info('accepting invite to chat room', {
roomId: invite.room._id, roomId: invite.room._id,
memberId: invite.member._id, memberId: invite.member._id,
@ -403,7 +418,7 @@ class ChatService extends SiteService {
await ChatRoom.updateOne( await ChatRoom.updateOne(
{ _id: invite.room._id }, { _id: invite.room._id },
{ {
$addToSet: { $push: {
members: { members: {
memberType: invite.memberType, memberType: invite.memberType,
member: invite.member._id, member: invite.member._id,
@ -411,14 +426,6 @@ class ChatService extends SiteService {
}, },
}, },
); );
this.log.info('updating chat invite', { inviteId: invite._id, status: 'accepted' });
await ChatRoomInvite.updateOne(
{ _id: invite._id },
{
$set: { status: 'accepted' },
},
);
} }
async rejectRoomInvite (invite) { async rejectRoomInvite (invite) {

Loading…
Cancel
Save