feat : auth package

This commit is contained in:
2025-05-11 11:49:51 +03:30
parent 8cc4a7517c
commit 9ec761e6eb
34 changed files with 665 additions and 475 deletions

View File

@@ -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');
}
}
}

View 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);
}

View 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;
}

View 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);
}
}

View 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;
}

View File

@@ -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);
}

View File

@@ -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,
});
}

View File

@@ -0,0 +1,6 @@
abstract class IHttpResponse<T> {
T? get data;
int get statusCode;
Map<String, List<String>> get headers;
bool get isSuccessful;
}

View File

@@ -0,0 +1,4 @@
abstract class IRemote<T>{
Future<T> init();
}