Skip to content

Commit c78f24c

Browse files
author
Nikesh Maharjan
committed
unsound null-safety
0 parents  commit c78f24c

20 files changed

+634
-0
lines changed

.gitignore

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Miscellaneous
2+
*.class
3+
*.log
4+
*.pyc
5+
*.swp
6+
.DS_Store
7+
.atom/
8+
.buildlog/
9+
.history
10+
.svn/
11+
12+
# IntelliJ related
13+
*.iml
14+
*.ipr
15+
*.iws
16+
.idea/
17+
18+
# The .vscode folder contains launch configuration and tasks you configure in
19+
# VS Code which you may wish to be included in version control, so this line
20+
# is commented out by default.
21+
#.vscode/
22+
23+
# Flutter/Dart/Pub related
24+
**/doc/api/
25+
.dart_tool/
26+
.flutter-plugins
27+
.flutter-plugins-dependencies
28+
.packages
29+
.pub-cache/
30+
.pub/
31+
build/
32+
33+
# Android related
34+
**/android/**/gradle-wrapper.jar
35+
**/android/.gradle
36+
**/android/captures/
37+
**/android/gradlew
38+
**/android/gradlew.bat
39+
**/android/local.properties
40+
**/android/**/GeneratedPluginRegistrant.java
41+
42+
# iOS/XCode related
43+
**/ios/**/*.mode1v3
44+
**/ios/**/*.mode2v3
45+
**/ios/**/*.moved-aside
46+
**/ios/**/*.pbxuser
47+
**/ios/**/*.perspectivev3
48+
**/ios/**/*sync/
49+
**/ios/**/.sconsign.dblite
50+
**/ios/**/.tags*
51+
**/ios/**/.vagrant/
52+
**/ios/**/DerivedData/
53+
**/ios/**/Icon?
54+
**/ios/**/Pods/
55+
**/ios/**/.symlinks/
56+
**/ios/**/profile
57+
**/ios/**/xcuserdata
58+
**/ios/.generated/
59+
**/ios/Flutter/App.framework
60+
**/ios/Flutter/Flutter.framework
61+
**/ios/Flutter/Flutter.podspec
62+
**/ios/Flutter/Generated.xcconfig
63+
**/ios/Flutter/app.flx
64+
**/ios/Flutter/app.zip
65+
**/ios/Flutter/flutter_assets/
66+
**/ios/Flutter/flutter_export_environment.sh
67+
**/ios/ServiceDefinitions.json
68+
**/ios/Runner/GeneratedPluginRegistrant.*
69+
70+
# Exceptions to above rules.
71+
!**/ios/**/default.mode1v3
72+
!**/ios/**/default.mode2v3
73+
!**/ios/**/default.pbxuser
74+
!**/ios/**/default.perspectivev3
75+
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages

.metadata

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# This file tracks properties of this Flutter project.
2+
# Used by Flutter tool to assess capabilities and perform upgrades etc.
3+
#
4+
# This file should be version controlled and should not be manually edited.
5+
6+
version:
7+
revision: 840c9205b344a59e48a5926ee2d791cc5640924c
8+
channel: stable
9+
10+
project_type: package

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## [0.0.1] - TODO: Add release date.
2+
3+
* TODO: Describe initial release.

LICENSE

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TODO: Add your license here.

