2022-03-30 20:21:30 +00:00
|
|
|
const express = require('express')
|
|
|
|
const {check, validationResult} = require('express-validator')
|
2022-04-03 16:16:27 +00:00
|
|
|
const moment = require('moment')
|
2022-03-30 20:21:30 +00:00
|
|
|
const config = require('./config')
|
|
|
|
const db = require('./db')
|
|
|
|
|
|
|
|
let router = express.Router()
|
|
|
|
module.exports = router
|
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
router.get('/latest', (req, res) => {
|
|
|
|
db.getDb().collection('solardata').find().sort({date: -1, hour: -1}).limit(1).toArray((err, solardataArr) => {
|
2022-03-30 20:21:30 +00:00
|
|
|
if (err) {
|
2022-04-03 16:16:27 +00:00
|
|
|
return res.status(500).end()
|
2022-03-30 20:21:30 +00:00
|
|
|
}
|
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
let solardata = solardataArr[0]
|
|
|
|
|
2022-03-30 20:21:30 +00:00
|
|
|
if (!solardata) {
|
2022-04-03 16:16:27 +00:00
|
|
|
return res.status(404).end()
|
2022-03-30 20:21:30 +00:00
|
|
|
}
|
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
// Check that the data is not older than 4 hours
|
|
|
|
let solardataMoment = moment.utc(solardata.date + "T" + solardata.hour.toString().padStart(2, '0'))
|
|
|
|
if (moment.utc().diff(solardataMoment, 'hours') > 4) {
|
|
|
|
return res.status(404).end()
|
|
|
|
}
|
|
|
|
|
2022-03-30 20:21:30 +00:00
|
|
|
delete solardata._id
|
|
|
|
delete solardata.date
|
|
|
|
delete solardata.hour
|
|
|
|
|
|
|
|
return res.json(solardata)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
router.get('/history/:hours',
|
|
|
|
check("hours").isInt({gt: 0, lt: 1000}),
|
|
|
|
(req, res) => {
|
|
|
|
db.getDb().collection('solardata').find().sort({date: -1, hour: -1}).limit(parseInt(req.params.hours)).toArray((err, solardataArr) => {
|
2022-03-30 20:21:30 +00:00
|
|
|
if (err) {
|
2022-04-03 16:16:27 +00:00
|
|
|
return res.status(500).end()
|
2022-03-30 20:21:30 +00:00
|
|
|
}
|
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
for (let solardata of solardataArr) {
|
|
|
|
delete solardata._id
|
|
|
|
}
|
2022-03-30 20:21:30 +00:00
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
return res.json(solardataArr)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
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()
|
2022-04-03 16:16:27 +00:00
|
|
|
}
|
|
|
|
|
2022-04-22 13:44:59 +00:00
|
|
|
if (!solardata) {
|
2022-04-03 16:17:47 +00:00
|
|
|
return res.status(404).end()
|
2022-03-30 20:21:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
|
2022-04-03 16:16:27 +00:00
|
|
|
const errors = validationResult(req)
|
2022-03-30 20:21:30 +00:00
|
|
|
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,
|
2022-03-31 07:28:04 +00:00
|
|
|
hour: parseInt(req.params.hour),
|
|
|
|
sfi: parseInt(req.body.sfi),
|
|
|
|
r: parseInt(req.body.r),
|
|
|
|
a: parseInt(req.body.a),
|
|
|
|
k: parseInt(req.body.k),
|
|
|
|
expK: parseInt(req.body.expK),
|
2022-03-30 20:21:30 +00:00
|
|
|
sa: req.body.sa,
|
|
|
|
gmf: req.body.gmf,
|
|
|
|
aurora: req.body.aurora
|
|
|
|
}, {upsert: true})
|
|
|
|
return res.status(204).end()
|
|
|
|
})
|