Skip to content

Commit ceb33c1

Browse files
Drop utility for emitting events, and update chats
1 parent 8d4aa25 commit ceb33c1

4 files changed

Lines changed: 39 additions & 47 deletions

File tree

src/api/v1/chats/chats.router.ts

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as Service from './chats.service';
77
import * as Middlewares from '@/middlewares';
88
import { Request, Response, Router } from 'express';
99
import logger from '@/lib/logger';
10+
import io from '@/lib/io';
1011

1112
export const chatsRouter = Router();
1213

@@ -31,7 +32,7 @@ chatsRouter.get('/', Middlewares.authValidator, async (req, res) => {
3132
const chats = await Service.getUserChats(userId, filters);
3233
res.json(chats).on('finish', () => {
3334
const rooms = Service.getOtherChatsMemberIds(userId, chats);
34-
Utils.emitToRoomsIfAny({ rooms, event: 'chats:received', volatile: true });
35+
if (rooms.length) io.to(rooms).emit('chats:received');
3536
});
3637
});
3738

@@ -40,7 +41,7 @@ chatsRouter.get('/members/:profileId', Middlewares.authValidator, async (req, re
4041
const chats = await Service.getUserChatsByMember(userId, req.params.profileId);
4142
res.json(chats).on('finish', () => {
4243
const rooms = Service.getOtherChatsMemberIds(userId, chats);
43-
Utils.emitToRoomsIfAny({ rooms, event: 'chats:received', volatile: true });
44+
if (rooms.length) io.to(rooms).emit('chats:received');
4445
});
4546
});
4647

@@ -50,7 +51,9 @@ chatsRouter.get('/:id', Middlewares.authValidator, async (req, res) => {
5051
const chat = await Service.getUserChatById(userId, chatId);
5152
res.json(chat).on('finish', () => {
5253
Service.getOtherChatMemberIds(userId, chatId)
53-
.then((rooms) => Utils.emitToRoomsIfAny({ rooms, event: 'chats:received', volatile: true }))
54+
.then((rooms) => {
55+
if (rooms.length) io.to(rooms).emit('chats:received');
56+
})
5457
.catch((error: unknown) => logger.error('Failed to broadcast "chats:received"', error));
5558
});
5659
});
@@ -62,7 +65,9 @@ chatsRouter.get('/:id/messages', Middlewares.authValidator, async (req, res) =>
6265
const messages = await Service.getUserChatMessages(userId, chatId, filters);
6366
res.json(messages).on('finish', () => {
6467
Service.getOtherChatMemberIds(userId, chatId)
65-
.then((rooms) => Utils.emitToRoomsIfAny({ rooms, event: 'chats:received', volatile: true }))
68+
.then((rooms) => {
69+
if (rooms.length) io.to(rooms).emit('chats:received');
70+
})
6671
.catch((error: unknown) => logger.error('Failed to broadcast "chats:received"', error));
6772
});
6873
});
@@ -73,7 +78,9 @@ chatsRouter.get('/:id/messages/:msgId', Middlewares.authValidator, async (req, r
7378
const msg = await Service.getUserChatMessageById(userId, chatId, req.params.msgId);
7479
res.json(msg).on('finish', () => {
7580
Service.getOtherChatMemberIds(userId, chatId)
76-
.then((rooms) => Utils.emitToRoomsIfAny({ rooms, event: 'chats:received', volatile: true }))
81+
.then((rooms) => {
82+
if (rooms.length) io.to(rooms).emit('chats:received');
83+
})
7784
.catch((error: unknown) => logger.error('Failed to broadcast "chats:received"', error));
7885
});
7986
});
@@ -94,9 +101,12 @@ chatsRouter.post(
94101
.json(createdChat)
95102
.on('finish', () => {
96103
Service.getOtherChatMemberIds(user.id, createdChat.id)
97-
.then((rooms) =>
98-
Utils.emitToRoomsIfAny({ rooms, event: 'chats:updated', volatile: true }),
99-
)
104+
.then((rooms) => {
105+
if (rooms.length) {
106+
io.to(rooms).emit('chats:updated');
107+
io.to(rooms).emit('chat:created', createdChat.id);
108+
}
109+
})
100110
.catch((error: unknown) => logger.error('Failed to broadcast "chats:updated"', error));
101111
});
102112
},
@@ -107,7 +117,13 @@ chatsRouter.patch('/:id/seen', Middlewares.authValidator, async (req, res) => {
107117
const userId = Utils.getCurrentUserIdFromReq(req)!;
108118
res.json(await Service.updateProfileChatLastSeenDate(userId, chatId)).on('finish', () => {
109119
Service.getOtherChatMemberIds(userId, chatId)
110-
.then((rooms) => Utils.emitToRoomsIfAny({ rooms, event: 'chats:updated', volatile: true }))
120+
.then((rooms) => {
121+
if (rooms.length) {
122+
io.to(rooms).emit('chat:updated', chatId);
123+
io.to(rooms).emit(`chat:updated:${chatId}`);
124+
io.to(rooms).emit('chats:updated');
125+
}
126+
})
111127
.catch((error: unknown) => logger.error('Failed to broadcast "chats:updated"', error));
112128
});
113129
});
@@ -130,9 +146,13 @@ chatsRouter.post(
130146
.json(createdMessage)
131147
.on('finish', () => {
132148
Service.getOtherChatMemberIds(user.id, chatId)
133-
.then((rooms) =>
134-
Utils.emitToRoomsIfAny({ rooms, event: 'chats:updated', volatile: true }),
135-
)
149+
.then((rooms) => {
150+
if (rooms.length) {
151+
io.to(rooms).emit('chat:updated', chatId);
152+
io.to(rooms).emit(`chat:updated:${chatId}`);
153+
io.to(rooms).emit('chats:updated');
154+
}
155+
})
136156
.catch((error: unknown) => logger.error('Failed to broadcast "chats:updated"', error));
137157
});
138158
},
@@ -147,7 +167,13 @@ chatsRouter.delete('/:id', Middlewares.authValidator, async (req, res) => {
147167
.send()
148168
.on('finish', () => {
149169
Service.getOtherChatMemberIds(userId, chatId)
150-
.then((rooms) => Utils.emitToRoomsIfAny({ rooms, event: 'chats:updated', volatile: true }))
170+
.then((rooms) => {
171+
if (rooms.length) {
172+
io.to(rooms).emit('chat:deleted', chatId);
173+
io.to(rooms).emit(`chat:deleted:${chatId}`);
174+
io.to(rooms).emit('chats:updated');
175+
}
176+
})
151177
.catch((error: unknown) => logger.error('Failed to broadcast "chats:updated"', error));
152178
});
153179
});

