room.controller.js 6.22 KB
Newer Older
Soo Hyun Kim's avatar
Soo Hyun Kim committed
1
import Room from "../models/Room.js"
우지원's avatar
우지원 committed
2
import { customAlphabet } from 'nanoid'
Soo Hyun Kim's avatar
Soo Hyun Kim committed
3
import isLength from 'validator/lib/isLength.js'
Choi Ga Young's avatar
x    
Choi Ga Young committed
4
//import AccessInfo from '../models/AccessInfo.js'
5
import Chat from "../models/Chat.js"
Soo Hyun Kim's avatar
Soo Hyun Kim committed
6

우지원's avatar
우지원 committed
7
const nanoid = customAlphabet('1234567890abcdef', 10)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
8

Soo Hyun Kim's avatar
Soo Hyun Kim committed
9
10
const makeRoom = async (req, res) => {
    console.log(req.body)
Choi Ga Young's avatar
Choi Ga Young committed
11
    const { roomName, interest, isOpen, member } = req.body;
Choi Ga Young's avatar
Choi Ga Young committed
12
    console.log('콘솔확인', roomName, interest, isOpen, member)
우지원's avatar
우지원 committed
13
14
15
16
17
18
    const roomId = nanoid()
    const room = await Room.findOne({ roomId })
    while (room) {
        roomId = nanoid()
        room = await Room.findOne({ roomId })
    }
Soo Hyun Kim's avatar
Soo Hyun Kim committed
19

Soo Hyun Kim's avatar
Soo Hyun Kim committed
20
    try {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
21
        if (!isLength(roomName, { min: 3, max: 20 })) {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
22
            return res.status(422).send('채팅방의 이름은 3-20자여야 합니다.')
Choi Ga Young's avatar
Choi Ga Young committed
23
        } else if (interest == 'Choose...' || interest == '') {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
24
            return res.status(422).send('분야를 반드시 선택하여야 합니다.')
Soo Hyun Kim's avatar
Soo Hyun Kim committed
25
        }
Soo Hyun Kim's avatar
Soo Hyun Kim committed
26
        const newRoom = await new Room({
우지원's avatar
e    
우지원 committed
27
            roomId,
Soo Hyun Kim's avatar
Soo Hyun Kim committed
28
            roomName,
Soo Hyun Kim's avatar
Soo Hyun Kim committed
29
            interest,
우지원's avatar
수정    
우지원 committed
30
            isOpen,
우지원's avatar
e    
우지원 committed
31
            member,
Soo Hyun Kim's avatar
Soo Hyun Kim committed
32
        }).save()
Soo Hyun Kim's avatar
Soo Hyun Kim committed
33
34
        console.log(newRoom)
        res.json(newRoom)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
35
36
    } catch (error) {
        console.log(error)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
37
        res.status(500).send('방생성 에러')
Soo Hyun Kim's avatar
Soo Hyun Kim committed
38
39
40
    }
}

Choi Ga Young's avatar
Choi Ga Young committed
41
42
const getClosedList = async (req, res) => {
    try {
Choi Ga Young's avatar
dmdk    
Choi Ga Young committed
43
        let list = await Room.find({ member: req.query._id })
우지원's avatar
e    
우지원 committed
44
45
46
47
48
49
50
51
52
        return res.json(list)
    } catch (error) {
        res.status(500).send('리스트 불러오기를 실패하였습니다!')
    }
}

const getOpenList = async (req, res) => {
    try {
        let list = await Room.find({ isOpen: true })
Choi Ga Young's avatar
Choi Ga Young committed
53
54
55
56
57
        return res.json(list)
    } catch (error) {
        res.status(500).send('리스트 불러오기를 실패하였습니다!')
    }
}
우지원's avatar
수정    
우지원 committed
58

Soo Hyun Kim's avatar
Soo Hyun Kim committed
59
60
const getRoomName = async (req, res) => {
    const roomId = req.query.roomCode
61
    console.log('getRoomName', req.query.roomCode)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
62
63
64

    try {
        let roominfo = await Room.findOne({ roomId: roomId }).select('roomName')
Soo Hyun Kim's avatar
Soo Hyun Kim committed
65
        console.log(roominfo.roomName)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
66
67
68
69
70
71
        return res.json(roominfo.roomName)
    } catch (error) {
        res.status(500).send('리스트 불러오기를 실패하였습니다!')
    }
}

Choi Ga Young's avatar
x    
Choi Ga Young committed
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// const sysMsg = async (req, res) => {
//     try {
//         console.log('sysreq', req.query)
//         let rmif = await Room.find({ roomId: req.query.roomCode })
//         console.log('rmif', rmif)
//         let rmid = await AccessInfo.find({ room: rmif._id })
//         console.log('rmid', rmid)

//         if (rmid.isEnt) {
//             let msg = `${rmif.nickname}이 들어왔습니다`
//         } else {

//         }

//     } catch (error) {
//         res.status(500).send('')
//     }
// }

