irl.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. const express = require('express');
  2. const { authMiddleware } = require('../auth');
  3. const router = express.Router();
  4. // IRL France entière — série INSEE 001515333
  5. const IRL_SERIES = '001515333';
  6. async function fetchIrlFromInsee(year, quarter) {
  7. const period = `${year}-Q${quarter}`;
  8. const url = `https://api.insee.fr/series/BDM/V1/data/SERIES_BDM/${IRL_SERIES}?startPeriod=${period}&endPeriod=${period}`;
  9. const resp = await fetch(url, {
  10. headers: { 'Accept': 'application/xml' },
  11. });
  12. if (!resp.ok) throw new Error(`INSEE API HTTP ${resp.status}`);
  13. const xml = await resp.text();
  14. // SDMX-XML : extraire <generic:ObsValue value="142.06"/>
  15. const match = xml.match(/ObsValue[^/]*value="([\d.]+)"/);
  16. if (!match) throw new Error('Valeur IRL introuvable dans la réponse XML');
  17. return parseFloat(match[1]);
  18. }
  19. // GET /api/irl?year=2024&quarter=2
  20. router.get('/', authMiddleware, async (req, res) => {
  21. const { year, quarter } = req.query;
  22. if (!year || !quarter) return res.status(400).json({ error: 'year et quarter requis' });
  23. try {
  24. const value = await fetchIrlFromInsee(parseInt(year), parseInt(quarter));
  25. res.json({ value, year: parseInt(year), quarter: parseInt(quarter) });
  26. } catch (e) {
  27. console.error('IRL fetch error:', e.message);
  28. res.status(502).json({ value: null, error: e.message });
  29. }
  30. });
  31. module.exports = router;