Commit Graph
73 Commits
Author SHA1 Message Date
m 5578e4a354 add tests 2026-09-13 19:24:58 +02:00
m b494db9cf0 outbox sync 2026-09-13 09:17:26 +02:00
m cc533a3b24 backend outbox integration 2026-09-12 22:08:52 +02:00
m c2c7dddba6 feat(api): identité user-first — login/password, ownership user, fin du token device
- 000006 : users.username/username_normalized/password_hash/is_admin, index
  unique partiel sur username_normalized, DROP idx_users_email (unicité V1 =
  username, jamais email) ; 000007 destructif : resources.owner_id→user_id
  (FK→users, reset base dev), l'unicité racine devient par user
- pkg/passwd : argon2id (t=1,m=64MiB,p=4,k=32), comparaison constant-time,
  VerifyTimedEqual (délai égalisé dummy-hash) ; pkg/auth : subject=user_id +
  claim device_id, TTL 7 j sans refresh
- repository : Users (count/get/resolve-exact/create/update-password/
  mark-deleted), Devices.MarkUser (user_id INFORMATIF uniquement)
- handlers : POST /devices sans token, POST /auth/login (401 indistinguable
  user inconnu/mauvais mdp, device requis), PATCH /users/me/password
  (current_password, tokens non révoqués — limite V1), GET /users/resolve
  (exact lowercase, jamais email/is_admin) ; middleware RequireAuth
  (user authorisant, device porté) ; tout le scoping ressources passe user
- bootstrap admin : users vide + ADMIN_* absents → refus de démarrer ;
  .env.example ; docs/api-v1.md §2/§3/§7/§8
- tests : migrations 000006/000007 (up/down), pkg/auth Identity, handlers
  login/password/resolve, helpers refactorés registerAndLogin, repo tests
  scopés user — suite backend verte
