package web // backup_page_state holds the small pure state-pick helpers that drive the honest // per-app / whole-page messaging on the /backups page. They are pure (no *Server, // no I/O) so the truth-table can be unit-tested directly without a fixture Server. // dbSectionState decides how the "Adatbázisok" section (and the "Adatbázis mentve" // stat card) should read, given how many databases were discovered live at render // time and how many dump files exist on disk: // - "dumps" — dump files exist → show the real dump table / count. // - "pending" — a database was discovered but no dump written yet → "first run tonight". // - "embedded" — neither: the deployed apps carry embedded DBs (e.g. SQLite) that ride // the file/volume backup; no separate dump is expected, so a bare "0" would lie. // // dumps wins over discovered: stale dumps from a since-removed DB app are still a real, // restorable artifact and must be shown normally (see the §8 edge-case table). func dbSectionState(discovered, dumps int) string { switch { case dumps > 0: return "dumps" case discovered > 0: return "pending" default: return "embedded" } } // tier3State decides the per-app "3. mentés" (off-box / off-site) row state: // - "unconfigured" — no off-box target set (configured wins over a stale per-app toggle). // - "off" — target set but this app is not toggled for off-box backup. // - "escrow_pending" — toggled, but the repo password is not yet escrowed (fork-4 gate): // runs are paused, so we must NOT imply a successful run. // - "active" — toggled and escrowed: the app is included in the off-box runs. // // Precedence is strict: configured → toggle → escrow. Anything other than "escrowed" // while toggled is treated as escrow-pending (never "active"), so a pre-pending LastStatus // of "ok" can never surface a false "Sikeres". func tier3State(configured, toggled bool, escrowState string) string { switch { case !configured: return "unconfigured" case !toggled: return "off" case escrowState != "escrowed": return "escrow_pending" default: return "active" } } // driveFilesNoteFor is the one sentence under a class-A app's Tier-1 row: where the household's own // FILES are protected, said in the state the box is actually in. // // R-543. v0.244.0 shipped this sentence in one form — „a távoli másolat … védi" — and it was true of // the design and false of a fresh box: off-site is ON by default (hub v0.116.0) but PAUSED until the // household performs the escrow ceremony, which nothing asked them to do. A sentence that promises a // copy which is not running is the same class of lie R-537 and R-538 were filed for, committed by the // fix for them. // // It is pure, and it takes tier3State's OWN vocabulary rather than re-deriving the state, so the row // and the sentence can never disagree: // "active" → the copy exists and runs → „védi" // "escrow_pending" → enabled, paused for the code → „védené … szünetel" + the route to fix it // "off"/"unconfig" → no off-site at all → say so, and name both ways out // The link is returned separately so the template renders a real anchor and the copy gate sees plain // text; empty note means render nothing (an app whose data is in its volumes needs no sentence). func driveFilesNoteFor(hasDriveFileLegs bool, tier3State string, tier2Configured bool) (note, linkHref, linkText string) { if !hasDriveFileLegs { return "", "", "" } switch tier3State { case "active": return "Az alkalmazás fájljait a távoli másolat (és a második meghajtó) védi — ez a helyi mentés a beállításokat és az adatbázist tartalmazza.", "", "" case "escrow_pending": return "Az alkalmazás fájljait a távoli másolat védené — a távoli mentés a helyreállítási kód létrehozásáig szünetel.", "/backup/escrow", "Helyreállítási kód létrehozása" default: if tier2Configured { return "Az alkalmazás fájljait a második meghajtóra készülő másolat védi — ez a helyi mentés a beállításokat és az adatbázist tartalmazza.", "", "" } return "Az alkalmazás fájljairól jelenleg nincs másolat — kapcsold be a távoli mentést vagy adj hozzá második meghajtót.", "/backups/remote", "Távoli mentés beállítása" } }