Compare commits
2
Commits
bff64e5012
...
e5f78f5368
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5f78f5368 | ||
|
|
09cc6ae488 |
@@ -2,6 +2,19 @@
|
|||||||
|
|
||||||
## [Niet vrijgegeven]
|
## [Niet vrijgegeven]
|
||||||
|
|
||||||
|
### Gewijzigd
|
||||||
|
- Het label bij een beschikbare update in "Over VibeFinance" is "Nieuwe versie"
|
||||||
|
(was "Nieuwste versie" in 1.0.0)
|
||||||
|
|
||||||
|
### Opgelost
|
||||||
|
- API-antwoorden sturen nu `Cache-Control: no-store`. Ze hadden alleen een
|
||||||
|
`ETag` en geen cache-beleid, waardoor de browser zelf mocht bepalen hoe lang
|
||||||
|
hij ze hergebruikte — per browser en profiel verschillend. Gevolg: de
|
||||||
|
update-melding bleef in Brave op een oud antwoord hangen (nog van vóór het
|
||||||
|
werkende token) terwijl een verse Edge het goede kreeg
|
||||||
|
|
||||||
|
## [1.0.0] - 2026-09-09
|
||||||
|
|
||||||
### Gewijzigd
|
### Gewijzigd
|
||||||
- `BEHEER.md` heeft één centrale `## Tokens`-sectie met het tweetoken-model
|
- `BEHEER.md` heeft één centrale `## Tokens`-sectie met het tweetoken-model
|
||||||
(werkstation `write:*`, Docker-host `read:*`) plus de betekenis van een 401,
|
(werkstation `write:*`, Docker-host `read:*`) plus de betekenis van een 401,
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ Eigen vermogen · Schulden · Voortgang · Gebruikersbeheer
|
|||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
<img src="docs/screenshot-dashboard.png" alt="VibeFinance dashboard" width="820">
|
<img src="docs/screenshot-dashboard.png" alt="VibeFinance dashboard" width="820">
|
||||||
|
|||||||
@@ -56,6 +56,17 @@ if (config.NODE_ENV !== "test") {
|
|||||||
app.use(pinoHttp({ logger }));
|
app.use(pinoHttp({ logger }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Geen browsercache op de API ───────────────────────────────────────────────
|
||||||
|
// Zonder Cache-Control mag de browser zelf bepalen hoe lang hij een antwoord
|
||||||
|
// hergebruikt (heuristische caching). Dat verschilt per browser en profiel: de
|
||||||
|
// update-melding bleef in de ene browser op een oud antwoord hangen terwijl een
|
||||||
|
// verse browser het goede kreeg. API-antwoorden zijn per gebruiker en per moment,
|
||||||
|
// dus die horen nooit uit de cache te komen.
|
||||||
|
app.use("/api", (_req, res, next) => {
|
||||||
|
res.setHeader("Cache-Control", "no-store");
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
// ── API-routes ────────────────────────────────────────────────────────────────
|
// ── API-routes ────────────────────────────────────────────────────────────────
|
||||||
app.use("/api/health", healthRouter);
|
app.use("/api/health", healthRouter);
|
||||||
app.use("/api/update-check", updateRouter);
|
app.use("/api/update-check", updateRouter);
|
||||||
|
|||||||
@@ -68,6 +68,15 @@ describe("API", () => {
|
|||||||
assert.equal(body.latest, null);
|
assert.equal(body.latest, null);
|
||||||
assert.equal(body.disabled, true);
|
assert.equal(body.disabled, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Zonder expliciete header bepaalt de browser zelf hoe lang hij een
|
||||||
|
// API-antwoord hergebruikt, en dat verschilt per browser.
|
||||||
|
it("API-antwoorden komen nooit uit de browsercache", async () => {
|
||||||
|
for (const pad of ["/api/health", "/api/update-check", "/api/bestaat-niet"]) {
|
||||||
|
const res = await fetch(`${basis}${pad}`);
|
||||||
|
assert.match(res.headers.get("cache-control") ?? "", /no-store/, pad);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Frontend serveren", () => {
|
describe("Frontend serveren", () => {
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ function OverPopup({ onClose, nieuweVersie, T }) {
|
|||||||
|
|
||||||
{nieuweVersie && (
|
{nieuweVersie && (
|
||||||
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 10 }}>
|
<div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 10 }}>
|
||||||
<span style={{ fontSize: 13, color: T.muted }}>Nieuwste versie</span>
|
<span style={{ fontSize: 13, color: T.muted }}>Nieuwe versie</span>
|
||||||
<span style={{ fontSize: 12, fontWeight: 700, color: "#f97316", background: "rgba(249,115,22,0.12)", borderRadius: 6, padding: "3px 10px" }}>
|
<span style={{ fontSize: 12, fontWeight: 700, color: "#f97316", background: "rgba(249,115,22,0.12)", borderRadius: 6, padding: "3px 10px" }}>
|
||||||
v{nieuweVersie.latest}
|
v{nieuweVersie.latest}
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vibefinance",
|
"name": "vibefinance",
|
||||||
"version": "0.1.9",
|
"version": "1.0.0",
|
||||||
"description": "VibeFinance — persoonlijk vermogensbeheer",
|
"description": "VibeFinance — persoonlijk vermogensbeheer",
|
||||||
"private": true,
|
"private": true,
|
||||||
"repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance",
|
"repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance",
|
||||||
|
|||||||
Reference in New Issue
Block a user