From 42cca90579a2be034953fa6996a3394b9a31c4e1 Mon Sep 17 00:00:00 2001 From: Bigto Chan Date: Tue, 10 May 2022 00:41:54 +0800 Subject: [PATCH] TASK-3_1: Refactor blockchain related repositories codes to make them easier to read and maintain (#11) --- .../blockchain_info/blockchain_info_bloc.dart | 16 +++--- lib/domain/blockchain/boolean_dto.dart | 4 +- lib/domain/blockchain/number_dto.dart | 4 +- lib/domain/blockchain/text_dto.dart | 4 +- .../base_blockchain_repository.dart | 41 +++++++++++++++ ...y.dart => blockchain_info_repository.dart} | 17 +++---- .../blockchain/nft_repository.dart | 9 ++++ .../blockchain/services/request_helper.dart | 50 ------------------- 8 files changed, 70 insertions(+), 75 deletions(-) create mode 100644 lib/infrastructure/blockchain/base_blockchain_repository.dart rename lib/infrastructure/blockchain/{services/blockchain_repository.dart => blockchain_info_repository.dart} (81%) create mode 100644 lib/infrastructure/blockchain/nft_repository.dart delete mode 100644 lib/infrastructure/blockchain/services/request_helper.dart diff --git a/lib/application/blockchain_info/blockchain_info_bloc.dart b/lib/application/blockchain_info/blockchain_info_bloc.dart index 078c886..c71b712 100644 --- a/lib/application/blockchain_info/blockchain_info_bloc.dart +++ b/lib/application/blockchain_info/blockchain_info_bloc.dart @@ -1,9 +1,9 @@ import 'package:rxdart/rxdart.dart'; -import 'package:hnotes/Infrastructure/blockchain/services/blockchain_repository.dart'; +import 'package:hnotes/Infrastructure/blockchain/blockchain_info_repository.dart'; class BlockchainInfoBloc { - final BlockchainRepository _blockchainRepository = BlockchainRepository(); + final BlockchainInfoRepository _blockchainInfoRepository = BlockchainInfoRepository(); final _latestBlockNumberData = new PublishSubject>(); final _currentGasPriceData = new PublishSubject>(); @@ -26,16 +26,16 @@ class BlockchainInfoBloc { fetchAllBlockchainInfo() async { Future.wait([ - _sinkData(_latestBlockNumberData, _blockchainRepository.getLatestBlockNumber()), - _sinkData(_currentGasPriceData, _blockchainRepository.getCurrentGasPrice()), - _sinkData(_currentNetworkData, _blockchainRepository.getNetwork()), - _sinkData(_chainIdData, _blockchainRepository.getChainId()), - _sinkData(_nodeClientVersionData, _blockchainRepository.getNodeClientVersion()) + _sinkData(_latestBlockNumberData, _blockchainInfoRepository.getLatestBlockNumber()), + _sinkData(_currentGasPriceData, _blockchainInfoRepository.getCurrentGasPrice()), + _sinkData(_currentNetworkData, _blockchainInfoRepository.getNetwork()), + _sinkData(_chainIdData, _blockchainInfoRepository.getChainId()), + _sinkData(_nodeClientVersionData, _blockchainInfoRepository.getNodeClientVersion()) ]); } fetchNetworkData() async { - await _sinkData(_currentNetworkData, _blockchainRepository.getNetwork()); + await _sinkData(_currentNetworkData, _blockchainInfoRepository.getNetwork()); } Future _sinkData(PublishSubject data, Future fetchFunction) async { diff --git a/lib/domain/blockchain/boolean_dto.dart b/lib/domain/blockchain/boolean_dto.dart index 06a75f0..fce9d76 100644 --- a/lib/domain/blockchain/boolean_dto.dart +++ b/lib/domain/blockchain/boolean_dto.dart @@ -1,10 +1,10 @@ import 'dart:core'; +import 'dart:convert'; import 'package:http/http.dart' as http; import 'base_dto.dart'; import 'package:hnotes/domain/common_data.dart'; -import 'package:hnotes/infrastructure/blockchain/services/request_helper.dart'; // For response results that only contain a text string @@ -14,7 +14,7 @@ class BooleanResultDto extends BaseResultDto { BooleanResultDto.fromResponse(http.Response response, String method) { int statusCode = response.statusCode; if (statusCode == 200) { - final bool result = phraseResponseBooleanData(response.body, "result"); + final bool result = jsonDecode(response.body)["result"]; this.boolean = result; } else { final String errorMsg = "Query $method failed ($statusCode): ${response.body}"; diff --git a/lib/domain/blockchain/number_dto.dart b/lib/domain/blockchain/number_dto.dart index ba04c20..d1e0db0 100644 --- a/lib/domain/blockchain/number_dto.dart +++ b/lib/domain/blockchain/number_dto.dart @@ -1,8 +1,8 @@ +import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:hnotes/domain/common_data.dart'; import 'package:hnotes/domain/blockchain/base_dto.dart'; -import 'package:hnotes/infrastructure/blockchain/services/request_helper.dart'; // For response results that only contain one number @@ -13,7 +13,7 @@ class NumberResultDto extends BaseResultDto { NumberResultDto.fromResponse(http.Response response, String method) { int statusCode = response.statusCode; if (statusCode == 200) { - final String result = phraseResponseData(response.body, "result"); + final String result = jsonDecode(response.body)["result"]; if (result.contains("0x")) { this.hexNumber = result; final String number = int.tryParse(result).toString(); diff --git a/lib/domain/blockchain/text_dto.dart b/lib/domain/blockchain/text_dto.dart index 7318e7c..887a1b0 100644 --- a/lib/domain/blockchain/text_dto.dart +++ b/lib/domain/blockchain/text_dto.dart @@ -1,8 +1,8 @@ +import 'dart:convert'; import 'package:http/http.dart' as http; import 'base_dto.dart'; import 'package:hnotes/domain/common_data.dart'; -import 'package:hnotes/infrastructure/blockchain/services/request_helper.dart'; // For response results that only contain a text string @@ -12,7 +12,7 @@ class TextResultDto extends BaseResultDto { TextResultDto.fromResponse(http.Response response, String method) { int statusCode = response.statusCode; if (statusCode == 200) { - final String result = phraseResponseData(response.body, "result"); + final String result = jsonDecode(response.body)["result"]; this.text = result; } else { final String errorMsg = "Query $method failed ($statusCode): ${response.body}"; diff --git a/lib/infrastructure/blockchain/base_blockchain_repository.dart b/lib/infrastructure/blockchain/base_blockchain_repository.dart new file mode 100644 index 0000000..2b58fb0 --- /dev/null +++ b/lib/infrastructure/blockchain/base_blockchain_repository.dart @@ -0,0 +1,41 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:http/http.dart'; +import 'package:http/http.dart' as http; + +import 'package:hnotes/domain/secret/secret_model.dart'; +import 'package:hnotes/infrastructure/local_storage/secrets/secrets_repository.dart'; + + +class BaseBlockchainRepository { + final client = http.Client(); + + List _defaultParameter = []; + final _requestHeaders = {'Content-type': 'application/json'}; + final SecretRepository _secretRepository = new SecretRepository(); + + Future _readSecrets() async { + SecretModel _secretModel = await _secretRepository.getApiSecret(); + return _secretModel; + } + + String formPostRequestBody(String method, [var parameter]) { + parameter ??= _defaultParameter; + + return jsonEncode({ + "jsonrpc":"2.0", + "method": method, + "params": parameter, + "id": DateTime.now().millisecondsSinceEpoch + }); + } + + Future makePostRequest(String requestBody) async { + SecretModel secret = await _readSecrets(); + return await client.post( + Uri.parse(secret.urlWithKey), + headers: _requestHeaders, + body: requestBody, + ); + } +} diff --git a/lib/infrastructure/blockchain/services/blockchain_repository.dart b/lib/infrastructure/blockchain/blockchain_info_repository.dart similarity index 81% rename from lib/infrastructure/blockchain/services/blockchain_repository.dart rename to lib/infrastructure/blockchain/blockchain_info_repository.dart index 52ee80a..c3bbe60 100644 --- a/lib/infrastructure/blockchain/services/blockchain_repository.dart +++ b/lib/infrastructure/blockchain/blockchain_info_repository.dart @@ -1,15 +1,10 @@ import 'dart:async'; -import 'package:http/http.dart' as http; import 'package:hnotes/domain/blockchain/dto_collections.dart'; -import 'package:hnotes/infrastructure/blockchain/services/request_helper.dart'; +import 'package:hnotes/infrastructure/blockchain/base_blockchain_repository.dart'; -final requestHeaders = {'Content-type': 'application/json'}; - - -class BlockchainRepository { - final client = http.Client(); +class BlockchainInfoRepository extends BaseBlockchainRepository { /// Returns the number of the most recent block. Future> getLatestBlockNumber() async { @@ -54,9 +49,9 @@ class BlockchainRepository { /// For API responses that only contain a number (hex or decimal) Future _parseNumberResultDto(String methodName) async { - final String requestBody = formRequestBody(methodName); + final String requestBody = formPostRequestBody(methodName); - return await makeRequest(requestBody) + return await makePostRequest(requestBody) .then((response) { NumberResultDto dto = NumberResultDto.fromResponse(response, methodName); return dto; @@ -65,9 +60,9 @@ class BlockchainRepository { /// For API responses that only contain a text string Future _parseTextResult(String methodName) async { - final String requestBody = formRequestBody(methodName); + final String requestBody = formPostRequestBody(methodName); - return await makeRequest(requestBody) + return await makePostRequest(requestBody) .then((response) { TextResultDto dto = TextResultDto.fromResponse(response, methodName); return dto; diff --git a/lib/infrastructure/blockchain/nft_repository.dart b/lib/infrastructure/blockchain/nft_repository.dart new file mode 100644 index 0000000..6a44543 --- /dev/null +++ b/lib/infrastructure/blockchain/nft_repository.dart @@ -0,0 +1,9 @@ +import 'dart:async'; + +import 'package:hnotes/domain/blockchain/dto_collections.dart'; +import 'package:hnotes/infrastructure/blockchain/base_blockchain_repository.dart'; + + +class NftRepository extends BaseBlockchainRepository { + +} diff --git a/lib/infrastructure/blockchain/services/request_helper.dart b/lib/infrastructure/blockchain/services/request_helper.dart deleted file mode 100644 index 8506a3b..0000000 --- a/lib/infrastructure/blockchain/services/request_helper.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'dart:convert'; -import 'package:http/http.dart'; -import 'package:http/http.dart' as http; - -import 'package:hnotes/domain/secret/secret_model.dart'; -import 'package:hnotes/infrastructure/local_storage/secrets/secrets_repository.dart'; - - -List defaultParameter = []; -final requestHeaders = {'Content-type': 'application/json'}; -final String secretsFilePath = "assets/secret/secret.yaml"; -final SecretRepository _secretRepository = new SecretRepository(); - -String formRequestBody(String method, [var parameter]) { - parameter ??= defaultParameter; - - return jsonEncode({ - "jsonrpc":"2.0", - "method": method, - "params": parameter, - "id": DateTime.now().millisecondsSinceEpoch - }); -} - -Future _readSecrets() async { - SecretModel _secretModel = await _secretRepository.getApiSecret(); - - return _secretModel; -} - -Future makeRequest(String requestBody) async { - SecretModel secret = await _readSecrets(); - - final client = http.Client(); - - return await client.post( - Uri.parse(secret.urlWithKey), - headers: requestHeaders, - body: requestBody, - ); - -} - -String phraseResponseData(String body, String key) { - return jsonDecode(body)[key]; -} - -bool phraseResponseBooleanData(String body, String key) { - return jsonDecode(body)[key]; -}