All files / src/controllers rooms_controller.ts

90.9% Statements 20/22
88.88% Branches 8/9
100% Functions 1/1
90.47% Lines 19/21

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