m
eddab392a2
test(mobile): blindage contrat API — suite apiClient + durcissement INVALID_RESPONSE
...
- tests/apiClient.test.ts (tsx/node:test, fetch stubbé) : paths/méthodes/query/body de tous les endpoints, multipart FormData sans Content-Type manuel, enveloppe {data,meta}, Bearer (présent/absent/fusion)
- cas hostiles : 2xx HTML/corps vide/JSON invalide/objet sans data/error → ApiError INVALID_RESPONSE (jamais de TypeError ni data indéfini) ; bare 5xx → HTTP_<status> ; fetch rejeté (dont AbortError) → NETWORK_ERROR ; [] toléré en data
- client.ts : parse d'enveloppe stricte dans request() (nouveau code client INVALID_RESPONSE)
- package.json : scripts test:api + test (db + api)
2026-09-10 20:16:27 +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
293c1ca9b2
add navbar
2026-09-10 07:27:21 +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
e7f304da0a
docs: contrat api-v1 consolidé + conventions (mobile = source de vérité)
2026-09-10 07:10:19 +02:00
m
4ad2166559
add i19n
2026-09-10 07:09:42 +02:00
m
77d2ea8356
banniere legacy + base
2026-09-10 07:09:19 +02:00
m
8ff2339c8a
better iterface
2026-09-10 06:46:22 +02:00
m
27d4eb6a65
add missing features
2026-09-10 06:40:58 +02:00
m
85b1871c18
part ok
2026-09-10 06:39:25 +02:00
m
7dd29239b7
sqlite local
2026-09-09 23:12:15 +02:00
m
e1360c19a2
add sqlite
2026-09-09 22:50:05 +02:00
m
d839bbdf70
saf + sqlite
2026-09-09 22:31:20 +02:00
m
b671a222a5
local storage add add folders
2026-09-09 22:04:33 +02:00
m
ce966e67c5
distant storage
2026-09-09 21:55:51 +02:00
m
2e01484383
saf directory
2026-09-09 18:40:39 +02:00
m
2174eecffc
auth ctx
2026-09-09 18:29:54 +02:00
m
45cffb15c3
layout + app
2026-09-09 18:28:08 +02:00
m
19af7d4bed
index
2026-09-09 18:26:50 +02:00
m
2ba837bcb0
from scratch
2026-09-09 18:23:01 +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
479c8ab61c
use auto sync
2026-08-29 09:31:53 +02:00
m
e43aa2d793
sync detail
2026-08-28 23:48:19 +02:00
m
bba46fa2b3
fix sync detail
2026-08-28 23:46:59 +02:00
m
0056a83a69
search bar filters
2026-08-28 23:41:42 +02:00
m
e41ccb986a
search bar
2026-08-28 23:37:53 +02:00
m
d6a014ef84
add sort into header
2026-08-28 23:36:14 +02:00
m
ae8931ee21
add sync status
2026-08-28 23:34:35 +02:00
m
bb78d6ac95
remove picture read access
2026-08-28 23:08:52 +02:00
m
523454fe91
add list view
2026-08-28 23:03:35 +02:00
m
57d8e70d7f
add network status
2026-08-28 22:34:00 +02:00
m
f4024c8aae
add pending actions
2026-08-26 17:29:10 +02:00
m
664e1dd290
add status
2026-08-26 15:35:42 +02:00
m
1cf9cf24a4
settings fix
2026-08-25 21:06:47 +02:00
m
70adedeed2
fix onboarding error
2026-08-25 17:50:21 +02:00
m
4602f1da79
get local files
2026-08-25 17:48:47 +02:00
m
a791df26bf
fix sync
2026-08-25 17:04:17 +02:00
m
7e7d669d63
delete files etc ..
2026-07-29 23:30:53 +02:00
m
4119e84f33
fix upload edit
2026-07-29 23:05:18 +02:00
m
a226c4d4fa
fix delete rec folder
2026-07-29 22:58:52 +02:00
m
79ff07b7c4
delete fikes
2026-07-29 22:54:10 +02:00