'use strict' // ───────────────────────────────────────────────────────────────────────────── // Politiques SLA ÉDITABLES (par FILE + PRIORITÉ) — cibles de réponse/résolution en // MINUTES. Modifiables depuis Ops > Paramètres. Le CALCUL (échéances, dépassement, // à-risque) se fait côté Ops (composable useSla) à partir de ces politiques + la // date d'ouverture / 1ʳᵉ réponse du ticket. Ici on ne fait que stocker/servir la config. // GET /sla/policies → { policies, defaults } // PUT /sla/policies { policies } → remplace (état complet) // ───────────────────────────────────────────────────────────────────────────── const { json, parseBody, readJsonFile, writeJsonFile } = require('./helpers') const FILE = '/app/data/sla_policies.json' // Cibles de départ raisonnables (MINUTES). Clé = file (issue_type) → priorité → { response, resolution }. // `_default` = repli pour toute file sans politique propre. Modifiables dans Settings. const DEFAULTS = { _default: { Urgent: { response: 30, resolution: 240 }, // 30 min / 4 h High: { response: 60, resolution: 480 }, // 1 h / 8 h Medium: { response: 240, resolution: 1440 }, // 4 h / 1 j Low: { response: 480, resolution: 2880 }, // 8 h / 2 j }, } async function handle (req, res, method, path) { if (path !== '/sla/policies') return json(res, 404, { error: 'not found' }) if (method === 'GET') { const p = readJsonFile(FILE, null) return json(res, 200, { policies: (p && typeof p === 'object') ? p : DEFAULTS, defaults: DEFAULTS }) } if (method === 'PUT') { const b = await parseBody(req) const pol = (b && b.policies && typeof b.policies === 'object' && !Array.isArray(b.policies)) ? b.policies : null if (!pol) return json(res, 400, { error: 'policies requis (objet file→priorité→{response,resolution})' }) writeJsonFile(FILE, pol) return json(res, 200, { ok: true, policies: pol }) } return json(res, 405, { error: 'method not allowed' }) } module.exports = { handle, DEFAULTS }