v0.8.10-beta - een repo verwijderen mag niet struikelen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 17m40s

DELETE /api/repos/<id> las r["id"] zonder controle, dus een regel zonder id gaf
een 500 - dezelfde fout die GET /api/repos had. Verwijderen haalt alle regels
met die id weg, zodat een dubbele vermelding in een klik weg is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
Ramon 2026-08-03 23:40:31 +02:00
parent c608647582
commit 030d644753
4 changed files with 34 additions and 2 deletions

View file

@ -1,3 +1,13 @@
# v0.8.10-beta — Een repo verwijderen mag niet struikelen
`DELETE /api/repos/<id>` las `r["id"]` zonder controle. Staat er één regel
zonder id in je configuratie, dan gaf verwijderen een 500 — dezelfde fout die
`GET /api/repos` had en die de hele app store leeg liet. Nu wordt zo'n regel
overgeslagen.
Verwijderen haalt alle regels met die id weg, dus een dubbele vermelding is in
één klik opgeruimd.
# v0.8.09-beta — Twee repo's met dezelfde naam braken de app store # v0.8.09-beta — Twee repo's met dezelfde naam braken de app store
In een configuratie met twee repo's die dezelfde `id` dragen, tekende de app In een configuratie met twee repo's die dezelfde `id` dragen, tekende de app

View file

@ -1 +1 @@
0.8.09-beta 0.8.10-beta

View file

@ -1281,7 +1281,11 @@ def api_repos_add():
@app.route("/api/repos/<rid>", methods=["DELETE"]) @app.route("/api/repos/<rid>", methods=["DELETE"])
def api_repos_del(rid): def api_repos_del(rid):
repos = [r for r in cfg.load().get("APP_REPOS", []) if r["id"] != rid] # `r["id"]` op een regel zonder id gaf hier een KeyError, dus een 500 —
# dezelfde fout die /api/repos had. Verwijdert alle regels met deze id,
# zodat een dubbele vermelding in één keer weg is.
repos = [r for r in cfg.load().get("APP_REPOS", [])
if not isinstance(r, dict) or r.get("id") != rid]
cfg.patch({"APP_REPOS": repos}) cfg.patch({"APP_REPOS": repos})
c = git.cache_dir(rid) c = git.cache_dir(rid)
if c.exists(): if c.exists():

View file

@ -262,3 +262,21 @@ def test_dubbele_repo_ids_komen_maar_een_keer_terug(client, env):
ids = [r["id"] for r in d] ids = [r["id"] for r in d]
assert ids == ["server-up", "boilerplates"], ids assert ids == ["server-up", "boilerplates"], ids
assert len(ids) == len(set(ids)), "er zitten nog dubbele ids in" assert len(ids) == len(set(ids)), "er zitten nog dubbele ids in"
def test_verwijderen_haalt_alle_regels_met_die_id_weg(client, env):
"""Een dubbele vermelding hoort in één keer weg. En een regel zonder id
mag hier geen 500 geven dezelfde fout die /api/repos had."""
import core
from conftest import login
csrf = login(client)
core.patch({"APP_REPOS": [
{"id": "server-up", "url": "https://voorbeeld/a.git"},
{"id": "blijft", "url": "https://voorbeeld/b.git"},
{"id": "server-up", "url": "https://voorbeeld/c.git"},
{"url": "https://voorbeeld/d.git"},
]})
r = client.delete("/api/repos/server-up", headers={"X-CSRF-Token": csrf})
assert r.status_code == 200, r.get_json()
over = core.load()["APP_REPOS"]
assert [x.get("id") for x in over] == ["blijft", None], over