1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import Room from "../models/Room.js";
import Message from "../models/Message.js";
import User from "../models/User.js";
function getRoomById(id) {
return Room.findById(id).populate('members');
}
function listRooms(opts) {
const limit = opts.limit || 50;
const offset = opts.offset || 0;
const filters = opts.filters || {};
const query = {};
if (filters.type) {
query.type = filters.type;
}
if (filters.memberId) {
query.members = filters.memberId;
}
return Room.find(query).skip(offset).limit(limit).populate('members');
}
async function createRoom(data) {
// Validate all members exist
if (data.members && data.members.length > 0) {
for (let i = 0; i < data.members.length; i++) {
const user = await User.findById(data.members[i]);
if (!user) {
return { error: 'member_not_found', memberId: data.members[i] };
}
}
}
const room = new Room(data);
return room.save();
}
function updateRoom(id, updates) {
return Room.findByIdAndUpdate(id, updates, { new: true }).populate('members');
}
function deleteRoom(id) {
return Room.findByIdAndDelete(id);
}
function getRoomMessages(roomId, opts) {
const limit = opts.limit || 50;
const offset = opts.offset || 0;
return Message.find({ roomId: roomId })
.skip(offset)
.limit(limit)
.sort({ createdAt: -1 })
.populate('authorId');
}
function addMember(roomId, userId) {
return Room.findByIdAndUpdate(
roomId,
{ $addToSet: { members: userId } },
{ new: true }
).populate('members');
}
function removeMember(roomId, userId) {
return Room.findByIdAndUpdate(
roomId,
{ $pull: { members: userId } },
{ new: true }
).populate('members');
}
function searchRooms(opts) {
const q = opts.q || '';
const query = {
name: { $regex: q, $options: 'i' }
};
return Room.find(query).populate('members');
}
export {
getRoomById,
listRooms,
searchRooms,
createRoom,
updateRoom,
deleteRoom,
getRoomMessages,
addMember,
removeMember
};
|