rwadurian/frontend/mining-app/lib/data/datasources/remote/mining_remote_datasource.dart

95 lines
2.8 KiB
Dart

import '../../models/share_account_model.dart';
import '../../models/mining_record_model.dart';
import '../../models/global_state_model.dart';
import '../../models/planting_record_model.dart';
import '../../../core/network/api_client.dart';
import '../../../core/network/api_endpoints.dart';
import '../../../core/error/exceptions.dart';
import '../../../domain/repositories/mining_repository.dart';
abstract class MiningRemoteDataSource {
Future<ShareAccountModel> getShareAccount(String accountSequence);
Future<MiningRecordsPage> getMiningRecords(
String accountSequence, {
int page = 1,
int pageSize = 20,
});
Future<GlobalStateModel> getGlobalState();
Future<PlantingLedgerPageModel> getPlantingLedger(
String accountSequence, {
int page = 1,
int pageSize = 10,
});
}
class MiningRemoteDataSourceImpl implements MiningRemoteDataSource {
final ApiClient client;
MiningRemoteDataSourceImpl({required this.client});
@override
Future<ShareAccountModel> getShareAccount(String accountSequence) async {
try {
final response = await client.get(ApiEndpoints.shareAccount(accountSequence));
return ShareAccountModel.fromJson(response.data);
} catch (e) {
throw ServerException(e.toString());
}
}
@override
Future<MiningRecordsPage> getMiningRecords(
String accountSequence, {
int page = 1,
int pageSize = 20,
}) async {
try {
final response = await client.get(
ApiEndpoints.miningRecords(accountSequence),
queryParameters: {'page': page, 'pageSize': pageSize},
);
final data = response.data;
final items = (data['items'] as List? ?? data['records'] as List? ?? [])
.map((json) => MiningRecordModel.fromJson(json))
.toList();
final pagination = data['pagination'] ?? {};
return MiningRecordsPage(
items: items,
total: pagination['total'] ?? items.length,
page: pagination['page'] ?? page,
pageSize: pagination['pageSize'] ?? pageSize,
totalPages: pagination['totalPages'] ?? 1,
);
} catch (e) {
throw ServerException(e.toString());
}
}
@override
Future<GlobalStateModel> getGlobalState() async {
try {
final response = await client.get(ApiEndpoints.globalState);
return GlobalStateModel.fromJson(response.data);
} catch (e) {
throw ServerException(e.toString());
}
}
@override
Future<PlantingLedgerPageModel> getPlantingLedger(
String accountSequence, {
int page = 1,
int pageSize = 10,
}) async {
try {
final response = await client.get(
ApiEndpoints.plantingLedger(accountSequence),
queryParameters: {'page': page, 'pageSize': pageSize},
);
return PlantingLedgerPageModel.fromJson(response.data);
} catch (e) {
throw ServerException(e.toString());
}
}
}