-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathserver.js
76 lines (68 loc) · 2.79 KB
/
server.js
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
73
74
75
76
const express = require('express')
const serveStatic = require('serve-static')
const path = require('path')
const { getAllTicketStatus, mergeTicketStatus } = require('./ticket');
const app = express()
const redis = require('redis');
const ticketStatusKey = 'ticketstatus';
const scheduleKey = 'schedule';
const redisClient = redis.createClient(process.env.REDIS_URL).on("error", err => console.log("Error " + err));
app.get('/api/ticketstatus', (req, res, next) => {
redisClient.get(ticketStatusKey, async (err, strTicketStatus) => {
let ticketStatus;
if (!strTicketStatus) {
ticketStatus = await getAllTicketStatus();
ticketStatus = await mergeTicketSchedule(ticketStatus)
redisClient.set(ticketStatusKey, JSON.stringify(ticketStatus))
} else {
ticketStatus = JSON.parse(strTicketStatus);
}
res.json(ticketStatus)
})
})
const mergeTicketSchedule = async (ticketStatus) => {
return new Promise(async (resolve) => {
if (ticketStatus.length > 0) {
redisClient.get(scheduleKey, async (err, strSchedule) => {
const schedules = JSON.parse(strSchedule) || [];
ticketStatus = ticketStatus.map(t => {
t.schedules = schedules
.filter(({ date, sport, place }) => t.date === date && t.sport === sport && t.place === place)
.map(({ item, gender, stage, time }) => ({ item, gender, stage, time }));
if (t.schedules.length === 0) {
console.error('Schedules not found!, ticket:', JSON.stringify(t))
}
return t;
})
resolve(ticketStatus)
})
} else {
resolve(ticketStatus)
}
})
}
app.use(express.static(path.join(__dirname, 'public')));
app.use(function (err, req, res, next) {
console.error(err.stack);
res.status(500).send("Something went wrong ! Error: " + err.message);
});
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('app running on port', port);
})
setInterval(async () => {
console.time('[Scheduler] getAllTicketStatus');
const newTicketStatus = await getAllTicketStatus();
redisClient.get(ticketStatusKey, async (err, strTicketStatus) => {
const oldTicketStatus = JSON.parse(strTicketStatus);
let ticketStatus;
if (oldTicketStatus) {
ticketStatus = mergeTicketStatus(oldTicketStatus, newTicketStatus);
ticketStatus = await mergeTicketSchedule(ticketStatus)
} else {
ticketStatus = newTicketStatus;
}
redisClient.set(ticketStatusKey, JSON.stringify(ticketStatus))
console.timeEnd('[Scheduler] getAllTicketStatus');
})
}, 300000)