Versie 0.2.0
This commit is contained in:
commit
e77d8fd373
495 files changed
+81026
No files matched your search
@@ -0,0 +1,47 @@
|
||||
// Generated, do not edit. sha256:2f3082db0160d4179616e98a296a8ab4a5647a67cfd48f2cc38d5f27a7ead0fa
|
||||
import { priceSeriesExport } from './data/price-history.js';
|
||||
import { getBaseCurrency } from './data/portfolio.js';
|
||||
|
||||
export const CSV_COLUMNS = ['instrument', 'source', 'quote', 'unit', 'resolution', 'observed_at_utc', 'fetched_at_utc', 'price'];
|
||||
|
||||
const iso = (v) => {
|
||||
if (!v) return '';
|
||||
const ms = Date.parse(/[zZ]|[+-]\d\d:?\d\d$/.test(v) || v.length === 10 ? v : `${v}Z`);
|
||||
return Number.isFinite(ms) ? new Date(ms).toISOString() : '';
|
||||
};
|
||||
const cel = (v) => {
|
||||
const s = v == null ? '' : String(v);
|
||||
return /[",\r\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s;
|
||||
};
|
||||
|
||||
export function priceHistoryCsv(rows, quote) {
|
||||
const regels = [CSV_COLUMNS.join(',')];
|
||||
for (const r of rows) {
|
||||
const observed = iso(r.observedAt);
|
||||
const price = Number(r.fiatPrice);
|
||||
if (!observed || !Number.isFinite(price) || price <= 0) continue;
|
||||
regels.push([
|
||||
`${r.kind}:${String(r.symbol || '').toUpperCase()}`, r.source, quote, r.kind === 'metal' ? 'g' : '',
|
||||
r.resolution, observed, iso(r.createdAt), price,
|
||||
].map(cel).join(','));
|
||||
}
|
||||
return regels.join('\n') + '\n';
|
||||
}
|
||||
|
||||
function bestandsnaam() {
|
||||
const d = new Date();
|
||||
const p = n => String(n).padStart(2, '0');
|
||||
return `koershistorie-${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}.csv`;
|
||||
}
|
||||
|
||||
export function exportPriceHistory(res) {
|
||||
const body = Buffer.from(priceHistoryCsv(priceSeriesExport(), getBaseCurrency()), 'utf-8');
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/csv; charset=utf-8',
|
||||
'Content-Disposition': `attachment; filename="${bestandsnaam()}"`,
|
||||
'Content-Length': body.length,
|
||||
'Cache-Control': 'no-store',
|
||||
'X-Content-Type-Options': 'nosniff',
|
||||
});
|
||||
res.end(body);
|
||||
}
|
||||
Reference in new issue
Block a user