Adds user ID to SMS messages

Ensures SMS messages are associated with a specific user by adding a `userId` field to the `SmsMessage` model and passing the user ID when retrieving SMS messages.

This change ensures that SMS messages are correctly linked to the user they belong to, which is necessary for filtering and displaying the appropriate messages. It retrieves the user ID from the `UserCubit` state. Handles the case where the user state is not loaded, emitting an error state.
This commit is contained in:
2025-07-09 22:06:28 +03:00
parent c997feac4a
commit d19f58d65e
5 changed files with 44 additions and 23 deletions
+22 -13
View File
@@ -31,8 +31,13 @@ class SmsCubit extends Cubit<SmsState> {
try {
final hasPermissions = await _smsService.requestPermissions();
if (hasPermissions) {
final messages = await _smsService.getLastSmsMessages(10);
emit(SmsLoaded(messages));
final userState = _userCubit.state;
if (userState is UserLoaded) {
final messages = await _smsService.getLastSmsMessages(10, userState.user!.id);
emit(SmsLoaded(messages));
} else {
emit(SmsError("User not loaded"));
}
} else {
emit(SmsPermissionDenied());
}
@@ -51,20 +56,24 @@ class SmsCubit extends Cubit<SmsState> {
if (hasPermissions) {
// Комментарий: Получаем текущего пользователя из состояния UserCubit.
final userState = _userCubit.state;
final user = userState is UserLoaded ? userState.user : null;
if (userState is UserLoaded) {
final user = userState.user;
// Комментарий: Получаем все SMS-сообщения с момента последней синхронизации.
final messages = await _smsService.getSmsMessagesSince(DateTime.now());
// Комментарий: Получаем все SMS-сообщения с момента последней синхронизации.
final messages = await _smsService.getSmsMessagesSince(user!.lastSmsSyncTime, user.id);
// Комментарий: Сохраняем новые сообщения через репозиторий и создаем транзакции.
await _smsRepository.addAll(messages);
for (final message in messages) {
// Комментарий: Пытаемся создать транзакцию из SMS.
_createTransactionFromSms(message);
// Комментарий: Сохраняем новые сообщения через репозиторий и создаем транзакции.
await _smsRepository.addAll(messages);
for (final message in messages) {
// Комментарий: Пытаемся создать транзакцию из SMS.
_createTransactionFromSms(message);
}
// Комментарий: Устанавливаем состояние успешной загрузки.
emit(SmsLoaded(messages));
} else {
emit(SmsError("User not loaded"));
}
// Комментарий: Устанавливаем состояние успешной загрузки.
emit(SmsLoaded(messages));
} else {
// Комментарий: Если разрешение не получено, устанавливаем состояние "в доступе отказано".
emit(SmsPermissionDenied());
+6 -5
View File
@@ -25,7 +25,7 @@ class UserCubit extends Cubit<UserState> {
final ITransactionRepository _transactionRepository;
final Logger _logger = Logger(
printer: PrettyPrinter(
methodCount: 15, // Number of method calls to be displayed
methodCount: 2, // Number of method calls to be displayed
errorMethodCount: 8, // Number of method calls if stacktrace is provided
lineLength: 120, // Width of the output
colors: true, // Colorful log messages
@@ -70,9 +70,12 @@ class UserCubit extends Cubit<UserState> {
emit(UserLoading(progress: 1.0, message: 'Завершение...'));
await Future.delayed(const Duration(milliseconds: 300));
emit(UserLoaded(currentUser));
} catch (e, stack) {
_logger.e('--- UserCubit: FATAL ERROR in _init ---', error: e, stackTrace: stack);
_logger.e(
'--- UserCubit: FATAL ERROR in _init ---',
error: e,
stackTrace: stack,
);
emit(UserError('Ошибка загрузки пользователя: ${e.toString()}'));
}
}
@@ -106,8 +109,6 @@ class UserCubit extends Cubit<UserState> {
await _transactionRepository.addAll(
TransactionUtils.getSampleTransactions(userId),
);
_logger.i('Initial data created for user: $userId');
} catch (e, stack) {
_logger.e(
'Error creating initial data for user: $userId',
+7 -1
View File
@@ -21,22 +21,28 @@ class SmsMessage extends HiveObject {
@HiveField(4)
String? transactionId;
// Комментарий: Добавлено поле для связи с пользователем.
@HiveField(5)
final String userId;
SmsMessage({
String? id,
this.body,
this.sender,
this.date,
this.transactionId,
required this.userId,
}) : id = id ?? IdGenerator.generateId();
// Комментарий: Добавляем метод для обновления transactionId
SmsMessage copyWith({String? transactionId}) {
SmsMessage copyWith({String? transactionId, String? userId}) {
return SmsMessage(
id: id,
body: body,
sender: sender,
date: date,
transactionId: transactionId ?? this.transactionId,
userId: userId ?? this.userId,
);
}
}
+5 -2
View File
@@ -22,13 +22,14 @@ class SmsMessageAdapter extends TypeAdapter<SmsMessage> {
sender: fields[2] as String?,
date: fields[3] as DateTime?,
transactionId: fields[4] as String?,
userId: fields[5] as String,
);
}
@override
void write(BinaryWriter writer, SmsMessage obj) {
writer
..writeByte(5)
..writeByte(6)
..writeByte(0)
..write(obj.id)
..writeByte(1)
@@ -38,7 +39,9 @@ class SmsMessageAdapter extends TypeAdapter<SmsMessage> {
..writeByte(3)
..write(obj.date)
..writeByte(4)
..write(obj.transactionId);
..write(obj.transactionId)
..writeByte(5)
..write(obj.userId);
}
@override
+4 -2
View File
@@ -23,7 +23,7 @@ class SmsService {
///
/// Возвращает список объектов [SmsMessage].
/// В случае ошибки или отсутствия разрешений, возвращает пустой список.
Future<List<SmsMessage>> getLastSmsMessages(int count) async {
Future<List<SmsMessage>> getLastSmsMessages(int count, String userId) async {
final bool? permissionsGranted =
await _telephony.requestPhoneAndSmsPermissions;
if (permissionsGranted ?? false) {
@@ -36,13 +36,14 @@ class SmsService {
body: msg.body,
sender: msg.address,
date: DateTime.fromMillisecondsSinceEpoch(msg.date ?? 0),
userId: userId,
)).toList();
}
return [];
}
// Комментарий: Метод для получения SMS-сообщений с определенной даты.
Future<List<SmsMessage>> getSmsMessagesSince(DateTime sinceDate) async {
Future<List<SmsMessage>> getSmsMessagesSince(DateTime sinceDate, String userId) async {
final bool? permissionsGranted = await _telephony.requestPhoneAndSmsPermissions;
if (permissionsGranted ?? false) {
final List<telephony_package.SmsMessage> messages = await _telephony.getInboxSms(
@@ -56,6 +57,7 @@ class SmsService {
body: msg.body,
sender: msg.address,
date: DateTime.fromMillisecondsSinceEpoch(msg.date ?? 0),
userId: userId,
))
.toList();
}