README.md

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# rest_client
2+
3+
A new Flutter package.
4+
5+
## Getting Started
6+
7+
This project is a starting point for a Dart
8+
[package](https://flutter.dev/developing-packages/),
9+
a library module containing code that can be shared easily across
10+
multiple Flutter or Dart projects.
11+
12+
For help getting started with Flutter, view our
13+
[online documentation](https://flutter.dev/docs), which offers tutorials,
14+
samples, guidance on mobile development, and a full API reference.

lib/rest_client.dart

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
library rest_client;
2+
3+
export 'package:rest_client/src/dio/file_upload/file_upload_repository.dart';
4+
export 'package:rest_client/src/dio/http_config.dart';
5+
export 'package:rest_client/src/dio/http_helper.dart';
6+
export 'package:rest_client/src/dio/request/request_endpoint.dart';
7+
export 'package:rest_client/src/dio/request/request_model.dart';
8+
export 'package:rest_client/src/exceptions/network_exceptions.dart';

lib/src/dio/dio_builder.dart

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:flutter/foundation.dart';
3+
import 'package:rest_client/rest_client.dart';
4+
import 'package:rest_client/src/dio/interceptors/request_interceptor.dart';
5+
6+
import 'interceptors/pretty_logger.dart';
7+
8+
class DioBuilder {
9+
Dio _dio;
10+
final IHttpConfig config;
11+
DioBuilder({this.config});
12+
13+
Dio build() {
14+
debugPrint('dio initialized ${config.baseUrl}');
15+
_dio = Dio();
16+
// ..options.connectTimeout = config?.connectTimeout ?? 10000
17+
// ..options.receiveTimeout = config?.receiveTimeout ?? 10000
18+
_dio.interceptors.add(PrettyLoggerInterceptor().prettyDioLogger);
19+
_dio.interceptors.add(RequestInterceptor(config).getInterceptor());
20+
_dio.options.baseUrl = config.baseUrl;
21+
// _dio.options.headers = {'Authorization':'Bearer ${config.token}'};
22+
return _dio;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:flutter/foundation.dart';
3+
import 'package:http_parser/http_parser.dart';
4+
import 'package:mime/mime.dart';
5+
import 'package:rest_client/rest_client.dart';
6+
import 'package:rest_client/src/dio/dio_builder.dart';
7+
import 'package:rest_client/src/dio/request/request_endpoint.dart';
8+
9+
abstract class IFileUploadRepository {
10+
Future<dynamic> uploadSingleFile(
11+
{@required IRequestEndPoint endPoint,
12+
@required String filePath,
13+
String filename,
14+
String key});
15+
}
16+
17+
class FileUploadRepository implements IFileUploadRepository {
18+
final Dio _dio;
19+
IHttpConfig config;
20+
21+
FileUploadRepository({@required IHttpConfig config})
22+
: _dio = DioBuilder(config: config).build();
23+
24+
@override
25+
Future uploadSingleFile(
26+
{IRequestEndPoint endPoint,
27+
String filePath,
28+
String filename,
29+
String key = 'file'}) async {
30+
try {
31+
String mimetype = lookupMimeType(filePath);
32+
final formData = FormData.fromMap({
33+
key: await MultipartFile.fromFile(filePath,
34+
filename: filename, contentType: MediaType.parse(mimetype))
35+
});
36+
final response = await _dio.post(endPoint.url, data: formData);
37+
return response.data;
38+
} on DioError catch (e) {
39+
rethrow;
40+
}
41+
}
42+
}

lib/src/dio/http_config.dart

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
abstract class IHttpConfig {
2+
String get baseUrl;
3+
4+
Future<String> get token;
5+
6+
int connectionTimeout;
7+
int receiveTimeout;
8+
String contentType;
9+
}

lib/src/dio/http_helper.dart

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'dart:io';
2+
3+
import 'package:dio/dio.dart';
4+
import 'package:rest_client/rest_client.dart';
5+
import 'package:rest_client/src/dio/request/request_endpoint.dart';
6+
import 'package:rest_client/src/dio/request/request_model.dart';
7+
8+
import 'dio_builder.dart';
9+
10+
abstract class IHttpHelper {
11+
Future<dynamic> request(IRequestEndPoint endPoint, IRequestModel requestModel,
12+
{Map<String, dynamic> headers});
13+
}
14+
15+
class HttpHelper implements IHttpHelper {
16+
final Dio _dio;
17+
CancelToken cancelToken = CancelToken();
18+
IHttpConfig config;
19+
20+
HttpHelper({this.config}) : _dio = DioBuilder(config: config).build();
21+
22+
@override
23+
Future request(IRequestEndPoint endPoint, IRequestModel requestModel,
24+
{Map<String, dynamic> headers}) async {
25+
try {
26+
switch (endPoint.method) {
27+
case RequestMethod.DELETE:
28+
return (await _dio.delete(endPoint.url,
29+
options: Options(headers: headers),
30+
queryParameters: requestModel.toJson(),
31+
cancelToken: cancelToken))
32+
.data;
33+
case RequestMethod.GET:
34+
return (await _dio.get(endPoint.url,
35+
options: Options(headers: headers),
36+
queryParameters: requestModel.toJson(),
37+
cancelToken: cancelToken))
38+
.data;
39+
case RequestMethod.POST:
40+
return (await _dio.post(endPoint.url,
41+
options: Options(headers: headers),
42+
data: requestModel.toJson(),
43+
cancelToken: cancelToken))
44+
.data;
45+
case RequestMethod.PATCH:
46+
return (await _dio.patch(endPoint.url,
47+
options: Options(headers: headers),
48+
data: requestModel.toJson(),
49+
cancelToken: cancelToken))
50+
.data;
51+
break;
52+
case RequestMethod.PUT:
53+
return (await _dio.put(endPoint.url,
54+
options: Options(headers: headers),
55+
data: requestModel.toJson(),
56+
cancelToken: cancelToken))
57+
.data;
58+
}
59+
} on DioError catch (e) {
60+
switch (e.response.statusCode) {
61+
//logout
62+
}
63+
return e.response.data;
64+
} on SocketException catch (e) {
65+
throw SocketException(e.toString());
66+
} on FormatException catch (_) {
67+
throw FormatException("Unable to process the data");
68+
} catch (e) {
69+
throw e;
70+
}
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
2+
3+
class PrettyLoggerInterceptor {
4+
final PrettyDioLogger prettyDioLogger = PrettyDioLogger(
5+
request: true, requestBody: true, requestHeader: true, maxWidth: 140);
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:flutter/foundation.dart';
3+
4+
import '../http_config.dart';
5+
6+
class RequestInterceptor {
7+
final IHttpConfig config;
8+
9+
RequestInterceptor(this.config);
10+
11+
InterceptorsWrapper getInterceptor() {
12+
return InterceptorsWrapper(onRequest: (RequestOptions options) async {
13+
return onRequest(options);
14+
});
15+
}
16+
17+
Object onRequest(RequestOptions options) async {
18+
final token = await config.token;
19+
options.contentType = config.contentType;
20+
options.baseUrl = config.baseUrl;
21+
token != null
22+
? (options.headers['Authorization'] = 'Bearer ${await config.token}')
23+
: options.headers;
24+
debugPrint('baseUrl ${config.baseUrl}');
25+
return options;
26+
}
27+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
abstract class IRequestEndPoint {
2+
String get url;
3+
4+
RequestMethod method;
5+
}
6+
7+
enum RequestMethod { GET, POST, PATCH, PUT, DELETE }
8+
9+
class RequestEndPoint implements IRequestEndPoint {
10+
final RequestMethod requestMethod;
11+
final String requestUrl;
12+
13+
RequestEndPoint(this.requestMethod, this.requestUrl);
14+
15+
@override
16+
RequestMethod method;
17+
18+
@override
19+
String get url => requestUrl;
20+
}
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
abstract class IRequestModel {
2+
Map<String, dynamic> toJson();
3+
}
4+
5+
class BaseRequestModel implements IRequestModel {
6+
@override
7+
Map<String, dynamic> toJson() => {};
8+
}
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import 'package:flutter/foundation.dart';
2+
3+
class EmptyResponse {
4+
ResponseEntity<EmptyResponse> get response =>
5+
ResponseEntity(response: null, errorMessage: '', errors: null);
6+
}
7+
8+
class ResponseEntity<T> {
9+
final T response;
10+
final String errorMessage;
11+
final Map<String, dynamic> errors;
12+
13+
ResponseEntity(
14+
{@required this.response,
15+
@required this.errorMessage,
16+
@required this.errors});
17+
18+
factory ResponseEntity.fromJson(
19+
{String rootNode = 'data',
20+
@required Map<String, dynamic> json,
21+
T Function(Object o) fromJson}) {
22+
return ResponseEntity(
23+
response: fromJson(json[rootNode]), errorMessage: '', errors: null);
24+
}
25+
26+
factory ResponseEntity.fromEntity(T t) {
27+
return ResponseEntity(response: t, errorMessage: '', errors: null);
28+
}
29+
30+
factory ResponseEntity.withError(String message) {
31+
return ResponseEntity(response: null, errorMessage: message, errors: null);
32+
}
33+
}

0 commit comments

Comments
 (0)