diff --git a/config.js b/config.js index c2eb3d4..532ad62 100644 --- a/config.js +++ b/config.js @@ -79,3 +79,7 @@ config.mail = { host: "neon1.net", port: 587 }; + +config.solardata = { + apiKey: 'xxxxxxxxxxxxxxxxx' +}; diff --git a/server.js b/server.js index ffe62af..8f1917b 100644 --- a/server.js +++ b/server.js @@ -16,6 +16,7 @@ const activations = require('./activations'); const utils = require('./utils'); const photos_router = require('./photos_router') const tracks_router = require('./tracks_router') +const solardata = require('./solardata') const maxmind = require('maxmind'); let dbChecker = (req, res, next) => { @@ -40,6 +41,7 @@ app.use('/activations', activations); app.use('/users', users); app.use('/photos', photos_router); app.use('/tracks', tracks_router); +app.use('/solardata', solardata); let sotaSpotReceiver = new SotaSpotReceiver(); let rbnReceiver = new RbnReceiver(); diff --git a/solardata.js b/solardata.js new file mode 100644 index 0000000..d674549 --- /dev/null +++ b/solardata.js @@ -0,0 +1,80 @@ +const express = require('express') +const {check, validationResult} = require('express-validator') +const config = require('./config') +const db = require('./db') + +let router = express.Router() +module.exports = router + +router.get('/:date/:hour', + check("date").matches(/^\d\d\d\d-\d\d-\d\d$/), + check("hour").isInt({gt: -1, lt: 24}), + (req, res) => { + + db.getDb().collection('solardata').findOne({date: req.params.date, hour: req.params.hour}, (err, solardata) => { + if (err) { + return res.status(500).end(); + } + + if (!solardata) { + return res.status(404).end(); + } + + delete solardata._id + delete solardata.date + delete solardata.hour + + return res.json(solardata) + }) +}) + +router.get('/latest', (req, res) => { + db.getDb().collection('solardata').find().sort({date: -1, hour: -1}).limit(1).toArray((err, solardataArr) => { + if (err) { + return res.status(500).end(); + } + + let solardata = solardataArr[0] + + if (!solardata) { + return res.status(404).end(); + } + + delete solardata._id + delete solardata.date + delete solardata.hour + + return res.json(solardata) + }) +}) + +router.post('/:date/:hour', + check("date").matches(/^\d\d\d\d-\d\d-\d\d$/), + check("hour").isInt({gt: -1, lt: 24}), + check(['sfi', 'r', 'a', 'k', 'expK']).isInt(), + check('aurora').isBoolean(), + (req, res) => { + + if (req.body.apiKey !== config.solardata.apiKey) { + return res.status(401).end() + } + + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(400).json({errors: errors.array()}) + } + + db.getDb().collection('solardata').replaceOne({date: req.params.date, hour: req.params.hour}, { + date: req.params.date, + hour: req.params.hour, + sfi: req.body.sfi, + r: req.body.r, + a: req.body.a, + k: req.body.k, + expK: req.body.expK, + sa: req.body.sa, + gmf: req.body.gmf, + aurora: req.body.aurora + }, {upsert: true}) + return res.status(204).end() +}) diff --git a/ws-manager.js b/ws-manager.js index 36dded7..c75dfa4 100644 --- a/ws-manager.js +++ b/ws-manager.js @@ -47,7 +47,11 @@ class WebSocketManager extends EventEmitter { return; } ws.isAlive = false; - ws.ping(); + try { + ws.ping(); + } catch (e) { + console.error(e); + } }, PING_INTERVAL); }); }