feat: dossier personnel par utilisateur — vault home-<user> + registre de vaults persistant #194
CI / lint (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / security (push) Canceled after 0s
CI / build (push) Canceled after 0s
CI / e2e (push) Canceled after 0s

- backend/user_home.py : ensure_user_home()/release_user_home() idempotents
  (mkdir, vault, watcher, octroi dans user.vaults), rappelés à la création
  d'un compte et au démarrage (migration + réparation + sweep des vaults
  home-* orphelins), dossier conservé à la suppression.
- backend/indexer.py : data/vaults.json, registre persistant des vaults
  ajoutés à la volée, fusionné par load_vault_config() — ils disparaissaient
  au premier reindex complet et au redémarrage. reload_single_vault remet
  vault_config[name] après remove_vault_from_index.
- backend/auth/router.py + routers/vaults.py : appels ensure/release +
  persistance à l'ajout/retrait d'un vault.
- docker-compose.yml : montage unique /NFS/OBSIDIAN_DOC/Home:/vaults/Home +
  OBSIGATE_HOME_ROOT (absente = fonctionnalité inactive).
- Tests : tests/test_user_home.py (12) + tests/test_auth_api.py::TestUserHome (2).
This commit is contained in:
2026-10-10 00:40:35 -04:00
parent f4c8504c8d
commit 8235d632b8
19 changed files with 700 additions and 17 deletions
+17 -2
View File
@@ -946,9 +946,20 @@ async def create_user_endpoint(
user = create_user(
req.username, req.password, req.role, req.vaults, req.display_name
)
return user
except ValueError as e:
raise HTTPException(400, str(e))
# #194 : dossier perso — best effort, réparé au démarrage si le disque
# (NFS) est indisponible (ensure_user_home journalise l'erreur).
from backend.auth.user_store import get_user
from backend.user_home import ensure_user_home
await ensure_user_home(req.username)
# La réponse doit refléter l'octroi du vault perso (#194) : create_user a
# renvoyé un instantané construit avant l'octroi.
fresh = get_user(req.username)
if fresh:
user["vaults"] = fresh.get("vaults", [])
return user
@router.patch("/admin/users/{username}")
@@ -975,9 +986,13 @@ async def delete_user_endpoint(
raise HTTPException(400, "Impossible de supprimer son propre compte")
try:
delete_user(username)
return {"message": f"Utilisateur '{username}' supprimé"}
except ValueError as e:
raise HTTPException(404, str(e))
# #194 : fermer le vault du dossier perso (le dossier est conservé).
from backend.user_home import release_user_home
await release_user_home(username)
return {"message": f"Utilisateur '{username}' supprimé"}
# ── API / MCP tokens (feature #107) ──────────────────────────────────