Files
Duriin-API/src/sources/edgar.js
T

79 lines
1.9 KiB
JavaScript

const config = require('../config');
const { fetchJson } = require('../http');
let tickerMap;
function getHeaders() {
return {
headers: {
'User-Agent': config.sec.userAgent,
Accept: 'application/json',
},
};
}
async function getTickerMap() {
if (tickerMap) {
return tickerMap;
}
const data = await fetchJson('https://www.sec.gov/files/company_tickers.json', getHeaders());
tickerMap = Object.values(data).reduce((acc, company) => {
acc[String(company.ticker || '').toUpperCase()] = String(company.cik_str || '').padStart(10, '0');
return acc;
}, {});
return tickerMap;
}
async function fetchEdgarArticles() {
const tickers = config.sec?.tickers || [];
if (tickers.length === 0) {
return [];
}
const map = await getTickerMap();
const articles = [];
for (const ticker of tickers) {
const cik = map[String(ticker).toUpperCase()];
if (!cik) {
continue;
}
const data = await fetchJson(`https://data.sec.gov/submissions/CIK${cik}.json`, getHeaders());
const recent = data.filings?.recent;
if (!recent) {
continue;
}
for (let i = 0; i < recent.form.length; i += 1) {
if (recent.form[i] !== '8-K') {
continue;
}
const accession = String(recent.accessionNumber[i] || '').replace(/-/g, '');
const primaryDocument = String(recent.primaryDocument[i] || '').trim();
const filingDate = recent.filingDate[i] || null;
if (!accession || !primaryDocument) {
continue;
}
articles.push({
title: `${String(ticker).toUpperCase()} 8-K ${filingDate || accession}`,
description: `${String(data.name || ticker).trim()} filed Form 8-K`,
url: `https://www.sec.gov/Archives/edgar/data/${Number(cik)}/${accession}/${primaryDocument}`,
source: 'edgar',
pubDate: filingDate,
});
}
}
return articles;
}
module.exports = {
fetchEdgarArticles,
};