Soo Hyun Kim's avatar
Soo Hyun Kim committed
91
92
93
94
95
96
const changemember = async (req, res) => {
    const { userId, roomId } = req.body
    console.log(roomId)
    let room = await Room.findOne({ roomId: roomId }).select('member')
    const isPresent = room.member.indexOf(userId)
    try {
97
        if (isPresent < 0) {
Soo Hyun Kim's avatar
Soo Hyun Kim committed
98
99
100
            const memberId = room.member.push(userId)
            await Room.updateOne({ 'roomId': roomId }, { 'member': room.member })
            console.log('room.member 업데이트 완료')
우지원's avatar
우지원 committed
101
102
103
104
            return res.json(true)
        }
        else {
            return res.json(false)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
105
106
107
108
109
110
        }
    } catch (error) {
        res.status(500).send('멤버 업데이트 실패')
    }
}

Soo Hyun Kim's avatar
Soo Hyun Kim committed
111
112
113
114
115
116
117
118
119
120
121
const deleteUserId = async (req, res) => {
    console.log(req.body)
    const { userId, roomId } = req.body
    let room = await Room.findOne({ roomId: roomId }).select('member')
    console.log('deletetest', room)
    const memIndex = room.member.indexOf(userId)
    try {
        room.member.splice(memIndex, 1)
        await Room.updateOne({ 'roomId': roomId }, { 'member': room.member })
        console.log(`${roomId}${userId}삭제완료`)
        return res.json(true)
Soo Hyun Kim's avatar
Soo Hyun Kim committed
122
123
124
125
126
    } catch (error) {
        res.status(500).send('멤버 업데이트 실패')
    }
}

우지원's avatar
우지원 committed
127
128
129
130
131
132
133
134
135
136
137
138
const roomInf = async (req, res) => {
    try {
        console.log(req.query.roomId)
        // let roomInf = await Room.findOne({ member: req.query.roomId }).select('interest roomId member').exec()
        let roomInf = await Room.find({ roomId: req.query.roomId })
        console.log('room_member로 정보 가져오기:', roomInf)
        return res.json(roomInf)
    } catch (error) {
        alert('올바르지 못한 접근입니다.')
    }
}

JeongYeonwoo's avatar
JeongYeonwoo committed
139
140
141
142
const unreadMessage = async (req, res) => {
    let leaveInfo = req.query.leaveInfo
    const roomId = req.query.roomId
    let leaveTime = ''
143
    console.log('서버에서 초기 leaveInfo', leaveInfo)
JeongYeonwoo's avatar
JeongYeonwoo committed
144
145
146
    for (let i = 1; i < leaveInfo.length; i++) {    //일단 형식좀 맞추고
        leaveInfo[i] = JSON.parse(leaveInfo[i])
    }
147

148
    //findOne으로 해보자
JeongYeonwoo's avatar
JeongYeonwoo committed
149
150
151
152
153
154
    for (let i = 1; i <= leaveInfo.length - 1; i++) {   //그 방의 id와 나간기록의 방과 일치하는지 확인하고
        if (leaveInfo[i].roomName === roomId) {
            leaveTime = leaveInfo[i].leaveTime  //그 방에서 나간 시간을 찾아옴
            break;
        }
    }
155

JeongYeonwoo's avatar
JeongYeonwoo committed
156
157
    const room_id = await Room.find({ roomId: roomId }).select('_id')   //id로 _id를 찾아와서
    let unreadMsg = await Chat.find({ room: room_id }).select('createdAt')  //그 방의 메세지와 전송시간을 가져옴
158
159
160
161
162
163
164
165
166
167
168
169
170
171

    //Chat 전체가 아니라 그 방의 메세지에서 확인해야함!!
    const count = unreadMsg.find({ createdAt: { $gte: leaveTime } })
    console.log('서버에서 가자', count.length)
    //mongoose 시간비교 방법이 있음 (gte.,lte..)
    // for (let i = 0; i <= unreadMsg.length - 1; i++) {
    //     const dbtime = Date.parse(unreadMsg[i].createdAt)
    //     const parsedleaveTime = Date.parse(leaveTime)
    //     if (parsedleaveTime < dbtime) {         //시간 비교를하고 이후에 온 메세지의 개수를 count함
    //         console.log('이번째부터 나중에온 메세지', i)
    //         count += 1
    //     }
    // }
    res.json(count.length)
JeongYeonwoo's avatar
JeongYeonwoo committed
172
}
173

JeongYeonwoo's avatar
JeongYeonwoo committed
174
175
176
177
178
179
const dbChat = async (req, res) => {
    const roomId = req.query.roomId
    const room_id = await Room.find({ roomId: roomId }).select('_id')
    let chatlist = await Chat.find({ room: room_id }).select('message')
    res.json(chatlist)
}
180

Choi Ga Young's avatar
Choi Ga Young committed
181
export default { makeRoom, getClosedList, getOpenList, getRoomName, changemember, roomInf, unreadMessage, dbChat, deleteUserId }