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, };