forked from WFCD/warframe-status
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
161 lines (133 loc) · 4.8 KB
/
server.js
File metadata and controls
161 lines (133 loc) · 4.8 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
'use strict';
/* eslint-disable import/no-unresolved */
const express = require('express');
const helmet = require('helmet');
const { transports, createLogger, format } = require('winston');
const warframeData = require('warframe-worldstate-data'); // eslint-disable-line import/no-unresolved
const apicache = require('apicache');
const DropCache = require('./lib/caches/DropCache.js');
const cache = apicache.middleware;
const {
combine, label, printf, colorize,
} = format;
/* eslint-enable import/no-unresolved */
/* Routes */
const Route = require('./lib/Route');
const WorldstateRoute = require('./lib/routes/Worldstate');
const Drops = require('./lib/routes/Drops');
const WorldstateData = require('./lib/routes/WorldstateData');
const Search = require('./lib/routes/Search');
const PriceCheck = require('./lib/routes/PriceCheck');
const Weapons = require('./lib/routes/Weapons');
const Warframes = require('./lib/routes/Warframes');
const Mods = require('./lib/routes/Mods');
const transport = new transports.Console({ colorize: true });
const logFormat = printf(info => `[${info.label}] ${info.level}: ${info.message}`);
const logger = createLogger({
format: combine(
colorize(),
label({ label: 'API' }),
logFormat,
),
transports: [transport],
});
logger.level = process.env.LOG_LEVEL || 'info';
logger.info('Setting up dependencies...');
const dropCache = new DropCache(logger);
const platforms = ['pc', 'ps4', 'xb1'];
delete warframeData.weapons;
delete warframeData.warframes;
const wfKeys = Object.keys(warframeData).map(key => key.toLowerCase());
wfKeys.push('drops', 'mods');
const solKeys = Object.keys(warframeData.solNodes);
const setHeadersAndJson = (res, json) => {
res.setHeader('Content-Type', 'application/json');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range');
res.setHeader('Access-Control-Expose-Headers', 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range');
res.json(json);
};
const deps = {
logger,
dropCache,
wfKeys,
solKeys,
setHeadersAndJson,
warframeData,
platforms,
};
const routes = {
route: new Route('/', deps),
worldstate: new WorldstateRoute('/:platform', deps),
drops: new Drops('/drops', deps),
data: new WorldstateData('/:key', deps),
search: new Search('/:key/search/:query', deps),
priceCheck: new PriceCheck('/pricecheck/:type/:query', deps),
weapons: new Weapons('/weapons/', deps),
warframes: new Warframes('/warframes/', deps),
mods: new Mods('/mods/', deps),
};
const app = express();
app.use(helmet());
app.use(express.json());
logger.info('Setting up routes...');
app.get('/', cache('1 minute'), (req, res) => {
logger.log('silly', `Got ${req.originalUrl}`);
routes.route.handle(req, res);
});
app.get('/heartbeat', cache('24 hours'), async (req, res) => {
res.status(200).json('Success');
});
app.get('/warframes', cache('24 hours'), async (req, res) => {
logger.log('silly', `Got ${req.originalUrl}`);
routes.warframes.handle(req, res);
});
app.get('/weapons', cache('24 hours'), async (req, res) => {
logger.log('silly', `Got ${req.originalUrl}`);
routes.weapons.handle(req, res);
});
app.get('/mods', cache('24 hours'), async (req, res) => {
logger.log('silly', `Got ${req.originalUrl}`);
routes.mods.handle(req, res);
});
app.get('/drops', cache('24 hours'), async (req, res) => {
logger.log('silly', `Got ${req.originalUrl}`);
routes.drops.handle(req, res);
});
app.get('/:key', cache('1 minute'), async (req, res) => {
logger.log('silly', `Got ${req.originalUrl}`);
const key = (req.params.key || '').toLowerCase();
// platform
if (platforms.includes(key)) {
await routes.worldstate.handle(req, res);
// all drops
} else if (wfKeys.includes(key)) {
await routes.data.handle(req, res);
// routes listing
} else if (key === 'routes') {
routes.route.handle(req, res);
} else {
res.status(404).end();
}
});
// worldstate data section
app.get('/:platform/:item', cache('1 minute'), async (req, res) => {
await routes.worldstate.handle(req, res);
});
// Search via query key
app.get('/:key/search/:query', cache('10 hours'), async (req, res) => {
await routes.search.handle(req, res);
});
// Pricecheck
app.get('/pricecheck/:type/:query', cache('10 minutes'), async (req, res) => {
await routes.priceCheck.handle(req, res);
});
// oh no, nothing
app.use((req, res) => {
res.status(404).end();
});
const port = process.env.PORT || 3001;
const host = process.env.HOSTNAME || process.env.HOST || 'localhost';
app.listen(port, host);
logger.info(`Started listening on ${host}:${port}`);