feat(logging): add logging to messages inbox_repository

This commit is contained in:
qzl
2026-04-01 14:31:28 +08:00
parent 7c311b0785
commit ccf6da60a1
@@ -1,6 +1,7 @@
import '../../../../data/network/i_api_client.dart'; import '../../../../data/network/i_api_client.dart';
import '../../../../data/cache/cache_policy.dart'; import '../../../../data/cache/cache_policy.dart';
import '../../../../data/cache/cached_repository.dart'; import '../../../../data/cache/cached_repository.dart';
import '../../../../core/logging/logger.dart';
import '../models/inbox_message.dart'; import '../models/inbox_message.dart';
abstract class InboxRepository { abstract class InboxRepository {
@@ -14,6 +15,7 @@ abstract class InboxRepository {
class InboxRepositoryImpl extends CachedRepository<List<InboxMessage>> class InboxRepositoryImpl extends CachedRepository<List<InboxMessage>>
implements InboxRepository { implements InboxRepository {
final IApiClient _apiClient; final IApiClient _apiClient;
final Logger _logger = getLogger('features.messages.repository');
static const _prefix = '/api/v1/inbox/messages'; static const _prefix = '/api/v1/inbox/messages';
InboxRepositoryImpl({required IApiClient apiClient, required super.store}) InboxRepositoryImpl({required IApiClient apiClient, required super.store})
@@ -41,36 +43,60 @@ class InboxRepositoryImpl extends CachedRepository<List<InboxMessage>>
} }
Future<List<InboxMessage>> _loadMessagesFromRemote({bool? isRead}) async { Future<List<InboxMessage>> _loadMessagesFromRemote({bool? isRead}) async {
final queryParams = isRead != null ? '?is_read=$isRead' : ''; try {
final response = await _apiClient.get<List<dynamic>>( final queryParams = isRead != null ? '?is_read=$isRead' : '';
'$_prefix$queryParams', final response = await _apiClient.get<List<dynamic>>(
); '$_prefix$queryParams',
final data = response.data; );
if (data == null) { final data = response.data;
throw StateError('Invalid getMessages response: empty payload'); if (data == null) {
throw StateError('Invalid getMessages response: empty payload');
}
return data
.whereType<Map<String, dynamic>>()
.map(InboxMessage.fromJson)
.toList(growable: false);
} catch (e, stackTrace) {
_logger.error(
message: 'Failed to load messages from remote',
error: e,
stackTrace: stackTrace,
extra: {'is_read': isRead},
);
rethrow;
} }
return data
.whereType<Map<String, dynamic>>()
.map(InboxMessage.fromJson)
.toList(growable: false);
} }
@override @override
Future<InboxMessage> markAsRead(String messageId) async { Future<InboxMessage> markAsRead(String messageId) async {
final response = await _apiClient.patch<Map<String, dynamic>>( try {
'$_prefix/$messageId/read', final response = await _apiClient.patch<Map<String, dynamic>>(
); '$_prefix/$messageId/read',
final data = response.data; );
if (data == null) { final data = response.data;
throw StateError('Invalid markAsRead response: empty payload'); if (data == null) {
throw StateError('Invalid markAsRead response: empty payload');
}
final message = InboxMessage.fromJson(data);
await Future.wait([
removeCacheKey(_messagesKey(false)),
removeCacheKey(_messagesKey(true)),
removeCacheKey(_messagesKey(null)),
]);
_logger.info(
message: 'Message marked as read',
extra: {'message_id': messageId},
);
return message;
} catch (e, stackTrace) {
_logger.error(
message: 'Failed to mark message as read',
error: e,
stackTrace: stackTrace,
extra: {'message_id': messageId},
);
rethrow;
} }
final message = InboxMessage.fromJson(data);
await Future.wait([
removeCacheKey(_messagesKey(false)),
removeCacheKey(_messagesKey(true)),
removeCacheKey(_messagesKey(null)),
]);
return message;
} }
static String _messagesKey(bool? isRead) { static String _messagesKey(bool? isRead) {