From 876c140adec23f4defdc411256549202825f4ef7 Mon Sep 17 00:00:00 2001 From: muhib349 Date: Tue, 13 Aug 2024 12:58:33 +0100 Subject: [PATCH 1/4] added network client with sample code --- network/lib/rest/client/rest_client.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 network/lib/rest/client/rest_client.dart diff --git a/network/lib/rest/client/rest_client.dart b/network/lib/rest/client/rest_client.dart new file mode 100644 index 0000000..53f5173 --- /dev/null +++ b/network/lib/rest/client/rest_client.dart @@ -0,0 +1,10 @@ +abstract class RestClient{ + dynamic get(dynamic queryParam); + dynamic post(dynamic requestBody); + dynamic put(dynamic queryParam); + dynamic delete(dynamic queryParam); + dynamic multipart(); + + void addInterceptor(); + void deleteInterceptor(); +} \ No newline at end of file From cb52290ad54a00216e4ef6476ca175dbbdbcd917 Mon Sep 17 00:00:00 2001 From: muhib349 Date: Sat, 17 Aug 2024 10:51:35 +0100 Subject: [PATCH 2/4] added rest client method implementation --- network/lib/rest/client/dio_client.dart | 54 ++++++++++++++++++++++++ network/lib/rest/client/rest_client.dart | 16 ++++--- 2 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 network/lib/rest/client/dio_client.dart diff --git a/network/lib/rest/client/dio_client.dart b/network/lib/rest/client/dio_client.dart new file mode 100644 index 0000000..a0426c6 --- /dev/null +++ b/network/lib/rest/client/dio_client.dart @@ -0,0 +1,54 @@ +import 'package:dio/dio.dart'; +import 'package:network/rest/client/rest_client.dart'; +import 'package:network/rest/di/di.dart'; + +class DioClient implements RestClient{ + + final _dio = getIt.get(); + + @override + Future get(String url, {Map? queryParameters}) async { + try { + final response = await _dio.get(url, queryParameters: queryParameters); + return response.data; + } on DioException catch (e) { + return _handleError(e); + } + } + + @override + Future post(String url, {data, Map? queryParameters}) async { + try { + final response = await _dio.post(url, data: data, queryParameters: queryParameters); + return response.data; + } on DioException catch (e) { + return _handleError(e); + } + } + + @override + Future put(String url, {data, Map? queryParameters}) async { + try { + final response = await _dio.put(url, data: data, queryParameters: queryParameters); + return response.data; + } on DioException catch (e) { + return _handleError(e); + } + } + + @override + Future delete(String url, {Map? queryParameters}) async { + try { + final response = await _dio.delete(url, queryParameters: queryParameters); + return response.data; + } on DioException catch (e) { + return _handleError(e); + } + } + + // Error handling function + dynamic _handleError(DioException e) { + // TODO handle exception + } + +} \ No newline at end of file diff --git a/network/lib/rest/client/rest_client.dart b/network/lib/rest/client/rest_client.dart index 53f5173..b128779 100644 --- a/network/lib/rest/client/rest_client.dart +++ b/network/lib/rest/client/rest_client.dart @@ -1,10 +1,12 @@ abstract class RestClient{ - dynamic get(dynamic queryParam); - dynamic post(dynamic requestBody); - dynamic put(dynamic queryParam); - dynamic delete(dynamic queryParam); - dynamic multipart(); - void addInterceptor(); - void deleteInterceptor(); + Future get(String url, {Map? queryParameters}); + Future post(String url, {dynamic data, Map? queryParameters}); + Future put(String url, {dynamic data, Map? queryParameters}); + Future delete(String url, {Map? queryParameters}); + + //dynamic multipart(); + + //void addInterceptor(); + //void deleteInterceptor(); } \ No newline at end of file From 13673b4d7e0e4b4a77d83a1a8a415639852fa299 Mon Sep 17 00:00:00 2001 From: muhib349 Date: Sat, 17 Aug 2024 10:51:59 +0100 Subject: [PATCH 3/4] added dio provider --- network/lib/rest/client/dio_provider.dart | 16 ++++++++++++++++ network/lib/rest/di/di.dart | 9 +++++++++ 2 files changed, 25 insertions(+) create mode 100644 network/lib/rest/client/dio_provider.dart create mode 100644 network/lib/rest/di/di.dart diff --git a/network/lib/rest/client/dio_provider.dart b/network/lib/rest/client/dio_provider.dart new file mode 100644 index 0000000..0882db4 --- /dev/null +++ b/network/lib/rest/client/dio_provider.dart @@ -0,0 +1,16 @@ +import 'package:dio/dio.dart'; + +class DioProvider { + Dio createDio() { + Dio dio = Dio(); + + dio.options.baseUrl = "https://api.example.com"; + dio.options.connectTimeout = const Duration(seconds: 10); + dio.options.receiveTimeout = const Duration(seconds: 10); + dio.options.headers = { + 'Content-Type': 'application/json', + }; + //TODO add interceptors + return dio; + } +} diff --git a/network/lib/rest/di/di.dart b/network/lib/rest/di/di.dart new file mode 100644 index 0000000..304bbbd --- /dev/null +++ b/network/lib/rest/di/di.dart @@ -0,0 +1,9 @@ +import 'package:dio/dio.dart'; +import 'package:get_it/get_it.dart'; +import 'package:network/rest/client/dio_provider.dart'; + +final getIt = GetIt.I; + +void setup() { + getIt.registerLazySingleton(() => DioProvider().createDio()); +} \ No newline at end of file From 51528077d0be3a0592ee6520561b2a7cf551f101 Mon Sep 17 00:00:00 2001 From: muhib349 Date: Wed, 21 Aug 2024 00:06:05 +0100 Subject: [PATCH 4/4] added token interceptor --- .../client/interceptor/token_interceptor.dart | 29 +++++++++++++++++++ network/lib/rest/client/token_provider.dart | 9 ++++++ network/pubspec.yaml | 1 + 3 files changed, 39 insertions(+) create mode 100644 network/lib/rest/client/interceptor/token_interceptor.dart create mode 100644 network/lib/rest/client/token_provider.dart diff --git a/network/lib/rest/client/interceptor/token_interceptor.dart b/network/lib/rest/client/interceptor/token_interceptor.dart new file mode 100644 index 0000000..2e669d4 --- /dev/null +++ b/network/lib/rest/client/interceptor/token_interceptor.dart @@ -0,0 +1,29 @@ +import 'package:dio/dio.dart'; + +class TokenInterceptor implements InterceptorsWrapper{ + final Future Function() tokenProvider; + + TokenInterceptor({required this.tokenProvider}); + + @override + void onError(DioException err, ErrorInterceptorHandler handler) { + return handler.next(err); + } + + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) async { + final token = await tokenProvider(); + + if (token.isNotEmpty) { + options.headers['Authorization'] = 'Bearer $token'; + } + + return handler.next(options); + } + + @override + void onResponse(Response response, ResponseInterceptorHandler handler) { + return handler.next(response); + } + +} \ No newline at end of file diff --git a/network/lib/rest/client/token_provider.dart b/network/lib/rest/client/token_provider.dart new file mode 100644 index 0000000..b8abf69 --- /dev/null +++ b/network/lib/rest/client/token_provider.dart @@ -0,0 +1,9 @@ + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +const _storage = FlutterSecureStorage(); + +Future tokenProvider() async { + final token = await _storage.read(key: 'auth_token'); + return token ?? ''; +} \ No newline at end of file diff --git a/network/pubspec.yaml b/network/pubspec.yaml index e36e83c..a33aee5 100644 --- a/network/pubspec.yaml +++ b/network/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: dio: ^5.6.0 get_it: 7.7.0 + flutter_secure_storage: ^9.2.2 dev_dependencies: flutter_test: