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
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
32a61e6a64
create tests directory format
2026-09-02 09:52:26 +02:00
m
881767cfec
page + upload queue + folders
2026-07-29 22:16:47 +02:00
m
397803fb96
sse + ocr replanish
2026-07-29 18:56:26 +02:00
m
7cc425d28b
fix server location on device registration
2026-07-28 21:45:02 +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
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
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
67096c9482
ocr worker
2026-07-12 14:35:30 +02:00
m
6b8c64bd40
re organizer project
2026-07-12 13:44:15 +02:00
m
67fadc4b37
upload multiple files
2026-07-12 10:11:46 +02:00
m
1f3bee120d
migrate files + upload meta data
2026-07-12 09:33:04 +02:00
m
1d35bea1c5
add migration system
2026-07-12 09:28:20 +02:00
m
c2e0c9fce4
create file into db
2026-07-12 09:15:06 +02:00
m
a2b3f75321
add sqlc and sqlite
2026-07-12 00:02:27 +02:00
m
f7cf2a2bef
get images, and display images
2026-07-11 22:59:25 +02:00
m
b1f7fe6959
init project
2026-07-11 20:12:00 +02:00