src/lib/utils.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import * as Storage from '@/lib/storage';
44
import * as AppError from '@/lib/app-error';
55
import { Prisma } from '@/../prisma/client';
66
import { Request } from 'express';
7-
import { io } from '@/lib/io';
87
import { z } from 'zod';
98
import ms from 'ms';
109
import db from '@/lib/db';
@@ -14,10 +13,6 @@ export const lowerCase = <T extends string>(s: T): Lowercase<T> => {
1413
return s.toLowerCase() as Lowercase<T>;
1514
};
1615

17-
export const emitToRoomsIfAny = ({ event, rooms, volatile }: Types.SocketEventData) => {
18-
if (rooms.length) (volatile ? io.volatile : io).to(rooms).emit(event);
19-
};
20-
2116
export const createJwtForUser = (user: Types.PublicUser): string => {
2217
const { id, isAdmin } = user;
2318
const payload: Types.AppJwtPayload = { id, isAdmin };

src/tests/api/v1/chats.int.test.ts

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -998,29 +998,6 @@ describe('Chats endpoints', async () => {
998998
expect(storage.upload).toHaveBeenCalledOnce();
999999
expect(storage.upload.mock.calls.at(-1)?.at(-1)).toHaveProperty('upsert', false);
10001000
});
1001-
1002-
it('should create multiple chats sequentially, each of which have seen/received by the its owner', async () => {
1003-
const profileIds = [dbUserTwo.profile!.id, dbXUser.profile!.id, dbAdmin.profile!.id];
1004-
for (let i = 0; i < profileIds.length; i++) {
1005-
const iterNum = i + 1;
1006-
const chatData = { profiles: [profileIds[i]], message: { body: 'Hello!' } };
1007-
const { authorizedApi } = await prepForAuthorizedTest(userOneData);
1008-
const res = await authorizedApi.post(CHATS_URL).send(chatData);
1009-
const dbMsgs = await db.message.findMany({});
1010-
const dbChats = await db.chat.findMany({});
1011-
const chat = res.body as ChatFullData;
1012-
expect(res.statusCode).toBe(201);
1013-
expect(res.type).toMatch(/json/);
1014-
expect(dbChats).toHaveLength(iterNum);
1015-
expect(dbMsgs).toHaveLength(iterNum);
1016-
assertChat(chat, dbChats[i].id, 1);
1017-
expect(chat.profiles[0].lastSeenAt).toBeTruthy();
1018-
expect(chat.profiles[0].lastReceivedAt).toBeTruthy();
1019-
expect(dbMsgs[i].chatId).toBe(dbChats[i].id);
1020-
expect(chat.messages).toBeInstanceOf(Array);
1021-
assertMessage(chat.messages[0], dbMsgs[i].id);
1022-
}
1023-
});
10241001
});
10251002

10261003
describe(`PATCH ${CHATS_URL}/:id/seen`, () => {

src/types.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,3 @@ export interface EvaluationResult {
156156
evaluation: Record<string, boolean>;
157157
finder: CharacterFinder;
158158
}
159-
160-
export interface SocketEventData {
161-
event: string;
162-
rooms: string[];
163-
volatile?: boolean;
164-
}

0 commit comments

Comments
 (0)