109 lines
3.0 KiB
Dart
109 lines
3.0 KiB
Dart
import 'package:dartz/dartz.dart';
|
|
import '../../../../core/errors/failures.dart';
|
|
import '../entities/scan_entity.dart';
|
|
import '../repositories/scanner_repository.dart';
|
|
|
|
/// Use case for saving scan data
|
|
/// Handles the business logic for saving scan information to both remote and local storage
|
|
class SaveScanUseCase {
|
|
final ScannerRepository repository;
|
|
|
|
SaveScanUseCase(this.repository);
|
|
|
|
/// Execute the save scan operation
|
|
///
|
|
/// First saves to remote server, then saves locally only if remote save succeeds
|
|
/// This ensures data consistency and allows for offline-first behavior
|
|
Future<Either<Failure, void>> call(SaveScanParams params) async {
|
|
// Validate input parameters
|
|
final validationResult = _validateParams(params);
|
|
if (validationResult != null) {
|
|
return Left(ValidationFailure(validationResult));
|
|
}
|
|
|
|
try {
|
|
// Save to remote server first
|
|
final remoteResult = await repository.saveScan(
|
|
barcode: params.barcode,
|
|
field1: params.field1,
|
|
field2: params.field2,
|
|
field3: params.field3,
|
|
field4: params.field4,
|
|
);
|
|
|
|
return remoteResult.fold(
|
|
(failure) => Left(failure),
|
|
(_) async {
|
|
// If remote save succeeds, save to local storage
|
|
final scanEntity = ScanEntity(
|
|
barcode: params.barcode,
|
|
timestamp: DateTime.now(),
|
|
field1: params.field1,
|
|
field2: params.field2,
|
|
field3: params.field3,
|
|
field4: params.field4,
|
|
);
|
|
|
|
final localResult = await repository.saveScanLocally(scanEntity);
|
|
return localResult.fold(
|
|
(failure) {
|
|
// Log the local save failure but don't fail the entire operation
|
|
// since remote save succeeded
|
|
return const Right(null);
|
|
},
|
|
(_) => const Right(null),
|
|
);
|
|
},
|
|
);
|
|
} catch (e) {
|
|
return Left(UnknownFailure('Failed to save scan: ${e.toString()}'));
|
|
}
|
|
}
|
|
|
|
/// Validate the input parameters
|
|
String? _validateParams(SaveScanParams params) {
|
|
if (params.barcode.trim().isEmpty) {
|
|
return 'Barcode cannot be empty';
|
|
}
|
|
|
|
if (params.field1.trim().isEmpty) {
|
|
return 'Field 1 cannot be empty';
|
|
}
|
|
|
|
if (params.field2.trim().isEmpty) {
|
|
return 'Field 2 cannot be empty';
|
|
}
|
|
|
|
if (params.field3.trim().isEmpty) {
|
|
return 'Field 3 cannot be empty';
|
|
}
|
|
|
|
if (params.field4.trim().isEmpty) {
|
|
return 'Field 4 cannot be empty';
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Parameters for the SaveScanUseCase
|
|
class SaveScanParams {
|
|
final String barcode;
|
|
final String field1;
|
|
final String field2;
|
|
final String field3;
|
|
final String field4;
|
|
|
|
SaveScanParams({
|
|
required this.barcode,
|
|
required this.field1,
|
|
required this.field2,
|
|
required this.field3,
|
|
required this.field4,
|
|
});
|
|
|
|
@override
|
|
String toString() {
|
|
return 'SaveScanParams{barcode: $barcode, field1: $field1, field2: $field2, field3: $field3, field4: $field4}';
|
|
}
|
|
} |