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

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

28
29
const submit = async (req, res) => {
    try {
Kim, Subin's avatar
Kim, Subin committed
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
        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]: [
                            { theater: theater.theater },
                            {
                                [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"
            })
        )
52
        result.map(el => {
Kim, Subin's avatar
Kim, Subin committed
53
            if (el !== "valid") throw new Error("유효하지 않은 데이터입니다. 다시 등록해주시길 바랍니다.")
54
        })
Kim, Subin's avatar
Kim, Subin committed
55
56
57
58
59
60
61
        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 = ""
Kim, Subin's avatar
Kim, Subin committed
62
                    if ('06:00' <= theater.start && theater.start < '10:00') partTime = "morning"
Kim, Subin's avatar
Kim, Subin committed
63
64
                    else if ('00:00' <= theater.start < '06:00') partTime = "night"
                    else partTime = "day"
65
                    await TimeTable.create({ theater: 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
66
67
                })
            )
68
69
            curDate.setDate(curDate.getDate() + 1)
        } while (curDate <= endDate)
Kim, Subin's avatar
Kim, Subin committed
70
        res.send("success!")
71
72
73
74
75
    } catch (error) {
        return res.status(500).send(error.message || "상영시간표 저장 중 에러 발생")
    }
}

Kim, Subin's avatar
Kim, Subin committed
76
const getTime = (string, runtime = 0) => {
77
78
79
80
81
    const arr = string.split(':')
    const date = new Date(0, 0, 0, Number(arr[0]), Number(arr[1]) + runtime)
    return date
}

82
83
84
const remove = async (req, res) => {
    try {
        const { timeId } = req.params
Kim, Subin's avatar
Kim, Subin committed
85
        const delNum = await TimeTable.destroy({ where: { id: timeId } })
86
87
88
89
90
91
92
        if (delNum) res.json(delNum)
        else throw new Error("해당 정보를 서버에서 삭제하는데 실패했습니다.")
    } catch (error) {
        return res.status(500).send(error.message || "상영시간표 삭제 중 에러 발생")
    }
}

93
export default {
94
95
96
    getAll,
    submit,
    remove
97
}