feat(app): 统一同步协议 — SyncModels + ApiClient.sync + SyncEngine.tryBatchSync
Some checks failed
Main Merge / backend (push) Has been cancelled
Main Merge / frontend (push) Has been cancelled

Flutter ↔ Rust 同步协议对齐:
- 新增 sync_models.dart: SyncReq/SyncResp/SyncChange/ConflictInfo
  与 Rust dto.rs 一一对应 (CreateJournal/UpdateJournal/DeleteJournal)
- ApiClient.sync(): 调用 POST /diary/sync 批量同步端点
- SyncEngine.tryBatchSync(): PendingOperation → SyncChange 批量提交
  成功清空队列,冲突保留待用户处理

保留原有逐个同步 trySync() 作为降级方案
后端 509/509 测试通过, Flutter analyze 0 error
This commit is contained in:
iven
2026-06-03 17:20:51 +08:00
parent 1766cefde9
commit 367f21de08
3 changed files with 267 additions and 0 deletions

View File

@@ -10,6 +10,8 @@
import 'package:dio/dio.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import '../models/sync_models.dart';
/// 网络离线异常 — 网络不可用时由 ApiClient 抛出
class OfflineException implements Exception {
final String message;
@@ -187,4 +189,19 @@ class ApiClient {
});
return _dio.post<T>(path, data: formData);
}
// ===== 同步 API =====
/// 批量同步 — POST /diary/sync
///
/// 将客户端变更批量提交到服务端,返回服务端变更和冲突信息。
/// 对应 Rust sync_handler::sync_journals 端点。
Future<SyncResp> sync(SyncReq req) async {
await _ensureOnline();
final response = await _dio.post<Map<String, dynamic>>(
'/diary/sync',
data: req.toJson(),
);
return SyncResp.fromJson(response.data!);
}
}