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
|
caa6e6483c
|
feat(api): /devices register + paseto v4 (middleware Bearer, bootstrap mobile du token)
|
2026-09-10 07:25:11 +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
|
2ba837bcb0
|
from scratch
|
2026-09-09 18:23:01 +02:00 |
|
m
|
479c8ab61c
|
use auto sync
|
2026-08-29 09:31:53 +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
|
f4024c8aae
|
add pending actions
|
2026-08-26 17:29:10 +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
|
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
|
fe4fb6020e
|
background upload
|
2026-07-29 19:33:20 +02:00 |
|
m
|
00084758bf
|
background fetch
|
2026-07-29 19:24:13 +02:00 |
|
m
|
3d63dc1987
|
sse implémentaton
|
2026-07-29 19:08:22 +02:00 |
|
m
|
e8a5c02620
|
fix files details
|
2026-07-29 18:14:35 +02:00 |
|
m
|
7cc425d28b
|
fix server location on device registration
|
2026-07-28 21:45:02 +02:00 |
|
m
|
7af44152d7
|
sync details contain bugs
|
2026-07-28 21:21:08 +02:00 |
|
m
|
9c699446dc
|
migrate mobile with new endpoints
|
2026-07-28 20:28:32 +02:00 |
|
m
|
cae6c4d72d
|
sqlite database
|
2026-07-28 00:16:31 +02:00 |
|
m
|
e8ceb99a5d
|
display files with cache image
|
2026-07-27 23:02:09 +02:00 |
|
m
|
c5a959a27b
|
sync files
|
2026-07-27 22:13:13 +02:00 |
|
m
|
cb9cea6ff3
|
sync files
|
2026-07-27 21:44:57 +02:00 |
|
m
|
5c85ffa5fe
|
add files listing
|
2026-07-27 20:50:23 +02:00 |
|
m
|
0cc261105a
|
load local files
|
2026-07-27 15:52:51 +02:00 |
|