Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 | 7x 3x 3x 3x 3x 3x 3x 3x 3x 1x 3x 3x 2x 2x 1x 1x 1x 1x 1x | import mongoose from "mongoose";
import roomModel from "../models/room_model";
import { CustomRequest } from "types/customRequest";
import { Response } from "express";
export const getRoomByUserIds = async (req: CustomRequest, res: Response): Promise<void> => {
const receiverUserId = req.params.receiverUserId as string;
const initiatorUserId = req.user.id as string;
try {
let roomDocuments: any[] = await roomModel.aggregate(
[
{
$match: {
userIds: {
$in: [new mongoose.Types.ObjectId(receiverUserId)]
}
}
},
{
$match: {
userIds: {
$in: [new mongoose.Types.ObjectId(initiatorUserId)]
}
}
},
{
$lookup: {
from: 'messages',
localField: '_id',
foreignField: 'roomId',
as: 'messages'
}
}
]
);
// Handle that a user could send to himself
let room = null;
for (let i = 0; i < roomDocuments.length; i++) {
room = roomDocuments[i];
if (room.userIds[0].toString() == room.userIds[1].toString()) {
break;
}
}
Iif (room && room.userIds[0].toString() != room.userIds[1].toString() &&
receiverUserId.toString() == initiatorUserId.toString()) {
room = null;
}
if (room) {
res.status(200).send(room);
return;
}
// Room not found, create one.
const newRoom = await roomModel.create({
userIds: [
new mongoose.Types.ObjectId(receiverUserId),
new mongoose.Types.ObjectId(initiatorUserId)
]
});
room = newRoom.toObject();
(room as any).messages = [];
res.status(201).send(room);
return;
} catch(error){
res.status(400).send("Bad Request");
}
};
|