59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
const { WEATHER_FIELDS, hasValue } = require("../constants");
|
|
const { createInfluxProvider } = require("./influxdb");
|
|
const { createOpenMeteoProvider } = require("./open-meteo");
|
|
|
|
function mergeWeather(target, addition, providerName) {
|
|
let added = false;
|
|
|
|
for (const field of WEATHER_FIELDS) {
|
|
if (!hasValue(addition[field])) continue;
|
|
if (hasValue(target[field])) continue;
|
|
|
|
target[field] = addition[field];
|
|
added = true;
|
|
}
|
|
|
|
if (added) {
|
|
const existing = target.source || [];
|
|
const nextSources = Array.from(new Set([...existing, ...(addition.source || [providerName])].filter(Boolean)));
|
|
target.source = nextSources;
|
|
}
|
|
|
|
return added;
|
|
}
|
|
|
|
function buildProviders(config) {
|
|
const providers = [];
|
|
const influx = createInfluxProvider(config.providers?.influxdb, config);
|
|
const openMeteo = createOpenMeteoProvider(config.providers?.openMeteo, config);
|
|
|
|
if (influx) providers.push(influx);
|
|
if (openMeteo) providers.push(openMeteo);
|
|
|
|
return providers;
|
|
}
|
|
|
|
async function fetchWeather(targetDateTime, config) {
|
|
const providers = buildProviders(config);
|
|
const weather = {};
|
|
|
|
for (const provider of providers) {
|
|
const result = await provider.fetch({ target: targetDateTime });
|
|
|
|
if (!result) continue;
|
|
|
|
mergeWeather(weather, result, provider.name);
|
|
|
|
const complete = WEATHER_FIELDS.every((field) => hasValue(weather[field]));
|
|
if (complete) break;
|
|
}
|
|
|
|
return Object.keys(weather).length > 0 ? weather : null;
|
|
}
|
|
|
|
module.exports = {
|
|
fetchWeather,
|
|
hasConfiguredProvider: (config) => buildProviders(config).length > 0,
|
|
mergeWeather,
|
|
};
|