sotlas-api/solardata.js

104 wiersze
2.5 KiB
JavaScript

const express = require('express')
const {check, validationResult} = require('express-validator')
const moment = require('moment')
const config = require('./config')
const db = require('./db')
let router = express.Router()
module.exports = router
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()
}
// 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()
}
delete solardata._id
delete solardata.date
delete solardata.hour
return res.json(solardata)
})
})
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) => {
if (err) {
return res.status(500).end()
}
for (let solardata of solardataArr) {
delete solardata._id
}
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()
}
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: 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),
sa: req.body.sa,
gmf: req.body.gmf,
aurora: req.body.aurora
}, {upsert: true})
return res.status(204).end()
})