79 lines
1.9 KiB
JavaScript
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,
|
|
};
|