timetable.controller.js 4.76 KB
Newer Older
Kim, Subin's avatar
Kim, Subin committed
1
import { TimeTable, Theater, TheaterType, Reservation } from "../db/index.js";
2
3
4
import sequelize from 'sequelize'
const { Op } = sequelize

5
6
const getAll = async (req, res) => {
    try {
Kim, Subin's avatar
Kim, Subin committed
7
        const { when, movieId } = req.query
8
        const selectDate = new Date(when)
Kim, Subin's avatar
Kim, Subin committed
9
        let findAll = null
10
        const theaterArr = []
11
        findAll = movieId !== "0" ? await TimeTable.findAll({ where: { date: selectDate, movieId: movieId }, attributes: { exclude: ['createdAt', 'updatedAt'] }, order: [["theaterId", "ASC"], ["start_time", "ASC"]], include: [Theater] })
Kim, Subin's avatar
Kim, Subin committed
12
13
14
15
16
17
18
            : await TimeTable.findAll({ where: { date: selectDate }, attributes: { exclude: ['createdAt', 'updatedAt'] }, order: [["theaterId", "ASC"], ["start_time", "ASC"]], include: [Theater] })
        findAll.forEach(async (element) => {
            if (!theaterArr.includes(element.theaterId)) theaterArr.push(element.theaterId)
            if (movieId) {
                const { count } = await Reservation.findAndCountAll({ where: { movieId: movieId, timetableId: element.id } })
                element.dataValues.reservations = count
            }
19
        })
Kim, Subin's avatar
Kim, Subin committed
20
        const findTheater = await Theater.findAll({ where: { id: theaterArr }, attributes: { exclude: ['createdAt', 'updatedAt'] }, include: [TheaterType], order: [['theaterName']] })
21
        findTheater.forEach(el => {
Kim, Subin's avatar
Kim, Subin committed
22
            el.dataValues.theaterTypeName = el.dataValues.theatertype.dataValues.theaterTypeName
23
            const arr = findAll.filter(timetable => {
Kim, Subin's avatar
Kim, Subin committed
24
                if (el.id === timetable.theaterId) return timetable.dataValues
25
26
27
28
29
30
31
32
33
            })
            el.dataValues.timetable = arr
        })
        return res.json(findTheater)
    } catch (error) {
        return res.status(500).send(error.message || "상영시간표 정보 가져오는 중 에러 발생")
    }
}

34
35
const submit = async (req, res) => {
    try {
Kim, Subin's avatar
Kim, Subin committed
36
37
38
39
40
41
42
43
        const { movieId, title, theater, runtime, release_date, date } = req.body
        const result = await Promise.all(
            theater.map(async (theater) => {
                const startTime = getTime(theater.start)
                const endTime = getTime(theater.start, runtime)
                const isTimeTable = await TimeTable.findAll({
                    where: {
                        [Op.and]: [
Kim, Subin's avatar
Kim, Subin committed
44
                            { theaterId: theater.theater },
Kim, Subin's avatar
Kim, Subin committed
45
46
47
48
49
50
51
52
53
54
55
56
57
                            {
                                [Op.or]: [
                                    { [Op.and]: [{ start_time: { [Op.gt]: startTime } }, { end_time: { [Op.lte]: endTime } }] },
                                    { start_time: { [Op.between]: [startTime, endTime] } }
                                ]
                            }
                        ]
                    }
                })
                if (isTimeTable.length !== 0) return "unvalid"
                else return "valid"
            })
        )
58
        result.map(el => {
Kim, Subin's avatar
Kim, Subin committed
59
            if (el !== "valid") throw new Error("유효하지 않은 데이터입니다. 다시 등록해주시길 바랍니다.")
60
        })
Kim, Subin's avatar
Kim, Subin committed
61
62
63
64
65
66
67
        let curDate = new Date(release_date)
        const endDate = new Date(date)
        do {
            let day = curDate.getDay()
            await Promise.all(
                theater.map(async (theater) => {
                    let partTime = ""
68
69
70
71
72
73
74
                    if ('06:00' <= theater.start && theater.start < '10:00') {
                        partTime = "morning"
                    } else if ('00:00' <= theater.start && theater.start < '06:00') {
                        partTime = "night"
                    } else {
                        partTime = "day"
                    }
Kim, Subin's avatar
Kim, Subin committed
75
                    await TimeTable.create({ theaterId: theater.theater, movieId, title, release_date, date: curDate, start_time: getTime(theater.start), end_time: getTime(theater.start, runtime), partTime: partTime, week: (day === 0 || day === 6) ? "weekend" : "weekdays" })
Kim, Subin's avatar
Kim, Subin committed
76
77
                })
            )
78
79
            curDate.setDate(curDate.getDate() + 1)
        } while (curDate <= endDate)
Kim, Subin's avatar
Kim, Subin committed
80
        res.send("success!")
81
82
83
84
85
    } catch (error) {
        return res.status(500).send(error.message || "상영시간표 저장 중 에러 발생")
    }
}

Kim, Subin's avatar
Kim, Subin committed
86
const getTime = (string, runtime = 0) => {
87
88
89
90
91
    const arr = string.split(':')
    const date = new Date(0, 0, 0, Number(arr[0]), Number(arr[1]) + runtime)
    return date
}

92
93
94
const remove = async (req, res) => {
    try {
        const { timeId } = req.params
Kim, Subin's avatar
Kim, Subin committed
95
        const delNum = await TimeTable.destroy({ where: { id: timeId } })
96
97
98
99
100
101
102
        if (delNum) res.json(delNum)
        else throw new Error("해당 정보를 서버에서 삭제하는데 실패했습니다.")
    } catch (error) {
        return res.status(500).send(error.message || "상영시간표 삭제 중 에러 발생")
    }
}

103
export default {
104
105
106
    getAll,
    submit,
    remove
107
}