From 5eaff7ede39823006bc51fa08ca4d3e1c08b98c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Happi=20=28=E5=93=88=E6=AF=94=29?= Date: Tue, 10 Mar 2026 12:49:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5dbretry=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api_retry_repository_impl.dart | 55 +++++++++++++++++++ .../im_app/lib/domain/enums/retry_status.dart | 21 +++++++ .../repositories/api_retry_repository.dart | 13 +++++ 3 files changed, 89 insertions(+) create mode 100644 apps/im_app/lib/domain/enums/retry_status.dart diff --git a/apps/im_app/lib/data/repositories/api_retry_repository_impl.dart b/apps/im_app/lib/data/repositories/api_retry_repository_impl.dart index d68ea60..9c12fdc 100644 --- a/apps/im_app/lib/data/repositories/api_retry_repository_impl.dart +++ b/apps/im_app/lib/data/repositories/api_retry_repository_impl.dart @@ -1,6 +1,7 @@ import 'package:drift/drift.dart'; import 'package:im_app/data/local/drift/app_database.dart'; import 'package:im_app/domain/entities/api_retry.dart'; +import 'package:im_app/domain/enums/retry_status.dart'; import 'package:im_app/domain/repositories/api_retry_repository.dart'; import 'package:storage_sdk/storage_sdk.dart'; @@ -44,6 +45,23 @@ class ApiRetryRepositoryImpl implements ApiRetryRepository { addIndex: Value(apiRetry.addIndex), ); + // ── rawQuery row → Domain ───────────────────────────────────────────────── + + ApiRetry _fromRow(QueryRow row) => ApiRetry( + id: row.read('id'), + uid: row.readNullable('uid'), + apiType: row.read('api_type'), + endPoint: row.read('end_point'), + requestData: row.read('request_data'), + synced: row.readNullable('synced'), + callbackFun: row.read('callback_fun'), + expired: row.readNullable('expired'), + replace: row.readNullable('replace'), + expireTime: row.readNullable('expire_time'), + createTime: row.readNullable('create_time'), + addIndex: row.readNullable('add_index'), + ); + // ── 监听 ───────────────────────────────────────────────────────────────── @override @@ -76,6 +94,14 @@ class ApiRetryRepositoryImpl implements ApiRetryRepository { return row != null ? _toEntity(row) : null; } + @override + Future getByUid(int uid) async { + final row = await _storage.selectFirst( + (t) => t.uid.equals(uid), + ); + return row != null ? _toEntity(row) : null; + } + @override Future> getPending() async { final rows = await _storage.selectWhere( @@ -92,6 +118,24 @@ class ApiRetryRepositoryImpl implements ApiRetryRepository { return rows.map(_toEntity).toList(); } + @override + Future> getByEndPointPending(String endPoint) async { + final rows = await _storage.rawQuery( + 'SELECT * FROM api_retry WHERE end_point = ? AND synced = 0 ORDER BY create_time ASC', + [endPoint], + ); + return rows.map(_fromRow).toList(); + } + + @override + Future> getBySynced(int synced) async { + final rows = await _storage.rawQuery( + 'SELECT * FROM api_retry WHERE synced = ? ORDER BY create_time ASC', + [synced], + ); + return rows.map(_fromRow).toList(); + } + // ── 写入 ───────────────────────────────────────────────────────────────── @override @@ -145,6 +189,17 @@ class ApiRetryRepositoryImpl implements ApiRetryRepository { ); } + @override + Future deleteFinished() async { + await _storage + .rawQuery('DELETE FROM api_retry WHERE synced IN (?, ?, ?, ?)', [ + RetryStatus.success.value, + RetryStatus.failed.value, + RetryStatus.cancel.value, + RetryStatus.replace.value, + ]); + } + @override Future deleteSynced() async { await _storage.deleteWhere( diff --git a/apps/im_app/lib/domain/enums/retry_status.dart b/apps/im_app/lib/domain/enums/retry_status.dart new file mode 100644 index 0000000..6151ddf --- /dev/null +++ b/apps/im_app/lib/domain/enums/retry_status.dart @@ -0,0 +1,21 @@ +/// 重试同步状态 +/// +/// 对应 api_retry 表中 synced 字段的值 +enum RetryStatus { + notYet(0), + success(1), + failed(-1), + cancel(2), + replace(3); + + const RetryStatus(this.value); + + final int value; + + static RetryStatus fromValue(int value) { + return RetryStatus.values.firstWhere( + (e) => e.value == value, + orElse: () => RetryStatus.notYet, + ); + } +} diff --git a/apps/im_app/lib/domain/repositories/api_retry_repository.dart b/apps/im_app/lib/domain/repositories/api_retry_repository.dart index b3334d8..40bf457 100644 --- a/apps/im_app/lib/domain/repositories/api_retry_repository.dart +++ b/apps/im_app/lib/domain/repositories/api_retry_repository.dart @@ -14,12 +14,22 @@ abstract class ApiRetryRepository { Future getById(int id); + /// 读取指定 uid 的第一条重试任务 + Future getByUid(int uid); + /// 读取未同步的重试任务 Future> getPending(); /// 读取未过期的重试任务 Future> getActive(); + /// 读取指定 endPoint 且未同步的重试任务,按 createTime 升序 + Future> getByEndPointPending(String endPoint); + + /// 读取指定同步状态的所有重试任务,按 createTime 升序 + /// synced: 0 未同步 / 1 已同步 / -1 失败 + Future> getBySynced(int synced); + // ── 写入 ───────────────────────────────────────────────────────────────── /// 插入重试任务(autoIncrement id,无需提供) @@ -41,6 +51,9 @@ abstract class ApiRetryRepository { Future deleteByUid(int uid); + /// 删除已完成的重试任务(synced = success / failed / cancel / replace) + Future deleteFinished(); + /// 清除已同步的重试任务 Future deleteSynced();