m
339d55d92f
add version and translate all pages
2026-09-15 13:57:57 +02:00
m
4659f3abc5
display thumbnails
2026-09-15 10:28:03 +02:00
m
3499a3e356
display images thumbnail
2026-09-15 10:27:52 +02:00
m
194fd26693
scan document + creation de note
2026-09-15 09:09:49 +02:00
m
809cf63994
hide filter selection on multiselect
2026-09-15 08:43:34 +02:00
m
2d12cc11aa
add actions into document viewer
2026-09-14 17:54:49 +02:00
m
6a991f0e21
merge feature
2026-09-14 15:46:06 +02:00
m
4caa723853
share files
2026-09-14 15:45:44 +02:00
m
03837edb72
remove merge opt keep delete opt
2026-09-14 15:13:12 +02:00
m
191ca002bc
share folders and details
2026-09-14 14:18:34 +02:00
m
e9c85febca
share folders and files
2026-09-14 14:09:41 +02:00
m
09669a1e7b
badge de sync
2026-09-14 09:57:02 +02:00
m
95e63da1a1
badge de status de sync
2026-09-14 09:56:48 +02:00
m
a973d789cd
process gate document
2026-09-14 09:46:08 +02:00
m
e0fd9ce99a
delete files
2026-09-14 09:42:19 +02:00
m
7fff65af4f
fix scanner + pdf creator
2026-09-14 09:37:53 +02:00
m
696395eb68
fix scanner + pdf creator
2026-09-13 22:31:22 +02:00
m
8a4cd44ef8
add document scanner
2026-09-13 22:05:13 +02:00
m
612e3b0eff
add document scanner
2026-09-13 21:48:49 +02:00
m
3ef6ac7dcb
add document scanner
2026-09-13 21:45:28 +02:00
m
5578e4a354
add tests
2026-09-13 19:24:58 +02:00
m
c054b90c92
sync platecement
2026-09-13 10:10:06 +02:00
m
0b12f45b6c
outbox sync
2026-09-13 10:09:21 +02:00
m
bad04b3219
sync oubox
2026-09-13 09:58:19 +02:00
m
201d6a03f2
add sync status
2026-09-13 09:25:18 +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
1460fdfe0e
outbox integration
2026-09-12 22:08:29 +02:00
m
86006c285e
remove swipe action
2026-09-12 20:58:27 +02:00
m
7cc8c6eb24
add saf config
2026-09-12 20:48:00 +02:00
m
ec99d1ac18
swipe documents
2026-09-12 20:01:14 +02:00
m
06361ae62f
create sub folders
2026-09-12 19:21:36 +02:00
m
b7eb291c84
fix agent
2026-09-12 18:57:16 +02:00
m
608ef8757e
fix vaultdrop fil darriane
2026-09-12 18:52:42 +02:00
m
ea59c49547
add fichiers filters
2026-09-12 18:49:43 +02:00
m
4e7d368b2d
floating nav bar interraction
2026-09-12 15:51:43 +02:00
m
925151faf3
floating nav bar interraction
2026-09-12 15:46:53 +02:00
m
a1f59a3455
create folders and move files into
2026-09-12 15:34:49 +02:00
m
fca8ef4c13
create folders
2026-09-12 15:07:59 +02:00
m
bada082c35
create folders
2026-09-12 15:07:52 +02:00
m
5f90cc9059
local mode stored into local database
2026-09-12 14:11:27 +02:00
m
22858e38ce
local mode stored into local database
2026-09-12 14:11:22 +02:00
m
e314f63760
fix pdf viewer
2026-09-12 12:39:52 +02:00
m
e30051d238
generate pdf and save them to the directory
2026-09-12 12:17:00 +02:00
m
f2c8a27252
pdf build
2026-09-12 12:02:51 +02:00
m
3a232138bd
multi select and generate pdf
2026-09-12 11:33:33 +02:00
m
9d44703400
zoom on documents
2026-09-12 11:06:59 +02:00
m
e52624aed7
add focus mode on text and document
2026-09-12 10:30:49 +02:00
m
7dd3bc66f5
connexion status
2026-09-12 10:01:54 +02:00
m
9fed148a12
add local status
2026-09-12 10:01:43 +02:00
m
2d23ba1bde
add mise
2026-09-12 09:46:14 +02:00
m
e272ecfb44
add pdf viewer
2026-09-12 09:46:09 +02:00
m
1134ecaedb
focus on document
2026-09-12 01:33:04 +02:00
m
aa139b6d33
user modification date
2026-09-12 01:16:47 +02:00
m
0041a1a48a
auth settings
2026-09-12 01:08:20 +02:00
m
45028dd70a
auth settings
2026-09-12 01:08:10 +02:00
m
ea11f28420
icones distinctes par categorie de document
2026-09-11 23:55:19 +02:00
m
13deb5e893
remove react native app
2026-09-11 23:44:04 +02:00
m
4314770096
load saf multi view
2026-09-11 23:31:03 +02:00
m
100bff994d
dark mode, lignht mode
2026-09-11 23:19:37 +02:00
m
64690d11f9
add recente document
2026-09-11 23:07:23 +02:00
m
eddf40d806
add application migration
2026-09-11 18:21:10 +02:00
m
2de3754ca9
preview document is working properly
2026-09-11 17:02:36 +02:00
m
bca29ed26f
filedao
2026-09-11 16:56:49 +02:00
m
28586931d3
saf scanner
2026-09-11 16:42:29 +02:00
m
93c9719969
navbar
2026-09-11 13:43:11 +02:00
m
3a57532b40
working kotlin mobile app
2026-09-11 13:10:40 +02:00
m
b2d8f3702c
kotlin refacto mobile app
2026-09-11 12:40:50 +02:00
m
6666c5b469
remove doc + saf
2026-09-11 11:14:20 +02:00
m
2d9be3f489
fix the unfixeble
2026-09-11 10:49:12 +02:00
m
76ed3aa66b
add saf directory display fix
2026-09-10 23:08:17 +02:00
m
367073ed89
add floating nav bar + regroup files by date
2026-09-10 22:21:46 +02:00
m
6332e9cac4
add test + fix sqlite pb
2026-09-10 22:08:27 +02:00
m
4e2d92a80e
login without distant server local only mode
2026-09-10 21:56:34 +02:00
m
cac2400917
test(e2e): purge de l'active user avant de retirer l'override DB (évite le chargement lazy d'expo-sqlite sous Node)
2026-09-10 21:38:54 +02:00
m
0536fca6c3
feat(mobile): identité user-first — login/password, SecureStore, scoping par compte
...
- api: DeviceRegistration device-only, login/changePassword/resolveUser, interception 401 (purge) exonérée sur le login ; type User aligné sur le fil (is_admin)
- SecureStore (expo-secure-store v57) : token + profil, jamais en SQLite ; miroir active_user_id
- AuthContext : statut loading/signedOut/signedIn, bootstrap register→restore, signIn/signOut, garde-fou switch de compte
- app/login.tsx + gate de routes dans _layout (Redirect signedOut) ; i18n fr/en
- DB v5 : user_id sur pending_operations + resource_permissions (UNIQUE par user), repos scopés (user_id IS ? OR IS NULL)
- syncOutbox : delta permissions par compte (Map), outbox poussée du compte actif uniquement
- tests: register/login/401/resolve/changePassword, scoping outbox+permissions, migrations v5 ; e2e live revert register→login admin
2026-09-10 21:34:34 +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
197c7db8a9
feat(mobile): boucle sync client↔serveur — outbox push + snapshot permissions
...
- api/types.ts : SyncOperation, SyncResult (sémantique `applied` = INDEX documentée),
ResourcePermission (miroir docs/api-v1.md §6, consommé tel quel par saveResourcePermission)
- api/client.ts : syncOps (POST /sync/ops), getSyncPermissions (GET /sync/permissions?after=),
hasAuthToken() ; INVALID_RESPONSE documenté dans docs/api-v1.md §1/§4
- services/db/repositories/pendingOps.ts : listQueuedOperations(limit) (batch FIFO due)
+ scheduleRetries(ids, retryAt) qui ne modifie JAMAIS attempts (erreur transitoire,
contrairement à markPendingOperation('failed') qui incrémente + backoff)
- features/syncOutbox.ts (nouveau) :
* pushPendingOps : batch ≤ SYNC_BATCH_SIZE (50) → ops [0, applied) passent 'completed' ;
op à l'index applied refusée → 'failed' (backoff, dead-letter MAX_PENDING_ATTEMPTS) ;
ops suivantes intactes (re-soumission) ; réseau/5xx → scheduleRetries (retried) sans
dead-letter prématurée ; applied==0 && failed → rien commité, aucun compteur touché
* refreshPermissions : delta monotone en mémoire lastPermissionCachedAt → `after`,
upsert saveResourcePermission ; no-op sans token
- features/syncDevice.ts : le tick useSyncDevice() enchaîne SAF walk → pushPendingOps()
→ refreshPermissions(), tous deux gardés par hasAuthToken()
- tests/syncOutbox.test.ts : 12 cas (FIFO/limit, succès complet/partiel, applied=0,
transitoire réseau + 5xx sans incrément, dead-letter après MAX_PENDING_ATTEMPTS,
delta snapshot croisé) — npm run test:sync
- tests/e2e.live.test.ts : smoke real backend (register → push → relecture /files/folders →
snapshot), skip si serveur down, SORTI de npm test via npm run test:e2e
- gates : npx tsc --noEmit + npm run test → 56/56 verts (24 db + 20 api + 12 sync)
2026-09-10 20:23:55 +02:00
m
ea848fa9c7
chore: purge README.md et V1.md (specs obsolètes) — références basculées vers docs/api-v1.md + V2.md
...
- README.md (303 l) et V1.md (317 l) : specs aspirationales périmées (SQLite V1, image-picker/MMKV, endpoints tags, OCR Python)
- grep complet du repo : 2 seules références, les labels « obsolètes » de AGENTS.md:89 et docs/api-v1.md:5 — rien dans .github/, docker-compose, scripts npm
- AGENTS.md:89 + docs/api-v1.md:5 → pointeurs docs/api-v1.md / V2.md
2026-09-10 20:16:47 +02:00
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