2026-09-10 21:21:36 +02:00
m d5886c678b feat(api): OCR réel — POST /ocr/jobs + GET /ocr/jobs/:id (tesseract syscall, jobs asynchrones)
- ocr/tesseract.go : Engine → Tesseract subprocess (OCR_LANG fra+eng) ; PDF → calque texte via ledongthuc/pdf (go.mod : nouveau dep)
- repository/ocr_jobs.go : queued→processing→done/failed, scoping device, text/error NULLIFés
- service/ocr.go : Create valide le fichier (GetFile), queue + goroutine de traitement ; physique résolu par glob UPLOAD_DIR/<device>/<id>.* ; fail propre (fichier illisible, erreur moteur)
- handlers/ocr.go : réels (validate fileId, NOT_FOUND si job d'un autre device), fin 501 OCR
- tests end-to-end : cycle queued→done (stub moteur), NOT_FOUND fichier inconnu, scoping device
- smoke réel : PNG 'VAULTDROP' → job done text='VAULTDROP' (tesseract installé)
- docs/AGENTS : §5 + état des routes (tout V1 réel)
2026-09-10 19:54:16 +02:00
m 5d96814853 feat(api): sync réel — outbox POST /sync/ops idempotente + snapshot GET /sync/permissions (owner V1)
- operations.operation_id/ref_id BIGINT (= id client pending_operations), UNIQUE(device_id, operation_id) idempotente ; migration 000004 corrigée + test
- service/sync.go : ApplyBatch séquentiel (no-op si déjà traitée ; create déjà présent / update/move sur ressource absente / delete absent = no-op) ;
  arrêt à la première erreur non-idempotente (NAME_CONFLICT, NOT_FOUND, INVALID_REQUEST) + trace après succès ; ops share/share_link accusées sans état (V1)
- handlers/sync.go : POST /sync/ops → {applied, failed|null} ; GET /sync/permissions?after= → snapshot delta (effectiveAccess owner, cachedAt ms)
- snapshot : repo.ListOwned (delta updated_at en ms, trié) ; index partiel racine (owner_id, name) WHERE parent_id IS NULL
- GET /files sans folderId = racine uniquement (convention useFiles(undefined)) ; tests files_test corrigés (codes d'erreur imbriqués, tailles)
- fix dbtest : ping la connexion maintenance (création de la DB cible possible) — les tests handlers/repo tournent enfin contre PG réel
- tests handlers end-to-end : batch appliqué + retry idempotent, arrêt sur NAME_CONFLICT, delete idempotent, snapshot + delta
2026-09-10 19:50:23 +02:00
m 37ad2d4275 feat(api): GET /files/search (ILIKE substring insensible casse, wildcards échappés, scope owner, q obligatoire) 2026-09-10 07:45:53 +02:00
m 14c058fddb feat(api): CRUD files/folders + upload multipart réels (scope owner, soft-delete, conteurs d'erreurs)
- repository.Resources (insert/list/get/soft-delete scoping owner_id, UNIQUE(parent_id,name) → NAME_CONFLICT) + Devices.Upsert au register
- service.Resources : DTOs {id,name,size,mimeType,folderId,createdAt,updatedAt}, upload → UPLOAD_DIR/<device>/<id>.<ext> (nettoyage si métadonnée échoue)
- handlers : files list/get/delete/upload + folders racines ; routes consolidées dans handlers.RegisterRoutes
- dbtest package : test DB jetée par repo (open+reset+migrate, skip si PG down) ; tests repository + handlers end-to-end (register→token→CRUD, scoping cross-device, FILE_TOO_LARGE, NAME_CONFLICT)
- docs: /devices persiste le device, layout UPLOAD_DIR par device, codes NAME_CONFLICT/SERVICE_UNAVAILABLE
2026-09-10 07:44:55 +02:00
m 484498d989 feat(backend): migrations Postgres testées (users, devices, resources, operations, ocr_jobs) + migrate au boot
- golang-migrate embarqué via embed (db/migrations/*.sql), MigrateDatabase(url) au boot
- ids TEXT 32-hex avec CHECK ~ '^[0-9a-f]{32}$' ; operations idempotentes UNIQUE(device_id, operation_id)
- harness db/migrations_test.go (up → assertions schéma → down, skip si PG indisponible)
- DB dev fraîche vaultdrop_dev (la DB vaultdrop héberge un prototype V2 abandonné)
2026-09-10 07:35:36 +02:00
m caa6e6483c feat(api): /devices register + paseto v4 (middleware Bearer, bootstrap mobile du token) 2026-09-10 07:25:11 +02:00
m bdf1fadce9 feat(backend): rouage gin /api/v1, enveloppe {data,meta}/{error}, health réel, stubs 501 + test de contrat routes 2026-09-10 07:16:57 +02:00
m 837bfa8a12 refactor(backend): layout canonique cmd/server + models/service/ocr/pkg + fix compilation héritée 2026-09-10 07:10:31 +02:00
m 77d2ea8356 banniere legacy + base 2026-09-10 07:09:19 +02:00
m c7467ea8f9 client version 2026-09-05 11:28:21 +02:00
m 8982e96197 move 2026-09-03 20:57:27 +02:00
m 80dd164fde base creation 2026-09-03 20:38:47 +02:00
m 32a61e6a64 create tests directory format 2026-09-02 09:52:26 +02:00
m 523454fe91 add list view 2026-08-28 23:03:35 +02:00
m 7e7d669d63 delete files etc .. 2026-07-29 23:30:53 +02:00
m a226c4d4fa fix delete rec folder 2026-07-29 22:58:52 +02:00
m e4b6e393d8 fix folders on main page 2026-07-29 22:37:23 +02:00
m 881767cfec page + upload queue + folders 2026-07-29 22:16:47 +02:00
m 470474011d display folders 2026-07-29 21:58:52 +02:00
m 397803fb96 sse + ocr replanish 2026-07-29 18:56:26 +02:00
m 68a4beef37 checksum opti 2026-07-29 18:50:41 +02:00
m 7cc425d28b fix server location on device registration 2026-07-28 21:45:02 +02:00
m d40ca87075 migrate to v3 - remove backward comp 2026-07-28 18:22:37 +02:00
m bd6e7c38f9 V3 version with backward comp 2026-07-28 18:12:56 +02:00
m e8ceb99a5d display files with cache image 2026-07-27 23:02:09 +02:00
m e41b72637c fix convertion page number pb 2026-07-16 08:19:46 +02:00
m 073934be4f fix 401 endpoint - signed endpoint 2026-07-16 08:05:40 +02:00
m 10c07d2946 generate thumbnails 2026-07-16 07:35:08 +02:00
m 76ceafa56c add backend auth 2026-07-14 09:47:55 +02:00
m 18bd08a919 replace go uuid generation by postgresql 2026-07-14 08:36:11 +02:00
m 93100a2b81 display folders and files into 2026-07-13 17:09:39 +02:00
m 04b6dfc6d4 move files into folders 2026-07-13 17:07:00 +02:00
m 07b03562b1 display folders 2026-07-13 16:54:12 +02:00
m 545a17e9df remove fild_id notion 2026-07-13 16:41:20 +02:00
m 70ceec1603 drop is folder column useless 2026-07-13 16:36:44 +02:00
m 3c66fcabfc files responses 2026-07-13 16:35:01 +02:00
m 968605b3d1 add is_folder notion 2026-07-13 13:25:02 +02:00
m 68ec7509f7 remove folder notion 2026-07-13 13:20:14 +02:00
m ca2d5a54e1 add missing tags 2026-07-13 13:05:13 +02:00
m 0aa3549561 add tags 2026-07-13 11:47:48 +02:00
m c3bb0dd6ab endpoints to add tags 2026-07-13 00:36:08 +02:00
m 7dc53ea99f add tags 2026-07-13 00:15:39 +02:00
m e59fde6a48 migrate to postgres 2026-07-12 23:49:25 +02:00
m 3650b7ba9d remove npl 2026-07-12 22:15:23 +02:00
m 010cb2cb49 spacy nlp ner 2026-07-12 22:11:57 +02:00
m 6ed51daa6b add icon for documents without thumbnails 2026-07-12 21:40:31 +02:00