feat : auth package
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import 'package:hive_ce_flutter/hive_flutter.dart';
|
||||
|
||||
import 'i_local_storage.dart';
|
||||
|
||||
class HiveLocalStorage implements ILocalStorage {
|
||||
HiveLocalStorage() {
|
||||
Hive.initFlutter();
|
||||
}
|
||||
|
||||
final Map<String, Box> _boxes = {};
|
||||
|
||||
@override
|
||||
Future init() async => await Hive.initFlutter();
|
||||
|
||||
@override
|
||||
Future<void> openBox<T>(String boxName) async {
|
||||
if (!_boxes.containsKey(boxName)) {
|
||||
final box = await Hive.openBox<T>(boxName);
|
||||
_boxes[boxName] = box;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> delete(String boxName, String key) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.delete(key);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<T?> read<T>(String boxName, String key) async {
|
||||
Box? box = await getBox(boxName);
|
||||
return box.get(key) as T?;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> save(String boxName, String key, value) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.put(key, value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> add(String boxName, value) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.add(value);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> addAll(String boxName, Iterable values) async {
|
||||
Box<dynamic>? box = await getBox(boxName);
|
||||
await box.addAll(values);
|
||||
}
|
||||
|
||||
Future<Box<T>> getBox<T>(String boxName) async {
|
||||
final box = _boxes[boxName];
|
||||
if (box is Box<T>) {
|
||||
return box;
|
||||
} else {
|
||||
throw Exception('Box $boxName is not of expected type $T');
|
||||
}
|
||||
}
|
||||
}
|
||||
11
packages/core/lib/infrastructure/local/i_local_storage.dart
Normal file
11
packages/core/lib/infrastructure/local/i_local_storage.dart
Normal file
@@ -0,0 +1,11 @@
|
||||
abstract class ILocalStorage<E>{
|
||||
Future<void> init();
|
||||
Future<void> openBox<T>(String boxName);
|
||||
Future<void> save(String boxName, String key, dynamic value);
|
||||
Future<T?> read<T>(String boxName, String key);
|
||||
Future<void> delete(String boxName, String key);
|
||||
|
||||
Future<void> add(String boxName, E value);
|
||||
Future<void> addAll(String boxName, Iterable<E> values);
|
||||
|
||||
}
|
||||
23
packages/core/lib/infrastructure/remote/dio_form_data.dart
Normal file
23
packages/core/lib/infrastructure/remote/dio_form_data.dart
Normal file
@@ -0,0 +1,23 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'interfaces/i_form_data.dart';
|
||||
|
||||
class DioFormData implements IFormData {
|
||||
final FormData _formData = FormData();
|
||||
|
||||
@override
|
||||
void addFile(String field, Uint8List bytes, String filename) {
|
||||
_formData.files.add(MapEntry(
|
||||
field,
|
||||
MultipartFile.fromBytes(bytes, filename: filename),
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void addField(String key, String value) {
|
||||
_formData.fields.add(MapEntry(key, value));
|
||||
}
|
||||
|
||||
FormData get raw => _formData;
|
||||
}
|
||||
126
packages/core/lib/infrastructure/remote/dio_remote.dart
Normal file
126
packages/core/lib/infrastructure/remote/dio_remote.dart
Normal file
@@ -0,0 +1,126 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/interfaces/i_form_data.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/interfaces/i_http_response.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/interfaces/i_remote.dart';
|
||||
|
||||
import 'dio_form_data.dart';
|
||||
import 'dio_response.dart';
|
||||
import 'interfaces/i_http_client.dart';
|
||||
|
||||
class DioRemote implements IRemote, IHttpClient {
|
||||
final String baseUrl;
|
||||
late final Dio _dio;
|
||||
|
||||
DioRemote(this.baseUrl);
|
||||
|
||||
@override
|
||||
Future<void> init() async {
|
||||
final dio = Dio(BaseOptions(baseUrl: baseUrl));
|
||||
dio.interceptors.add(PrettyDioLogger());
|
||||
_dio = dio;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> get(
|
||||
String path, {
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get(
|
||||
path,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> post(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.post(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onSendProgress: onSendProgress,
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> put(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.put(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
onSendProgress: onSendProgress,
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> delete(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
}) async {
|
||||
final response = await _dio.delete(
|
||||
path,
|
||||
data: data,
|
||||
queryParameters: queryParameters,
|
||||
options: Options(headers: headers),
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse<Uint8List>> download(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
}) async {
|
||||
final response = await _dio.get<Uint8List>(
|
||||
url,
|
||||
options: Options(responseType: ResponseType.bytes),
|
||||
onReceiveProgress: onReceiveProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IHttpResponse> upload(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
}) async {
|
||||
final response = await _dio.post(
|
||||
path,
|
||||
data: (formData as DioFormData).raw,
|
||||
options: Options(headers: headers, contentType: 'multipart/form-data'),
|
||||
onSendProgress: onSendProgress,
|
||||
);
|
||||
return DioHttpResponse(response);
|
||||
}
|
||||
}
|
||||
21
packages/core/lib/infrastructure/remote/dio_response.dart
Normal file
21
packages/core/lib/infrastructure/remote/dio_response.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'interfaces/i_http_response.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
class DioHttpResponse<T> implements IHttpResponse<T> {
|
||||
final Response<T> _response;
|
||||
|
||||
DioHttpResponse(this._response);
|
||||
|
||||
@override
|
||||
T? get data => _response.data;
|
||||
|
||||
@override
|
||||
int get statusCode => _response.statusCode ?? 0;
|
||||
|
||||
@override
|
||||
Map<String, List<String>> get headers =>
|
||||
_response.headers.map.map((k, v) => MapEntry(k, v));
|
||||
|
||||
@override
|
||||
bool get isSuccessful => statusCode >= 200 && statusCode < 300;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
abstract class IFormData{
|
||||
void addFile(String field, Uint8List bytes, String filename);
|
||||
void addField(String key, String value);
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import 'dart:typed_data';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:rasadyar_core/infrastructure/remote/dio_form_data.dart';
|
||||
import 'i_http_response.dart';
|
||||
import 'i_form_data.dart';
|
||||
|
||||
abstract class IHttpClient {
|
||||
Future<IHttpResponse> get(
|
||||
String path, {
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> post(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> put(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> delete(
|
||||
String path, {
|
||||
dynamic data,
|
||||
Map<String, dynamic>? queryParameters,
|
||||
Map<String, String>? headers,
|
||||
});
|
||||
|
||||
Future<IHttpResponse<Uint8List>> download(
|
||||
String url, {
|
||||
ProgressCallback? onReceiveProgress,
|
||||
});
|
||||
|
||||
Future<IHttpResponse> upload(
|
||||
String path, {
|
||||
required IFormData formData,
|
||||
Map<String, String>? headers,
|
||||
ProgressCallback? onSendProgress,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
abstract class IHttpResponse<T> {
|
||||
T? get data;
|
||||
int get statusCode;
|
||||
Map<String, List<String>> get headers;
|
||||
bool get isSuccessful;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
abstract class IRemote<T>{
|
||||
Future<T> init();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user