diff --git a/app/controllers/chat.js b/app/controllers/chat.js index e675b4a..8290275 100644 --- a/app/controllers/chat.js +++ b/app/controllers/chat.js @@ -168,16 +168,11 @@ class ChatController extends SiteController { switch (response) { case 'accept': await chatService.acceptRoomInvite(res.locals.invite); - displayList.showNotification( - `Chat room invite accepted`, - 'success', - 'top-center', - 5000, - ); + displayList.navigateTo(`/chat/room/${res.locals.invite.room._id}`); break; case 'reject': - await chatService.acceptRoomInvite(res.locals.invite); + await chatService.rejectRoomInvite(res.locals.invite); displayList.showNotification( `Chat room invite rejected`, 'success', diff --git a/app/models/kaleidoscope-event.js b/app/models/kaleidoscope-event.js index ad02b90..c24e98e 100644 --- a/app/models/kaleidoscope-event.js +++ b/app/models/kaleidoscope-event.js @@ -7,10 +7,13 @@ const mongoose = require('mongoose'); const Schema = mongoose.Schema; +const RECIPIENT_TYPE_LIST = ['User','CoreUser']; const EMITTER_TYPE_LIST = ['User','CoreUser','OAuth2Client']; const KaleidoscopeEventSchema = new Schema({ 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 }, label: { type: String }, content: { type: String }, diff --git a/app/services/chat.js b/app/services/chat.js index 6194919..44035ab 100644 --- a/app/services/chat.js +++ b/app/services/chat.js @@ -367,6 +367,8 @@ class ChatService extends SiteService { room.owner.type = room.ownerType; const event = { + recipientType: member.type, + recipient: member._id, action: 'room-invite-create', emitter: room.owner, label: 'Chat Room Invitation', @@ -396,6 +398,19 @@ class ChatService extends SiteService { } 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', { roomId: invite.room._id, memberId: invite.member._id, @@ -403,7 +418,7 @@ class ChatService extends SiteService { await ChatRoom.updateOne( { _id: invite.room._id }, { - $addToSet: { + $push: { members: { memberType: invite.memberType, 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) {