From 78ae6f6bf2aa2cb82a976610b75e34fe870dc07f Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Thu, 24 Apr 2025 16:49:39 -0400 Subject: [PATCH] dev: begin implementing driver for newsdata.io --- .../external-extras/ExternalExtrasModule.js | 4 ++ .../external-extras/NewsDataService.js | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/backend/src/modules/external-extras/NewsDataService.js diff --git a/src/backend/src/modules/external-extras/ExternalExtrasModule.js b/src/backend/src/modules/external-extras/ExternalExtrasModule.js index 00d6fea62..a501a622a 100644 --- a/src/backend/src/modules/external-extras/ExternalExtrasModule.js +++ b/src/backend/src/modules/external-extras/ExternalExtrasModule.js @@ -9,6 +9,10 @@ class ExternalExtrasModule extends AdvancedBase { const { IPGeoService } = require('./IPGeoService'); services.registerService('ipgeo', IPGeoService); } + if ( !! config?.services?.newsdata ) { + const { NewsDataService } = require('./NewsDataService'); + services.registerService('newsdata', NewsDataService); + } } } diff --git a/src/backend/src/modules/external-extras/NewsDataService.js b/src/backend/src/modules/external-extras/NewsDataService.js new file mode 100644 index 000000000..76e66adf6 --- /dev/null +++ b/src/backend/src/modules/external-extras/NewsDataService.js @@ -0,0 +1,58 @@ +const APIError = require("../../api/APIError"); +const BaseService = require("../../services/BaseService"); + +class NewsDataService extends BaseService { + async ['__on_driver.register.interfaces'] () { + const svc_registry = this.services.get('registry'); + const col_interfaces = svc_registry.get('interfaces'); + + col_interfaces.set('newsdata', { + description: 'NewsData.io', + methods: { + newsdata: { + description: 'Report geolocation information', + parameters: { + '*': { + type: 'json', + }, + }, + result: { + type: 'json' + }, + }, + } + }); + } + + static IMPLEMENTS = { + newsdata: { + async newsdata (parameters) { + // doing this makes vscode recognize what's being required + const require = this.require; + + const axios = require('axios'); + const querystring = require('querystring'); + + const qstr = querystring.stringify({ + ...parameters, + + // Yep, API key reall does go in the query string. + // This is what the docs say to do. + apikey: this.config.apiKey, + size: 10, + }); + + const resp = await axios.request({ + method: 'GET', + url: 'https://newsdata.io/api/1/latest?' + qstr, + }); + + return resp.data; + } + } + } +} + +module.exports = { + NewsDataService, +};