Spaces:
Paused
Paused
File size: 4,804 Bytes
a0fda44 |
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
const catchAsyncError = require("../utilities/catchAsyncError");
const User = require("../models/User");
const ReqError = require("../utilities/ReqError");
const {
createChatRoom,
checkIfChatRoomExists,
deleteChatRoom,
} = require("./chatRoomController");
exports.getAllContacts = catchAsyncError(async (req, res, next) => {
// Id is gotten from cookies, so as to get user contacts
const user = await User.findById(req.cookies.userId).populate({
path: "contacts.contactDetails",
select: "id username bio avatar status",
});
if (!user) return next(new ReqError(400, "Username does not exist"));
res.status(200).json({
status: "success",
data: {
contacts: user.contacts,
},
});
});
exports.addNewContact = catchAsyncError(async (req, res, next) => {
const { name, username } = req.body;
// Validate input
if (!username) return next(new ReqError(400, "Contact username is needed"));
// Get models for both users
const user = await User.findById(req.cookies.userId);
const newContact = await User.findOne({ username: username });
// Validate models existence
if (!newContact) return next(new ReqError(400, "User does not exist"));
if (user.username === newContact.username)
return next(new ReqError(400, "You can't add yourself as a contact"));
// Validate addition of contacts
for (let contact of user.contacts) {
// Check if contact exists already
if (contact.contactDetails.toString() === newContact._id.toString()) {
return next(new ReqError(400, "Contact exists already"));
}
// Check if contact name exists and rename
if (contact.name === name) {
return next(new ReqError(400, "Contact name exists already"));
}
}
// Check if chat room exists between users i.e check if newContact already has user as a contact
let chatRoomId = await checkIfChatRoomExists(user, newContact);
if (!chatRoomId) {
// Create a chat room for both users
const chatRoomDetails = {
roomType: "Private",
members: [newContact._id, user._id],
messageHistory: [],
};
const newChatRoom = await createChatRoom(chatRoomDetails);
if (!newChatRoom)
return next(new ReqError(404, "Contact could not be added"));
chatRoomId = newChatRoom._id;
// Add chatRoomId to chatRooms both user belongs to
user.chatRooms.push(chatRoomId);
newContact.chatRooms.push(chatRoomId);
}
const newContactData = {
name,
contactDetails: newContact._id,
chatRoomId,
};
// Add to contacts
user.contacts.push(newContactData);
await user.save({ validateBeforeSave: false });
await newContact.save({ validateBeforeSave: false });
res.status(201).json({
status: "success",
data: {
contact: {
name,
contactDetails: {
username: newContact.username,
_id: newContact._id,
avatar: newContact.avatar,
bio: newContact.bio,
status: newContact.status,
},
chatRoomId,
},
},
});
});
exports.deleteContact = catchAsyncError(async (req, res, next) => {
const { username } = req.body;
// Validate request
if (!username) return next(new ReqError(400, "Contact username is missing"));
// Get models
const user = await User.findById(req.cookies.userId);
const aimedContact = await User.findOne({ username: username });
// Validate models
if (!aimedContact) return next(new ReqError(400, "User does not exist"));
let chatRoomId;
// Get aimed contact id
const id = aimedContact._id.toString();
// Remove contact
user.contacts = user.contacts.filter((contact) => {
if (contact.contactDetails.toString() === id) {
chatRoomId = contact.chatRoomId;
return;
}
return true;
});
// Check if other user still has you as a contact, if so don't delete chatRoom from database else delete it
const chatRoomExists = await checkIfChatRoomExists(user, aimedContact);
if (!chatRoomExists) {
await deleteChatRoom(chatRoomId);
// Remove chat room from user chat rooms
user.chatRooms = user.chatRooms.filter(
(roomId) => roomId.toString() !== chatRoomId.toString()
);
aimedContact.chatRooms = aimedContact.chatRooms.filter(
(roomId) => roomId.toString() !== chatRoomId.toString()
);
user.pinnedChatRooms = user.pinnedChatRooms.filter(
(roomId) => roomId.toString() !== chatRoomId.toString()
);
aimedContact.pinnedChatRooms = aimedContact.pinnedChatRooms.filter(
(roomId) => roomId.toString() !== chatRoomId.toString()
);
await aimedContact.save({ validateBeforeSave: false });
}
await user.save({ validateBeforeSave: false });
res.status(204).json({
status: "success",
message: "Contact successfully deleted",
});
});
|