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 };