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
develop
Rob Colbert 2 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) {
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',

3
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 },

25
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) {

Loading…
Cancel
Save