aboutsummaryrefslogtreecommitdiffstats
path: root/src/controllers/roomController.js
blob: e60d60c0e74cda5924b7359b5e652a2775b19204 (plain) (blame)
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
};