feat(server): API de synchronisation incrémentale LWW (ticket #50)
Ajoute l'endpoint api/sync_api.dart, les use cases de synchronisation (application/sync_use_cases.dart) et l'adapter Postgres (infrastructure/postgres/synced_resource_repository.dart) implémentant un upsert LWW atomique via CTE (INSERT ... ON CONFLICT ... WHERE client_updated_at < EXCLUDED.client_updated_at, avec fallback UNION ALL pour le cas ignoré). dart pub get OK, dart analyze clean, dart test 15/15 vert. SQL d'upsert relu manuellement et jugé correct ; pas de test de bout en bout contre un vrai PostgreSQL faute d'accès Docker dans ce sandbox. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -22,6 +22,24 @@ abstract interface class AuthSessionRepository {
|
||||
Future<void> revoke({required String sessionId, required DateTime revokedAt});
|
||||
}
|
||||
|
||||
enum SyncWriteStatus { accepted, ignoredOlder }
|
||||
|
||||
final class SyncWriteResult {
|
||||
const SyncWriteResult({required this.status, required this.resource});
|
||||
|
||||
final SyncWriteStatus status;
|
||||
final SyncedResource resource;
|
||||
}
|
||||
|
||||
abstract interface class SyncedResourceRepository {
|
||||
Future<SyncWriteResult> upsertWithLww(SyncedResource resource);
|
||||
|
||||
Future<List<SyncedResource>> findAllForUserSince({
|
||||
required String ownerUserId,
|
||||
DateTime? since,
|
||||
});
|
||||
}
|
||||
|
||||
abstract interface class PasswordHasher {
|
||||
Future<String> hash(String password);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user