master #81
@ -24,9 +24,8 @@ import 'package:wyatt_http_client/wyatt_http_client.dart';
|
|||||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||||
|
|
||||||
class AlbumApiDataSourceImpl extends AlbumRemoteDataSource {
|
class AlbumApiDataSourceImpl extends AlbumRemoteDataSource {
|
||||||
final MiddlewareClient _client;
|
|
||||||
|
|
||||||
AlbumApiDataSourceImpl(this._client);
|
AlbumApiDataSourceImpl(this._client);
|
||||||
|
final MiddlewareClient _client;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Album> getAlbum(int id) async {
|
Future<Album> getAlbum(int id) async {
|
||||||
|
@ -24,9 +24,8 @@ import 'package:wyatt_http_client/wyatt_http_client.dart';
|
|||||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||||
|
|
||||||
class PhotoApiDataSourceImpl extends PhotoRemoteDataSource {
|
class PhotoApiDataSourceImpl extends PhotoRemoteDataSource {
|
||||||
final MiddlewareClient _client;
|
|
||||||
|
|
||||||
PhotoApiDataSourceImpl(this._client);
|
PhotoApiDataSourceImpl(this._client);
|
||||||
|
final MiddlewareClient _client;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Photo> getPhoto(int id) async {
|
Future<Photo> getPhoto(int id) async {
|
||||||
|
@ -24,15 +24,15 @@ import 'package:wyatt_architecture/wyatt_architecture.dart';
|
|||||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||||
|
|
||||||
class PhotoRepositoryImpl extends PhotoRepository {
|
class PhotoRepositoryImpl extends PhotoRepository {
|
||||||
final PhotoRemoteDataSource _photoRemoteDataSource;
|
|
||||||
final AlbumRemoteDataSource _albumRemoteDataSource;
|
|
||||||
final FavoriteLocalDataSource _favoriteLocalDataSource;
|
|
||||||
|
|
||||||
PhotoRepositoryImpl(
|
PhotoRepositoryImpl(
|
||||||
this._photoRemoteDataSource,
|
this._photoRemoteDataSource,
|
||||||
this._albumRemoteDataSource,
|
this._albumRemoteDataSource,
|
||||||
this._favoriteLocalDataSource,
|
this._favoriteLocalDataSource,
|
||||||
);
|
);
|
||||||
|
final PhotoRemoteDataSource _photoRemoteDataSource;
|
||||||
|
final AlbumRemoteDataSource _albumRemoteDataSource;
|
||||||
|
final FavoriteLocalDataSource _favoriteLocalDataSource;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<void> addPhotoToFavorites(Photo photo) => Result.tryCatchAsync(
|
FutureOrResult<void> addPhotoToFavorites(Photo photo) => Result.tryCatchAsync(
|
||||||
|
@ -21,9 +21,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class AddPhotoToFavorites extends AsyncUseCase<Photo, List<Photo>> {
|
class AddPhotoToFavorites extends AsyncUseCase<Photo, List<Photo>> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
AddPhotoToFavorites(this._photoRepository);
|
AddPhotoToFavorites(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<List<Photo>> execute(Photo? params) async {
|
FutureOrResult<List<Photo>> execute(Photo? params) async {
|
||||||
|
@ -20,9 +20,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class CheckIfPhotoIsInFavorites extends AsyncUseCase<int, bool> {
|
class CheckIfPhotoIsInFavorites extends AsyncUseCase<int, bool> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
CheckIfPhotoIsInFavorites(this._photoRepository);
|
CheckIfPhotoIsInFavorites(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<bool> execute(int? params) async =>
|
FutureOrResult<bool> execute(int? params) async =>
|
||||||
|
@ -19,9 +19,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class DisplayFavorites extends AsyncUseCase<NoParam, List<Photo>> {
|
class DisplayFavorites extends AsyncUseCase<NoParam, List<Photo>> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
DisplayFavorites(this._photoRepository);
|
DisplayFavorites(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<List<Photo>> execute(void params) {
|
FutureOrResult<List<Photo>> execute(void params) {
|
||||||
|
@ -21,9 +21,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class DisplayPhoto extends AsyncUseCase<int, Photo> {
|
class DisplayPhoto extends AsyncUseCase<int, Photo> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
DisplayPhoto(this._photoRepository);
|
DisplayPhoto(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<Photo> execute(int? params) {
|
FutureOrResult<Photo> execute(int? params) {
|
||||||
|
@ -22,9 +22,9 @@ import 'package:architecture_example/domain/usecases/photos/params/query_paramet
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class OpenAlbum extends AsyncUseCase<QueryParameters, List<Photo>> {
|
class OpenAlbum extends AsyncUseCase<QueryParameters, List<Photo>> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
OpenAlbum(this._photoRepository);
|
OpenAlbum(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<List<Photo>> execute(QueryParameters? params) {
|
FutureOrResult<List<Photo>> execute(QueryParameters? params) {
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
class QueryParameters {
|
class QueryParameters {
|
||||||
|
|
||||||
|
QueryParameters(this.start, this.limit, {this.albumId = -1});
|
||||||
final int albumId;
|
final int albumId;
|
||||||
final int? start;
|
final int? start;
|
||||||
final int? limit;
|
final int? limit;
|
||||||
|
|
||||||
QueryParameters(this.start, this.limit, {this.albumId = -1});
|
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,9 @@ import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class RemovePhotoFromFavorites extends AsyncUseCase<int, List<Photo>> {
|
class RemovePhotoFromFavorites extends AsyncUseCase<int, List<Photo>> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
RemovePhotoFromFavorites(this._photoRepository);
|
RemovePhotoFromFavorites(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<List<Photo>> execute(int? params) async {
|
FutureOrResult<List<Photo>> execute(int? params) async {
|
||||||
|
@ -22,9 +22,9 @@ import 'package:architecture_example/domain/usecases/photos/params/query_paramet
|
|||||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||||
|
|
||||||
class RetrieveAllAlbums extends AsyncUseCase<QueryParameters, List<Album>> {
|
class RetrieveAllAlbums extends AsyncUseCase<QueryParameters, List<Album>> {
|
||||||
final PhotoRepository _photoRepository;
|
|
||||||
|
|
||||||
RetrieveAllAlbums(this._photoRepository);
|
RetrieveAllAlbums(this._photoRepository);
|
||||||
|
final PhotoRepository _photoRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<List<Album>> execute(QueryParameters? params) {
|
FutureOrResult<List<Album>> execute(QueryParameters? params) {
|
||||||
|
@ -33,7 +33,6 @@ EventTransformer<E> throttleDroppable<E>(Duration duration) =>
|
|||||||
(events, mapper) => droppable<E>().call(events.throttle(duration), mapper);
|
(events, mapper) => droppable<E>().call(events.throttle(duration), mapper);
|
||||||
|
|
||||||
class AlbumBloc extends Bloc<AlbumEvent, AlbumState> {
|
class AlbumBloc extends Bloc<AlbumEvent, AlbumState> {
|
||||||
final RetrieveAllAlbums _retrieveAllAlbums;
|
|
||||||
|
|
||||||
AlbumBloc(this._retrieveAllAlbums) : super(const AlbumState()) {
|
AlbumBloc(this._retrieveAllAlbums) : super(const AlbumState()) {
|
||||||
on<AlbumFetched>(
|
on<AlbumFetched>(
|
||||||
@ -41,6 +40,7 @@ class AlbumBloc extends Bloc<AlbumEvent, AlbumState> {
|
|||||||
transformer: throttleDroppable(throttleDuration),
|
transformer: throttleDroppable(throttleDuration),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
final RetrieveAllAlbums _retrieveAllAlbums;
|
||||||
|
|
||||||
Future<void> _onAlbumFetched(
|
Future<void> _onAlbumFetched(
|
||||||
AlbumFetched event,
|
AlbumFetched event,
|
||||||
|
@ -26,19 +26,19 @@ abstract class PhotoDetailsState extends Equatable {
|
|||||||
class PhotoDetailsInitial extends PhotoDetailsState {}
|
class PhotoDetailsInitial extends PhotoDetailsState {}
|
||||||
|
|
||||||
class PhotoDetailsSuccess extends PhotoDetailsState {
|
class PhotoDetailsSuccess extends PhotoDetailsState {
|
||||||
final Photo photo;
|
|
||||||
final bool isFavorite;
|
|
||||||
|
|
||||||
const PhotoDetailsSuccess(this.photo, {required this.isFavorite});
|
const PhotoDetailsSuccess(this.photo, {required this.isFavorite});
|
||||||
|
final Photo photo;
|
||||||
|
final bool isFavorite;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [photo, isFavorite];
|
List<Object> get props => [photo, isFavorite];
|
||||||
}
|
}
|
||||||
|
|
||||||
class PhotoDetailsFailure extends PhotoDetailsState {
|
class PhotoDetailsFailure extends PhotoDetailsState {
|
||||||
final String error;
|
|
||||||
|
|
||||||
const PhotoDetailsFailure(this.error);
|
const PhotoDetailsFailure(this.error);
|
||||||
|
final String error;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [error];
|
List<Object> get props => [error];
|
||||||
|
@ -23,10 +23,10 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||||||
part 'favorite_checker_state.dart';
|
part 'favorite_checker_state.dart';
|
||||||
|
|
||||||
class FavoriteCheckerCubit extends Cubit<FavoriteCheckerState> {
|
class FavoriteCheckerCubit extends Cubit<FavoriteCheckerState> {
|
||||||
final CheckIfPhotoIsInFavorites _checkIfPhotoIsInFavorites;
|
|
||||||
|
|
||||||
FavoriteCheckerCubit(this._checkIfPhotoIsInFavorites)
|
FavoriteCheckerCubit(this._checkIfPhotoIsInFavorites)
|
||||||
: super(FavoriteCheckerInitial());
|
: super(FavoriteCheckerInitial());
|
||||||
|
final CheckIfPhotoIsInFavorites _checkIfPhotoIsInFavorites;
|
||||||
|
|
||||||
FutureOr<void> checkIfPhotoIsInFavorites(int photoId) async {
|
FutureOr<void> checkIfPhotoIsInFavorites(int photoId) async {
|
||||||
final response = await _checkIfPhotoIsInFavorites.call(photoId);
|
final response = await _checkIfPhotoIsInFavorites.call(photoId);
|
||||||
|
@ -10,19 +10,19 @@ abstract class FavoriteCheckerState extends Equatable {
|
|||||||
class FavoriteCheckerInitial extends FavoriteCheckerState {}
|
class FavoriteCheckerInitial extends FavoriteCheckerState {}
|
||||||
|
|
||||||
class FavoriteCheckerSuccess extends FavoriteCheckerState {
|
class FavoriteCheckerSuccess extends FavoriteCheckerState {
|
||||||
final int photoId;
|
|
||||||
final bool isFavorite;
|
|
||||||
|
|
||||||
const FavoriteCheckerSuccess(this.photoId, {required this.isFavorite});
|
const FavoriteCheckerSuccess(this.photoId, {required this.isFavorite});
|
||||||
|
final int photoId;
|
||||||
|
final bool isFavorite;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [photoId, isFavorite];
|
List<Object> get props => [photoId, isFavorite];
|
||||||
}
|
}
|
||||||
|
|
||||||
class FavoriteCheckerFailure extends FavoriteCheckerState {
|
class FavoriteCheckerFailure extends FavoriteCheckerState {
|
||||||
final String error;
|
|
||||||
|
|
||||||
const FavoriteCheckerFailure(this.error);
|
const FavoriteCheckerFailure(this.error);
|
||||||
|
final String error;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [error];
|
List<Object> get props => [error];
|
||||||
|
@ -33,7 +33,6 @@ EventTransformer<E> throttleDroppable<E>(Duration duration) =>
|
|||||||
(events, mapper) => droppable<E>().call(events.throttle(duration), mapper);
|
(events, mapper) => droppable<E>().call(events.throttle(duration), mapper);
|
||||||
|
|
||||||
class PhotoBloc extends Bloc<PhotoEvent, PhotoState> {
|
class PhotoBloc extends Bloc<PhotoEvent, PhotoState> {
|
||||||
final OpenAlbum _openAlbum;
|
|
||||||
|
|
||||||
PhotoBloc(this._openAlbum) : super(const PhotoState()) {
|
PhotoBloc(this._openAlbum) : super(const PhotoState()) {
|
||||||
on<PhotoFetched>(
|
on<PhotoFetched>(
|
||||||
@ -41,6 +40,7 @@ class PhotoBloc extends Bloc<PhotoEvent, PhotoState> {
|
|||||||
transformer: throttleDroppable(throttleDuration),
|
transformer: throttleDroppable(throttleDuration),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
final OpenAlbum _openAlbum;
|
||||||
|
|
||||||
Future<void> _onPhotoFetched(
|
Future<void> _onPhotoFetched(
|
||||||
PhotoFetched event,
|
PhotoFetched event,
|
||||||
|
@ -24,7 +24,7 @@ abstract class PhotoEvent extends Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class PhotoFetched extends PhotoEvent {
|
class PhotoFetched extends PhotoEvent {
|
||||||
final int albumId;
|
|
||||||
|
|
||||||
const PhotoFetched(this.albumId);
|
const PhotoFetched(this.albumId);
|
||||||
|
final int albumId;
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||||
|
|
||||||
abstract class AppException implements Exception {
|
abstract class AppException implements Exception {
|
||||||
final String? message;
|
|
||||||
|
|
||||||
AppException([this.message]);
|
AppException([this.message]);
|
||||||
|
final String? message;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
|
@ -20,6 +20,7 @@ part 'exceptions_firebase.dart';
|
|||||||
|
|
||||||
abstract class AuthenticationFailureInterface extends AppException
|
abstract class AuthenticationFailureInterface extends AppException
|
||||||
implements Exception {
|
implements Exception {
|
||||||
|
|
||||||
AuthenticationFailureInterface(this.code, this.msg);
|
AuthenticationFailureInterface(this.code, this.msg);
|
||||||
AuthenticationFailureInterface.fromCode(this.code)
|
AuthenticationFailureInterface.fromCode(this.code)
|
||||||
: msg = 'An unknown error occurred.';
|
: msg = 'An unknown error occurred.';
|
||||||
|
@ -20,8 +20,8 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
|||||||
|
|
||||||
class AuthenticationCacheDataSourceImpl<T extends Object>
|
class AuthenticationCacheDataSourceImpl<T extends Object>
|
||||||
extends AuthenticationCacheDataSource<T> {
|
extends AuthenticationCacheDataSource<T> {
|
||||||
AuthenticationCacheDataSourceImpl();
|
|
||||||
|
|
||||||
|
AuthenticationCacheDataSourceImpl();
|
||||||
Account? _account;
|
Account? _account;
|
||||||
T? _data;
|
T? _data;
|
||||||
|
|
||||||
|
@ -21,11 +21,11 @@ import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
|
|||||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||||
|
|
||||||
class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource {
|
class AuthenticationMockDataSourceImpl extends AuthenticationRemoteDataSource {
|
||||||
|
|
||||||
AuthenticationMockDataSourceImpl({
|
AuthenticationMockDataSourceImpl({
|
||||||
this.idToken = 'fake-id-token',
|
this.idToken = 'fake-id-token',
|
||||||
this.registeredAccounts,
|
this.registeredAccounts,
|
||||||
});
|
});
|
||||||
|
|
||||||
Pair<Account, String>? _connectedMock;
|
Pair<Account, String>? _connectedMock;
|
||||||
Pair<Account, String>? _registeredMock;
|
Pair<Account, String>? _registeredMock;
|
||||||
DateTime _lastSignInTime = DateTime.now();
|
DateTime _lastSignInTime = DateTime.now();
|
||||||
|
@ -93,7 +93,6 @@ class AuthenticationRepositoryImpl<T extends Object>
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final AuthenticationCacheDataSource<T> _authenticationLocalDataSource;
|
final AuthenticationCacheDataSource<T> _authenticationLocalDataSource;
|
||||||
final AuthenticationRemoteDataSource _authenticationRemoteDataSource;
|
final AuthenticationRemoteDataSource _authenticationRemoteDataSource;
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
|||||||
part 'authentication_state.dart';
|
part 'authentication_state.dart';
|
||||||
|
|
||||||
class AuthenticationCubit<Extra> extends Cubit<AuthenticationState<Extra>> {
|
class AuthenticationCubit<Extra> extends Cubit<AuthenticationState<Extra>> {
|
||||||
|
|
||||||
AuthenticationCubit({
|
AuthenticationCubit({
|
||||||
required AuthenticationRepository<Extra> authenticationRepository,
|
required AuthenticationRepository<Extra> authenticationRepository,
|
||||||
}) : _authenticationRepository = authenticationRepository,
|
}) : _authenticationRepository = authenticationRepository,
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
part of 'authentication_cubit.dart';
|
part of 'authentication_cubit.dart';
|
||||||
|
|
||||||
class AuthenticationState<Extra> extends Equatable {
|
class AuthenticationState<Extra> extends Equatable {
|
||||||
|
|
||||||
const AuthenticationState.unauthenticated()
|
const AuthenticationState.unauthenticated()
|
||||||
: this._(status: AuthenticationStatus.unauthenticated);
|
: this._(status: AuthenticationStatus.unauthenticated);
|
||||||
|
|
||||||
|
@ -22,7 +22,6 @@ class SignInState extends FormDataState {
|
|||||||
super.status = FormStatus.pure,
|
super.status = FormStatus.pure,
|
||||||
super.errorMessage,
|
super.errorMessage,
|
||||||
});
|
});
|
||||||
|
|
||||||
FormInputValidator<String?, ValidationError> get email =>
|
FormInputValidator<String?, ValidationError> get email =>
|
||||||
form.validatorOf(AuthFormField.email);
|
form.validatorOf(AuthFormField.email);
|
||||||
FormInputValidator<String?, ValidationError> get password =>
|
FormInputValidator<String?, ValidationError> get password =>
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
part of 'sign_up_cubit.dart';
|
part of 'sign_up_cubit.dart';
|
||||||
|
|
||||||
class SignUpState extends FormDataState {
|
class SignUpState extends FormDataState {
|
||||||
|
|
||||||
const SignUpState({
|
const SignUpState({
|
||||||
required super.form,
|
required super.form,
|
||||||
super.status = FormStatus.pure,
|
super.status = FormStatus.pure,
|
||||||
|
@ -24,14 +24,14 @@ import 'package:wyatt_crud_bloc/src/domain/entities/query.dart';
|
|||||||
|
|
||||||
class CrudInMemoryDataSourceImpl<Model extends ObjectModel>
|
class CrudInMemoryDataSourceImpl<Model extends ObjectModel>
|
||||||
extends CrudDataSource<Model> {
|
extends CrudDataSource<Model> {
|
||||||
|
|
||||||
|
CrudInMemoryDataSourceImpl({required this.toMap, Map<String, Model>? data})
|
||||||
|
: _data = data ?? {};
|
||||||
final Map<String, Model> _data;
|
final Map<String, Model> _data;
|
||||||
final StreamController<List<Model?>> _streamData = StreamController();
|
final StreamController<List<Model?>> _streamData = StreamController();
|
||||||
|
|
||||||
final Map<String, Object?> Function(Model) toMap;
|
final Map<String, Object?> Function(Model) toMap;
|
||||||
|
|
||||||
CrudInMemoryDataSourceImpl({required this.toMap, Map<String, Model>? data})
|
|
||||||
: _data = data ?? {};
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> create(Model object, {String? id}) async {
|
Future<void> create(Model object, {String? id}) async {
|
||||||
_data[id ?? object.id ?? ''] = object;
|
_data[id ?? object.id ?? ''] = object;
|
||||||
|
@ -22,10 +22,6 @@ import 'package:wyatt_crud_bloc/src/domain/entities/query.dart';
|
|||||||
|
|
||||||
class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity>
|
class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity>
|
||||||
extends CrudDataSource<Model> {
|
extends CrudDataSource<Model> {
|
||||||
final FirebaseFirestore _firestore;
|
|
||||||
|
|
||||||
final Map<String, Object?> Function(Model, SetOptions?) _toFirestore;
|
|
||||||
late CollectionReference<Model> _collectionReference;
|
|
||||||
|
|
||||||
CrudFirestoreDataSourceImpl(
|
CrudFirestoreDataSourceImpl(
|
||||||
String collection, {
|
String collection, {
|
||||||
@ -44,6 +40,10 @@ class CrudFirestoreDataSourceImpl<Model extends ObjectModel, Entity>
|
|||||||
toFirestore: toFirestore,
|
toFirestore: toFirestore,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
final FirebaseFirestore _firestore;
|
||||||
|
|
||||||
|
final Map<String, Object?> Function(Model, SetOptions?) _toFirestore;
|
||||||
|
late CollectionReference<Model> _collectionReference;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> create(Model object, {String? id}) {
|
Future<void> create(Model object, {String? id}) {
|
||||||
|
@ -23,11 +23,11 @@ import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
|||||||
|
|
||||||
class CrudRepositoryImpl<Model extends ObjectModel>
|
class CrudRepositoryImpl<Model extends ObjectModel>
|
||||||
extends CrudRepository<Model> {
|
extends CrudRepository<Model> {
|
||||||
final CrudDataSource<Model> _crudDataSource;
|
|
||||||
|
|
||||||
CrudRepositoryImpl({
|
CrudRepositoryImpl({
|
||||||
required CrudDataSource<Model> crudDataSource,
|
required CrudDataSource<Model> crudDataSource,
|
||||||
}) : _crudDataSource = crudDataSource;
|
}) : _crudDataSource = crudDataSource;
|
||||||
|
final CrudDataSource<Model> _crudDataSource;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<void> create(Model object, {String? id}) =>
|
FutureOrResult<void> create(Model object, {String? id}) =>
|
||||||
|
@ -25,22 +25,22 @@ abstract class QueryParser<Q> {
|
|||||||
abstract class QueryInterface extends Entity {}
|
abstract class QueryInterface extends Entity {}
|
||||||
|
|
||||||
class WhereQuery<Value> extends QueryInterface {
|
class WhereQuery<Value> extends QueryInterface {
|
||||||
|
|
||||||
|
WhereQuery(this.type, this.field, this.value);
|
||||||
final WhereQueryType type;
|
final WhereQueryType type;
|
||||||
final String field;
|
final String field;
|
||||||
final Value value;
|
final Value value;
|
||||||
|
|
||||||
WhereQuery(this.type, this.field, this.value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class LimitQuery extends QueryInterface {
|
class LimitQuery extends QueryInterface {
|
||||||
final int limit;
|
|
||||||
|
|
||||||
LimitQuery(this.limit);
|
LimitQuery(this.limit);
|
||||||
|
final int limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
class OrderByQuery extends QueryInterface {
|
class OrderByQuery extends QueryInterface {
|
||||||
final String field;
|
|
||||||
final bool ascending;
|
|
||||||
|
|
||||||
OrderByQuery(this.field, {this.ascending = true});
|
OrderByQuery(this.field, {this.ascending = true});
|
||||||
|
final String field;
|
||||||
|
final bool ascending;
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,9 @@ import 'package:wyatt_crud_bloc/src/domain/entities/object_model.dart';
|
|||||||
import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
||||||
|
|
||||||
class Delete<Model extends ObjectModel> extends AsyncUseCase<String, void> {
|
class Delete<Model extends ObjectModel> extends AsyncUseCase<String, void> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
Delete(this._crudRepository);
|
Delete(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(String? params) {
|
FutureOr<void> onStart(String? params) {
|
||||||
|
@ -19,9 +19,9 @@ import 'package:wyatt_crud_bloc/src/domain/entities/object_model.dart';
|
|||||||
import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
||||||
|
|
||||||
class DeleteAll<Model extends ObjectModel> extends AsyncUseCase<void, void> {
|
class DeleteAll<Model extends ObjectModel> extends AsyncUseCase<void, void> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
DeleteAll(this._crudRepository);
|
DeleteAll(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<void> execute(void params) => _crudRepository.deleteAll();
|
FutureOrResult<void> execute(void params) => _crudRepository.deleteAll();
|
||||||
|
@ -21,9 +21,9 @@ import 'package:wyatt_crud_bloc/src/domain/entities/object_model.dart';
|
|||||||
import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
||||||
|
|
||||||
class Get<Model extends ObjectModel> extends AsyncUseCase<String, Model?> {
|
class Get<Model extends ObjectModel> extends AsyncUseCase<String, Model?> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
Get(this._crudRepository);
|
Get(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(String? params) {
|
FutureOr<void> onStart(String? params) {
|
||||||
|
@ -20,9 +20,9 @@ import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
|||||||
|
|
||||||
class GetAll<Model extends ObjectModel>
|
class GetAll<Model extends ObjectModel>
|
||||||
extends AsyncUseCase<void, List<Model?>> {
|
extends AsyncUseCase<void, List<Model?>> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
GetAll(this._crudRepository);
|
GetAll(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOrResult<List<Model?>> execute(void params) => _crudRepository.getAll();
|
FutureOrResult<List<Model?>> execute(void params) => _crudRepository.getAll();
|
||||||
|
@ -23,9 +23,9 @@ import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
|||||||
|
|
||||||
class Query<Model extends ObjectModel>
|
class Query<Model extends ObjectModel>
|
||||||
extends AsyncUseCase<List<QueryInterface>, List<Model?>> {
|
extends AsyncUseCase<List<QueryInterface>, List<Model?>> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
Query(this._crudRepository);
|
Query(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(List<QueryInterface>? params) {
|
FutureOr<void> onStart(List<QueryInterface>? params) {
|
||||||
|
@ -23,9 +23,9 @@ import 'package:wyatt_crud_bloc/src/domain/usecases/params/update_parameters.dar
|
|||||||
|
|
||||||
class Update<Model extends ObjectModel>
|
class Update<Model extends ObjectModel>
|
||||||
extends AsyncUseCase<UpdateParameters<Model>, void> {
|
extends AsyncUseCase<UpdateParameters<Model>, void> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
Update(this._crudRepository);
|
Update(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(UpdateParameters<Model>? params) {
|
FutureOr<void> onStart(UpdateParameters<Model>? params) {
|
||||||
|
@ -22,9 +22,9 @@ import 'package:wyatt_crud_bloc/src/domain/repositories/crud_repository.dart';
|
|||||||
|
|
||||||
class UpdateAll<Model extends ObjectModel>
|
class UpdateAll<Model extends ObjectModel>
|
||||||
extends AsyncUseCase<Map<String, Object?>, void> {
|
extends AsyncUseCase<Map<String, Object?>, void> {
|
||||||
final CrudRepository<Model> _crudRepository;
|
|
||||||
|
|
||||||
UpdateAll(this._crudRepository);
|
UpdateAll(this._crudRepository);
|
||||||
|
final CrudRepository<Model> _crudRepository;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onStart(Map<String, Object?>? params) {
|
FutureOr<void> onStart(Map<String, Object?>? params) {
|
||||||
|
@ -35,6 +35,8 @@ import 'package:wyatt_crud_bloc/src/domain/usecases/update_all.dart';
|
|||||||
part 'crud_state.dart';
|
part 'crud_state.dart';
|
||||||
|
|
||||||
abstract class CrudCubit<Model extends ObjectModel> extends Cubit<CrudState> {
|
abstract class CrudCubit<Model extends ObjectModel> extends Cubit<CrudState> {
|
||||||
|
|
||||||
|
CrudCubit() : super(CrudInitial());
|
||||||
Create<Model>? get crudCreate;
|
Create<Model>? get crudCreate;
|
||||||
DeleteAll<Model>? get crudDeleteAll;
|
DeleteAll<Model>? get crudDeleteAll;
|
||||||
Delete<Model>? get crudDelete;
|
Delete<Model>? get crudDelete;
|
||||||
@ -44,8 +46,6 @@ abstract class CrudCubit<Model extends ObjectModel> extends Cubit<CrudState> {
|
|||||||
UpdateAll<Model>? get crudUpdateAll;
|
UpdateAll<Model>? get crudUpdateAll;
|
||||||
Update<Model>? get crudUpdate;
|
Update<Model>? get crudUpdate;
|
||||||
|
|
||||||
CrudCubit() : super(CrudInitial());
|
|
||||||
|
|
||||||
FutureOr<void> create(Model model) async {
|
FutureOr<void> create(Model model) async {
|
||||||
if (crudCreate != null) {
|
if (crudCreate != null) {
|
||||||
final stateCopy = state;
|
final stateCopy = state;
|
||||||
|
@ -36,27 +36,27 @@ class CrudOkReturn extends CrudState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CrudError extends CrudState {
|
class CrudError extends CrudState {
|
||||||
final String? message;
|
|
||||||
|
|
||||||
const CrudError(this.message);
|
const CrudError(this.message);
|
||||||
|
final String? message;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [message];
|
List<Object?> get props => [message];
|
||||||
}
|
}
|
||||||
|
|
||||||
class CrudLoaded<T> extends CrudSuccess {
|
class CrudLoaded<T> extends CrudSuccess {
|
||||||
final T? data;
|
|
||||||
|
|
||||||
const CrudLoaded(this.data);
|
const CrudLoaded(this.data);
|
||||||
|
final T? data;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [data];
|
List<Object?> get props => [data];
|
||||||
}
|
}
|
||||||
|
|
||||||
class CrudListLoaded<T> extends CrudSuccess {
|
class CrudListLoaded<T> extends CrudSuccess {
|
||||||
final List<T?> data;
|
|
||||||
|
|
||||||
const CrudListLoaded(this.data);
|
const CrudListLoaded(this.data);
|
||||||
|
final List<T?> data;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [data];
|
List<Object> get props => [data];
|
||||||
|
@ -26,15 +26,6 @@ import 'package:wyatt_form_bloc/src/domain/input_validators/form_input_validator
|
|||||||
|
|
||||||
// ignore: must_be_immutable
|
// ignore: must_be_immutable
|
||||||
class WyattFormImpl extends WyattForm {
|
class WyattFormImpl extends WyattForm {
|
||||||
final List<
|
|
||||||
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
|
|
||||||
dynamic>> _inputs;
|
|
||||||
final FormValidator _validator;
|
|
||||||
final String _name;
|
|
||||||
|
|
||||||
late List<
|
|
||||||
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
|
|
||||||
dynamic>> _inputsInitial;
|
|
||||||
|
|
||||||
WyattFormImpl(
|
WyattFormImpl(
|
||||||
this._inputs, {
|
this._inputs, {
|
||||||
@ -44,6 +35,15 @@ class WyattFormImpl extends WyattForm {
|
|||||||
_validator = validationStrategy {
|
_validator = validationStrategy {
|
||||||
_inputsInitial = _inputs.map((input) => input.clone()).toList();
|
_inputsInitial = _inputs.map((input) => input.clone()).toList();
|
||||||
}
|
}
|
||||||
|
final List<
|
||||||
|
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
|
||||||
|
dynamic>> _inputs;
|
||||||
|
final FormValidator _validator;
|
||||||
|
final String _name;
|
||||||
|
|
||||||
|
late List<
|
||||||
|
FormInput<dynamic, FormInputValidator<dynamic, ValidationError>,
|
||||||
|
dynamic>> _inputsInitial;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<
|
List<
|
||||||
|
@ -17,6 +17,12 @@
|
|||||||
part of 'form_data_cubit.dart';
|
part of 'form_data_cubit.dart';
|
||||||
|
|
||||||
abstract class FormDataState extends Equatable {
|
abstract class FormDataState extends Equatable {
|
||||||
|
|
||||||
|
const FormDataState({
|
||||||
|
required this.form,
|
||||||
|
this.status = FormStatus.pure,
|
||||||
|
this.errorMessage,
|
||||||
|
});
|
||||||
/// Global status of a form.
|
/// Global status of a form.
|
||||||
final FormStatus status;
|
final FormStatus status;
|
||||||
|
|
||||||
@ -26,12 +32,6 @@ abstract class FormDataState extends Equatable {
|
|||||||
/// Optional error message.
|
/// Optional error message.
|
||||||
final String? errorMessage;
|
final String? errorMessage;
|
||||||
|
|
||||||
const FormDataState({
|
|
||||||
required this.form,
|
|
||||||
this.status = FormStatus.pure,
|
|
||||||
this.errorMessage,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [status, form, errorMessage];
|
List<Object?> get props => [status, form, errorMessage];
|
||||||
}
|
}
|
||||||
|
@ -27,11 +27,11 @@ import 'package:wyatt_form_bloc/src/presentation/features/form_data/form_data_cu
|
|||||||
part 'form_data_state_impl.dart';
|
part 'form_data_state_impl.dart';
|
||||||
|
|
||||||
abstract class FormDataCubitImpl extends FormDataCubit<FormDataStateImpl> {
|
abstract class FormDataCubitImpl extends FormDataCubit<FormDataStateImpl> {
|
||||||
final FormRepository _formRepository;
|
|
||||||
final String _formName;
|
|
||||||
|
|
||||||
FormDataCubitImpl(this._formRepository, this._formName)
|
FormDataCubitImpl(this._formRepository, this._formName)
|
||||||
: super(FormDataStateImpl(form: _formRepository.accessForm(_formName)));
|
: super(FormDataStateImpl(form: _formRepository.accessForm(_formName)));
|
||||||
|
final FormRepository _formRepository;
|
||||||
|
final String _formName;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get formName => _formName;
|
String get formName => _formName;
|
||||||
|
@ -115,7 +115,7 @@ Future<void> server() async {
|
|||||||
final server = await HttpServer.bind(InternetAddress.anyIPv6, 8080);
|
final server = await HttpServer.bind(InternetAddress.anyIPv6, 8080);
|
||||||
var error = 0;
|
var error = 0;
|
||||||
var token = 0;
|
var token = 0;
|
||||||
await server.forEach((HttpRequest request) {
|
await server.forEach((request) {
|
||||||
print('[${request.method}] ${request.uri}');
|
print('[${request.method}] ${request.uri}');
|
||||||
switch (request.uri.path) {
|
switch (request.uri.path) {
|
||||||
case '/test/basic-test':
|
case '/test/basic-test':
|
||||||
@ -196,7 +196,7 @@ Future<void> server() async {
|
|||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
unawaited(server());
|
unawaited(server());
|
||||||
final base = 'localhost:8080';
|
const base = 'localhost:8080';
|
||||||
final uriPrefix = UriPrefixMiddleware(
|
final uriPrefix = UriPrefixMiddleware(
|
||||||
protocol: Protocols.http,
|
protocol: Protocols.http,
|
||||||
authority: base,
|
authority: base,
|
||||||
|
@ -31,19 +31,15 @@ enum EmailVerificationAction {
|
|||||||
resetPassword,
|
resetPassword,
|
||||||
changeEmail;
|
changeEmail;
|
||||||
|
|
||||||
String toSnakeCase() {
|
String toSnakeCase() => name.splitMapJoin(
|
||||||
return name.splitMapJoin(
|
|
||||||
RegExp('[A-Z]'),
|
RegExp('[A-Z]'),
|
||||||
onMatch: (m) => '_${m[0]?.toLowerCase()}',
|
onMatch: (m) => '_${m[0]?.toLowerCase()}',
|
||||||
onNonMatch: (n) => n,
|
onNonMatch: (n) => n,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
factory EmailVerificationAction.fromString(String str) {
|
factory EmailVerificationAction.fromString(String str) => EmailVerificationAction.values.firstWhere(
|
||||||
return EmailVerificationAction.values.firstWhere(
|
(element) => element.toSnakeCase() == str,
|
||||||
(EmailVerificationAction element) => element.toSnakeCase() == str,
|
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class VerifyCode {
|
class VerifyCode {
|
||||||
@ -60,29 +56,23 @@ class VerifyCode {
|
|||||||
String? email,
|
String? email,
|
||||||
String? verificationCode,
|
String? verificationCode,
|
||||||
EmailVerificationAction? action,
|
EmailVerificationAction? action,
|
||||||
}) {
|
}) => VerifyCode(
|
||||||
return VerifyCode(
|
|
||||||
email: email ?? this.email,
|
email: email ?? this.email,
|
||||||
verificationCode: verificationCode ?? this.verificationCode,
|
verificationCode: verificationCode ?? this.verificationCode,
|
||||||
action: action ?? this.action,
|
action: action ?? this.action,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() => <String, dynamic>{
|
||||||
return <String, dynamic>{
|
|
||||||
'email': email,
|
'email': email,
|
||||||
'verification_code': verificationCode,
|
'verification_code': verificationCode,
|
||||||
'action': action.toSnakeCase(),
|
'action': action.toSnakeCase(),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
factory VerifyCode.fromMap(Map<String, dynamic> map) {
|
factory VerifyCode.fromMap(Map<String, dynamic> map) => VerifyCode(
|
||||||
return VerifyCode(
|
|
||||||
email: map['email'] as String,
|
email: map['email'] as String,
|
||||||
verificationCode: map['verification_code'] as String,
|
verificationCode: map['verification_code'] as String,
|
||||||
action: EmailVerificationAction.fromString(map['action'] as String),
|
action: EmailVerificationAction.fromString(map['action'] as String),
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
String toJson() => json.encode(toMap());
|
String toJson() => json.encode(toMap());
|
||||||
|
|
||||||
@ -105,26 +95,20 @@ class Account {
|
|||||||
Account copyWith({
|
Account copyWith({
|
||||||
String? email,
|
String? email,
|
||||||
String? sessionId,
|
String? sessionId,
|
||||||
}) {
|
}) => Account(
|
||||||
return Account(
|
|
||||||
email: email ?? this.email,
|
email: email ?? this.email,
|
||||||
sessionId: sessionId ?? this.sessionId,
|
sessionId: sessionId ?? this.sessionId,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() => <String, dynamic>{
|
||||||
return <String, dynamic>{
|
|
||||||
'email': email,
|
'email': email,
|
||||||
'session_id': sessionId,
|
'session_id': sessionId,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
factory Account.fromMap(Map<String, dynamic> map) {
|
factory Account.fromMap(Map<String, dynamic> map) => Account(
|
||||||
return Account(
|
|
||||||
email: map['email'] as String,
|
email: map['email'] as String,
|
||||||
sessionId: map['session_id'] != null ? map['session_id'] as String : null,
|
sessionId: map['session_id'] != null ? map['session_id'] as String : null,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
String toJson() => json.encode(toMap());
|
String toJson() => json.encode(toMap());
|
||||||
|
|
||||||
@ -146,26 +130,20 @@ class SignUp {
|
|||||||
SignUp copyWith({
|
SignUp copyWith({
|
||||||
String? sessionId,
|
String? sessionId,
|
||||||
String? password,
|
String? password,
|
||||||
}) {
|
}) => SignUp(
|
||||||
return SignUp(
|
|
||||||
sessionId: sessionId ?? this.sessionId,
|
sessionId: sessionId ?? this.sessionId,
|
||||||
password: password ?? this.password,
|
password: password ?? this.password,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() => <String, dynamic>{
|
||||||
return <String, dynamic>{
|
|
||||||
'session_id': sessionId,
|
'session_id': sessionId,
|
||||||
'password': password,
|
'password': password,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
factory SignUp.fromMap(Map<String, dynamic> map) {
|
factory SignUp.fromMap(Map<String, dynamic> map) => SignUp(
|
||||||
return SignUp(
|
|
||||||
sessionId: map['session_id'] as String,
|
sessionId: map['session_id'] as String,
|
||||||
password: map['password'] as String,
|
password: map['password'] as String,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
String toJson() => json.encode(toMap());
|
String toJson() => json.encode(toMap());
|
||||||
|
|
||||||
@ -190,29 +168,23 @@ class TokenSuccess {
|
|||||||
String? accessToken,
|
String? accessToken,
|
||||||
String? refreshToken,
|
String? refreshToken,
|
||||||
Account? account,
|
Account? account,
|
||||||
}) {
|
}) => TokenSuccess(
|
||||||
return TokenSuccess(
|
|
||||||
accessToken: accessToken ?? this.accessToken,
|
accessToken: accessToken ?? this.accessToken,
|
||||||
refreshToken: refreshToken ?? this.refreshToken,
|
refreshToken: refreshToken ?? this.refreshToken,
|
||||||
account: account ?? this.account,
|
account: account ?? this.account,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() => <String, dynamic>{
|
||||||
return <String, dynamic>{
|
|
||||||
'access_token': accessToken,
|
'access_token': accessToken,
|
||||||
'refresh_token': refreshToken,
|
'refresh_token': refreshToken,
|
||||||
'account': account.toMap(),
|
'account': account.toMap(),
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
factory TokenSuccess.fromMap(Map<String, dynamic> map) {
|
factory TokenSuccess.fromMap(Map<String, dynamic> map) => TokenSuccess(
|
||||||
return TokenSuccess(
|
|
||||||
accessToken: map['access_token'] as String,
|
accessToken: map['access_token'] as String,
|
||||||
refreshToken: map['refresh_token'] as String,
|
refreshToken: map['refresh_token'] as String,
|
||||||
account: Account.fromMap(map['account'] as Map<String, dynamic>),
|
account: Account.fromMap(map['account'] as Map<String, dynamic>),
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
String toJson() => json.encode(toMap());
|
String toJson() => json.encode(toMap());
|
||||||
|
|
||||||
@ -235,26 +207,20 @@ class Login {
|
|||||||
Login copyWith({
|
Login copyWith({
|
||||||
String? email,
|
String? email,
|
||||||
String? password,
|
String? password,
|
||||||
}) {
|
}) => Login(
|
||||||
return Login(
|
|
||||||
email: email ?? this.email,
|
email: email ?? this.email,
|
||||||
password: password ?? this.password,
|
password: password ?? this.password,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() => <String, dynamic>{
|
||||||
return <String, dynamic>{
|
|
||||||
'email': email,
|
'email': email,
|
||||||
'password': password,
|
'password': password,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
factory Login.fromMap(Map<String, dynamic> map) {
|
factory Login.fromMap(Map<String, dynamic> map) => Login(
|
||||||
return Login(
|
|
||||||
email: map['email'] as String,
|
email: map['email'] as String,
|
||||||
password: map['password'] as String,
|
password: map['password'] as String,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
String toJson() => json.encode(toMap());
|
String toJson() => json.encode(toMap());
|
||||||
|
|
||||||
|
@ -25,8 +25,6 @@ import 'package:wyatt_http_client/src/pipeline.dart';
|
|||||||
import 'package:wyatt_http_client/src/utils/http_methods.dart';
|
import 'package:wyatt_http_client/src/utils/http_methods.dart';
|
||||||
|
|
||||||
class MiddlewareClient extends BaseClient {
|
class MiddlewareClient extends BaseClient {
|
||||||
final Client inner;
|
|
||||||
final Pipeline pipeline;
|
|
||||||
|
|
||||||
MiddlewareClient({
|
MiddlewareClient({
|
||||||
Pipeline? pipeline,
|
Pipeline? pipeline,
|
||||||
@ -35,6 +33,8 @@ class MiddlewareClient extends BaseClient {
|
|||||||
inner = inner ?? Client() {
|
inner = inner ?? Client() {
|
||||||
print('Using Pipeline:\n$pipeline');
|
print('Using Pipeline:\n$pipeline');
|
||||||
}
|
}
|
||||||
|
final Client inner;
|
||||||
|
final Pipeline pipeline;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Response> head(Uri url, {Map<String, String>? headers}) =>
|
Future<Response> head(Uri url, {Map<String, String>? headers}) =>
|
||||||
@ -81,9 +81,7 @@ class MiddlewareClient extends BaseClient {
|
|||||||
_sendUnstreamed(HttpMethods.delete.method, url, headers, body, encoding);
|
_sendUnstreamed(HttpMethods.delete.method, url, headers, body, encoding);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<StreamedResponse> send(BaseRequest request) {
|
Future<StreamedResponse> send(BaseRequest request) => inner.send(request);
|
||||||
return inner.send(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Response> _sendUnstreamed(
|
Future<Response> _sendUnstreamed(
|
||||||
String method,
|
String method,
|
||||||
|
@ -23,15 +23,15 @@ import 'package:wyatt_http_client/src/utils/authentication_methods.dart';
|
|||||||
import 'package:wyatt_http_client/src/utils/header_keys.dart';
|
import 'package:wyatt_http_client/src/utils/header_keys.dart';
|
||||||
|
|
||||||
class BasicAuthMiddleware with OnRequestMiddleware implements Middleware {
|
class BasicAuthMiddleware with OnRequestMiddleware implements Middleware {
|
||||||
String? username;
|
|
||||||
String? password;
|
|
||||||
final String authenticationHeader;
|
|
||||||
|
|
||||||
BasicAuthMiddleware({
|
BasicAuthMiddleware({
|
||||||
this.username,
|
this.username,
|
||||||
this.password,
|
this.password,
|
||||||
this.authenticationHeader = HeaderKeys.authorization,
|
this.authenticationHeader = HeaderKeys.authorization,
|
||||||
});
|
});
|
||||||
|
String? username;
|
||||||
|
String? password;
|
||||||
|
final String authenticationHeader;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getName() => 'BasicAuth';
|
String getName() => 'BasicAuth';
|
||||||
|
@ -25,12 +25,6 @@ import 'package:wyatt_http_client/src/utils/http_status.dart';
|
|||||||
class DigestAuthMiddleware
|
class DigestAuthMiddleware
|
||||||
with OnRequestMiddleware, OnResponseMiddleware
|
with OnRequestMiddleware, OnResponseMiddleware
|
||||||
implements Middleware {
|
implements Middleware {
|
||||||
final String username;
|
|
||||||
final String password;
|
|
||||||
final DigestAuth _digestAuth;
|
|
||||||
final String authenticationHeader;
|
|
||||||
final String wwwAuthenticateHeader;
|
|
||||||
final HttpStatus unauthorized;
|
|
||||||
|
|
||||||
DigestAuthMiddleware({
|
DigestAuthMiddleware({
|
||||||
required this.username,
|
required this.username,
|
||||||
@ -39,6 +33,12 @@ class DigestAuthMiddleware
|
|||||||
this.wwwAuthenticateHeader = HeaderKeys.wwwAuthenticate,
|
this.wwwAuthenticateHeader = HeaderKeys.wwwAuthenticate,
|
||||||
this.unauthorized = HttpStatus.unauthorized,
|
this.unauthorized = HttpStatus.unauthorized,
|
||||||
}) : _digestAuth = DigestAuth(username, password);
|
}) : _digestAuth = DigestAuth(username, password);
|
||||||
|
final String username;
|
||||||
|
final String password;
|
||||||
|
final DigestAuth _digestAuth;
|
||||||
|
final String authenticationHeader;
|
||||||
|
final String wwwAuthenticateHeader;
|
||||||
|
final HttpStatus unauthorized;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getName() => 'DigestAuth';
|
String getName() => 'DigestAuth';
|
||||||
|
@ -31,6 +31,17 @@ typedef TokenParser = String Function(Map<String, dynamic>);
|
|||||||
class RefreshTokenAuthMiddleware
|
class RefreshTokenAuthMiddleware
|
||||||
with OnRequestMiddleware, OnResponseMiddleware
|
with OnRequestMiddleware, OnResponseMiddleware
|
||||||
implements Middleware {
|
implements Middleware {
|
||||||
|
|
||||||
|
RefreshTokenAuthMiddleware({
|
||||||
|
required this.authorizationEndpoint,
|
||||||
|
required this.tokenEndpoint,
|
||||||
|
required this.accessTokenParser,
|
||||||
|
required this.refreshTokenParser,
|
||||||
|
this.authenticationHeader = HeaderKeys.authorization,
|
||||||
|
this.authenticationMethod = AuthenticationMethods.bearer,
|
||||||
|
this.unauthorized = HttpStatus.unauthorized,
|
||||||
|
this.maxAttempts = 8,
|
||||||
|
});
|
||||||
final String authorizationEndpoint;
|
final String authorizationEndpoint;
|
||||||
final String tokenEndpoint;
|
final String tokenEndpoint;
|
||||||
|
|
||||||
@ -44,17 +55,6 @@ class RefreshTokenAuthMiddleware
|
|||||||
final HttpStatus unauthorized;
|
final HttpStatus unauthorized;
|
||||||
final int maxAttempts;
|
final int maxAttempts;
|
||||||
|
|
||||||
RefreshTokenAuthMiddleware({
|
|
||||||
required this.authorizationEndpoint,
|
|
||||||
required this.tokenEndpoint,
|
|
||||||
required this.accessTokenParser,
|
|
||||||
required this.refreshTokenParser,
|
|
||||||
this.authenticationHeader = HeaderKeys.authorization,
|
|
||||||
this.authenticationMethod = AuthenticationMethods.bearer,
|
|
||||||
this.unauthorized = HttpStatus.unauthorized,
|
|
||||||
this.maxAttempts = 8,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getName() => 'RefreshToken';
|
String getName() => 'RefreshToken';
|
||||||
|
|
||||||
|
@ -20,11 +20,6 @@ import 'package:wyatt_http_client/src/models/middleware_request.dart';
|
|||||||
import 'package:wyatt_http_client/src/utils/convert.dart';
|
import 'package:wyatt_http_client/src/utils/convert.dart';
|
||||||
|
|
||||||
class UnsafeAuthMiddleware with OnRequestMiddleware implements Middleware {
|
class UnsafeAuthMiddleware with OnRequestMiddleware implements Middleware {
|
||||||
String? username;
|
|
||||||
String? password;
|
|
||||||
|
|
||||||
final String usernameField;
|
|
||||||
final String passwordField;
|
|
||||||
|
|
||||||
UnsafeAuthMiddleware({
|
UnsafeAuthMiddleware({
|
||||||
this.username,
|
this.username,
|
||||||
@ -32,6 +27,11 @@ class UnsafeAuthMiddleware with OnRequestMiddleware implements Middleware {
|
|||||||
this.usernameField = 'username',
|
this.usernameField = 'username',
|
||||||
this.passwordField = 'password',
|
this.passwordField = 'password',
|
||||||
});
|
});
|
||||||
|
String? username;
|
||||||
|
String? password;
|
||||||
|
|
||||||
|
final String usernameField;
|
||||||
|
final String passwordField;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getName() => 'UnsafeAuth';
|
String getName() => 'UnsafeAuth';
|
||||||
|
@ -20,13 +20,13 @@ import 'package:wyatt_http_client/src/models/middleware_request.dart';
|
|||||||
import 'package:wyatt_http_client/src/utils/protocols.dart';
|
import 'package:wyatt_http_client/src/utils/protocols.dart';
|
||||||
|
|
||||||
class UriPrefixMiddleware with OnRequestMiddleware implements Middleware {
|
class UriPrefixMiddleware with OnRequestMiddleware implements Middleware {
|
||||||
final Protocols protocol;
|
|
||||||
final String? authority;
|
|
||||||
|
|
||||||
UriPrefixMiddleware({
|
UriPrefixMiddleware({
|
||||||
required this.protocol,
|
required this.protocol,
|
||||||
required this.authority,
|
required this.authority,
|
||||||
});
|
});
|
||||||
|
final Protocols protocol;
|
||||||
|
final String? authority;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getName() => 'UriPrefix';
|
String getName() => 'UriPrefix';
|
||||||
|
@ -44,8 +44,7 @@ class MiddlewareContext {
|
|||||||
MiddlewareRequest? lastRequest,
|
MiddlewareRequest? lastRequest,
|
||||||
MiddlewareResponse? originalResponse,
|
MiddlewareResponse? originalResponse,
|
||||||
MiddlewareResponse? lastResponse,
|
MiddlewareResponse? lastResponse,
|
||||||
}) {
|
}) => MiddlewareContext(
|
||||||
return MiddlewareContext(
|
|
||||||
pipeline: pipeline ?? this.pipeline,
|
pipeline: pipeline ?? this.pipeline,
|
||||||
client: client ?? this.client,
|
client: client ?? this.client,
|
||||||
originalRequest: originalRequest ?? this.originalRequest,
|
originalRequest: originalRequest ?? this.originalRequest,
|
||||||
@ -53,10 +52,7 @@ class MiddlewareContext {
|
|||||||
originalResponse: originalResponse ?? this.originalResponse,
|
originalResponse: originalResponse ?? this.originalResponse,
|
||||||
lastResponse: lastResponse ?? this.lastResponse,
|
lastResponse: lastResponse ?? this.lastResponse,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() => 'MiddlewareContext(pipeline: $pipeline, client: $client, originalRequest: $originalRequest, lastRequest: $lastRequest, originalResponse: $originalResponse, lastResponse: $lastResponse)';
|
||||||
return 'MiddlewareContext(pipeline: $pipeline, client: $client, originalRequest: $originalRequest, lastRequest: $lastRequest, originalResponse: $originalResponse, lastResponse: $lastResponse)';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -42,22 +42,21 @@ class MiddlewareRequest {
|
|||||||
|
|
||||||
MiddlewareRequest copyWith({
|
MiddlewareRequest copyWith({
|
||||||
UnfreezedRequest? unfreezedRequest,
|
UnfreezedRequest? unfreezedRequest,
|
||||||
}) {
|
}) =>
|
||||||
return MiddlewareRequest(
|
MiddlewareRequest(
|
||||||
unfreezedRequest: unfreezedRequest ?? this.unfreezedRequest,
|
unfreezedRequest: unfreezedRequest ?? this.unfreezedRequest,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
void modifyRequest(UnfreezedRequest unfreezedRequest) {
|
void modifyRequest(UnfreezedRequest unfreezedRequest) {
|
||||||
String? _body;
|
String? body;
|
||||||
if (unfreezedRequest.body != null) {
|
if (unfreezedRequest.body != null) {
|
||||||
final body = unfreezedRequest.body;
|
var body = unfreezedRequest.body;
|
||||||
if (body is String) {
|
if (body is String) {
|
||||||
_body = body;
|
body = body;
|
||||||
} else if (body is List) {
|
} else if (body is List) {
|
||||||
_body = String.fromCharCodes(body.cast<int>());
|
body = String.fromCharCodes(body.cast<int>());
|
||||||
} else if (body is Map) {
|
} else if (body is Map) {
|
||||||
_body = Convert.mapToQuery(body.cast<String, String>());
|
body = Convert.mapToQuery(body.cast<String, String>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_httpRequest = RequestUtils.copyRequestWith(
|
_httpRequest = RequestUtils.copyRequestWith(
|
||||||
@ -65,7 +64,7 @@ class MiddlewareRequest {
|
|||||||
method: unfreezedRequest.method,
|
method: unfreezedRequest.method,
|
||||||
url: unfreezedRequest.url,
|
url: unfreezedRequest.url,
|
||||||
headers: unfreezedRequest.headers,
|
headers: unfreezedRequest.headers,
|
||||||
body: _body,
|
body: body,
|
||||||
) as Request;
|
) as Request;
|
||||||
if (unfreezedRequest.encoding != null) {
|
if (unfreezedRequest.encoding != null) {
|
||||||
_httpRequest.encoding = unfreezedRequest.encoding!;
|
_httpRequest.encoding = unfreezedRequest.encoding!;
|
||||||
|
@ -40,11 +40,9 @@ class MiddlewareResponse {
|
|||||||
|
|
||||||
MiddlewareResponse copyWith({
|
MiddlewareResponse copyWith({
|
||||||
BaseResponse? httpResponse,
|
BaseResponse? httpResponse,
|
||||||
}) {
|
}) => MiddlewareResponse(
|
||||||
return MiddlewareResponse(
|
|
||||||
httpResponse: httpResponse ?? this.httpResponse,
|
httpResponse: httpResponse ?? this.httpResponse,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() =>
|
String toString() =>
|
||||||
|
@ -17,11 +17,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
class UnfreezedRequest {
|
class UnfreezedRequest {
|
||||||
final String method;
|
|
||||||
final Uri url;
|
|
||||||
final Map<String, String>? headers;
|
|
||||||
final Object? body;
|
|
||||||
final Encoding? encoding;
|
|
||||||
|
|
||||||
UnfreezedRequest({
|
UnfreezedRequest({
|
||||||
required this.method,
|
required this.method,
|
||||||
@ -30,6 +25,11 @@ class UnfreezedRequest {
|
|||||||
this.body,
|
this.body,
|
||||||
this.encoding,
|
this.encoding,
|
||||||
});
|
});
|
||||||
|
final String method;
|
||||||
|
final Uri url;
|
||||||
|
final Map<String, String>? headers;
|
||||||
|
final Object? body;
|
||||||
|
final Encoding? encoding;
|
||||||
|
|
||||||
UnfreezedRequest copyWith({
|
UnfreezedRequest copyWith({
|
||||||
String? method,
|
String? method,
|
||||||
@ -37,19 +37,15 @@ class UnfreezedRequest {
|
|||||||
Map<String, String>? headers,
|
Map<String, String>? headers,
|
||||||
Object? body,
|
Object? body,
|
||||||
Encoding? encoding,
|
Encoding? encoding,
|
||||||
}) {
|
}) => UnfreezedRequest(
|
||||||
return UnfreezedRequest(
|
|
||||||
method: method ?? this.method,
|
method: method ?? this.method,
|
||||||
url: url ?? this.url,
|
url: url ?? this.url,
|
||||||
headers: headers ?? this.headers,
|
headers: headers ?? this.headers,
|
||||||
body: body ?? this.body,
|
body: body ?? this.body,
|
||||||
encoding: encoding ?? this.encoding,
|
encoding: encoding ?? this.encoding,
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() => 'UnfreezedRequest(method: $method, url: $url, headers: '
|
||||||
return 'UnfreezedRequest(method: $method, url: $url, headers: '
|
|
||||||
'$headers, body: $body, encoding: $encoding)';
|
'$headers, body: $body, encoding: $encoding)';
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,13 @@ import 'package:wyatt_http_client/src/models/middleware_request.dart';
|
|||||||
import 'package:wyatt_http_client/src/models/middleware_response.dart';
|
import 'package:wyatt_http_client/src/models/middleware_response.dart';
|
||||||
|
|
||||||
class Pipeline {
|
class Pipeline {
|
||||||
final List<Middleware> _middlewares;
|
|
||||||
|
|
||||||
int get length => _middlewares.length;
|
|
||||||
|
|
||||||
Pipeline() : _middlewares = <Middleware>[];
|
Pipeline() : _middlewares = <Middleware>[];
|
||||||
Pipeline.fromIterable(Iterable<Middleware> middlewares)
|
Pipeline.fromIterable(Iterable<Middleware> middlewares)
|
||||||
: _middlewares = middlewares.toList();
|
: _middlewares = middlewares.toList();
|
||||||
|
final List<Middleware> _middlewares;
|
||||||
|
|
||||||
|
int get length => _middlewares.length;
|
||||||
|
|
||||||
/// Add a [Middleware] to this [Pipeline]
|
/// Add a [Middleware] to this [Pipeline]
|
||||||
Pipeline addMiddleware(Middleware middleware) {
|
Pipeline addMiddleware(Middleware middleware) {
|
||||||
|
@ -21,7 +21,7 @@ class Convert {
|
|||||||
final buffer = StringBuffer();
|
final buffer = StringBuffer();
|
||||||
for (final int part in bytes) {
|
for (final int part in bytes) {
|
||||||
if (part & 0xff != part) {
|
if (part & 0xff != part) {
|
||||||
throw FormatException('Non-byte integer detected');
|
throw const FormatException('Non-byte integer detected');
|
||||||
}
|
}
|
||||||
buffer.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
|
buffer.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,8 @@ import 'package:crypto/crypto.dart';
|
|||||||
class Crypto {
|
class Crypto {
|
||||||
/// Hash a string using MD5
|
/// Hash a string using MD5
|
||||||
static String md5Hash(String data) {
|
static String md5Hash(String data) {
|
||||||
final content = Utf8Encoder().convert(data);
|
final content = const Utf8Encoder().convert(data);
|
||||||
final md5Crypto = md5;
|
const md5Crypto = md5;
|
||||||
final digest = md5Crypto.convert(content).toString();
|
final digest = md5Crypto.convert(content).toString();
|
||||||
return digest;
|
return digest;
|
||||||
}
|
}
|
||||||
|
@ -24,9 +24,9 @@ abstract class Delay {
|
|||||||
return Duration.zero;
|
return Duration.zero;
|
||||||
}
|
}
|
||||||
final rand = Random();
|
final rand = Random();
|
||||||
final Duration delayFactor = const Duration(milliseconds: 200);
|
const Duration delayFactor = Duration(milliseconds: 200);
|
||||||
final double randomizationFactor = 0.25;
|
const double randomizationFactor = 0.25;
|
||||||
final Duration maxDelay = const Duration(seconds: 30);
|
const Duration maxDelay = Duration(seconds: 30);
|
||||||
|
|
||||||
final rf = randomizationFactor * (rand.nextDouble() * 2 - 1) + 1;
|
final rf = randomizationFactor * (rand.nextDouble() * 2 - 1) + 1;
|
||||||
final exp = min(attempt, 31); // prevent overflows.
|
final exp = min(attempt, 31); // prevent overflows.
|
||||||
|
@ -19,7 +19,9 @@ import 'dart:math';
|
|||||||
import 'package:wyatt_http_client/src/utils/convert.dart';
|
import 'package:wyatt_http_client/src/utils/convert.dart';
|
||||||
import 'package:wyatt_http_client/src/utils/crypto.dart';
|
import 'package:wyatt_http_client/src/utils/crypto.dart';
|
||||||
|
|
||||||
class DigestAuth {
|
class DigestAuth { // request counter
|
||||||
|
|
||||||
|
DigestAuth(this.username, this.password);
|
||||||
String username;
|
String username;
|
||||||
String password;
|
String password;
|
||||||
|
|
||||||
@ -30,9 +32,7 @@ class DigestAuth {
|
|||||||
String? _nonce;
|
String? _nonce;
|
||||||
String? _opaque;
|
String? _opaque;
|
||||||
|
|
||||||
int _nc = 0; // request counter
|
int _nc = 0;
|
||||||
|
|
||||||
DigestAuth(this.username, this.password);
|
|
||||||
|
|
||||||
/// Splits WWW-Authenticate header into a map.
|
/// Splits WWW-Authenticate header into a map.
|
||||||
Map<String, String>? splitWWWAuthenticateHeader(String header) {
|
Map<String, String>? splitWWWAuthenticateHeader(String header) {
|
||||||
@ -61,9 +61,7 @@ class DigestAuth {
|
|||||||
return Convert.toHex(values);
|
return Convert.toHex(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _formatNonceCount(int nc) {
|
String _formatNonceCount(int nc) => nc.toRadixString(16).padLeft(8, '0');
|
||||||
return nc.toRadixString(16).padLeft(8, '0');
|
|
||||||
}
|
|
||||||
|
|
||||||
String _computeHA1(
|
String _computeHA1(
|
||||||
String realm,
|
String realm,
|
||||||
@ -148,7 +146,7 @@ class DigestAuth {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String getAuthString(String method, Uri url) {
|
String getAuthString(String method, Uri url) {
|
||||||
final _cnonce = _computeNonce();
|
final cnonce = _computeNonce();
|
||||||
_nc += 1;
|
_nc += 1;
|
||||||
// if url has query parameters, append query to path
|
// if url has query parameters, append query to path
|
||||||
final path = url.hasQuery ? '${url.path}?${url.query}' : url.path;
|
final path = url.hasQuery ? '${url.path}?${url.query}' : url.path;
|
||||||
@ -162,7 +160,7 @@ class DigestAuth {
|
|||||||
_qop,
|
_qop,
|
||||||
_opaque,
|
_opaque,
|
||||||
_realm!,
|
_realm!,
|
||||||
_cnonce,
|
cnonce,
|
||||||
_nonce,
|
_nonce,
|
||||||
_nc,
|
_nc,
|
||||||
username,
|
username,
|
||||||
@ -192,7 +190,5 @@ class DigestAuth {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isReady() {
|
bool isReady() => _nonce != null && (_nc == 0 || _qop != null);
|
||||||
return _nonce != null && (_nc == 0 || _qop != null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -95,29 +95,17 @@ enum HttpStatus {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isInfo() {
|
bool isInfo() => statusCode >= 100 && statusCode < 200;
|
||||||
return statusCode >= 100 && statusCode < 200;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isSuccess() {
|
bool isSuccess() => statusCode >= 200 && statusCode < 300;
|
||||||
return statusCode >= 200 && statusCode < 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isRedirection() {
|
bool isRedirection() => statusCode >= 300 && statusCode < 400;
|
||||||
return statusCode >= 300 && statusCode < 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isClientError() {
|
bool isClientError() => statusCode >= 400 && statusCode < 500;
|
||||||
return statusCode >= 400 && statusCode < 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isServerError() {
|
bool isServerError() => statusCode >= 500 && statusCode < 600;
|
||||||
return statusCode >= 500 && statusCode < 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
factory HttpStatus.from(int status) {
|
factory HttpStatus.from(int status) => HttpStatus.values
|
||||||
return HttpStatus.values
|
|
||||||
.firstWhere((element) => element.statusCode == status);
|
.firstWhere((element) => element.statusCode == status);
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
class AppError {
|
class AppError {
|
||||||
final String message;
|
|
||||||
|
|
||||||
const AppError(this.message);
|
const AppError(this.message);
|
||||||
|
final String message;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
// ignore: no_runtimetype_tostring
|
// ignore: no_runtimetype_tostring
|
||||||
|
@ -28,8 +28,8 @@ mixin _Left<LeftType, RightType> on _EitherBase<LeftType, RightType> {}
|
|||||||
mixin _Right<LeftType, RightType> on _EitherBase<LeftType, RightType> {}
|
mixin _Right<LeftType, RightType> on _EitherBase<LeftType, RightType> {}
|
||||||
|
|
||||||
class _EitherBaseException implements Exception {
|
class _EitherBaseException implements Exception {
|
||||||
final String message;
|
|
||||||
const _EitherBaseException(this.message);
|
const _EitherBaseException(this.message);
|
||||||
|
final String message;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => '_EitherException: $message';
|
String toString() => '_EitherException: $message';
|
||||||
|
@ -172,10 +172,10 @@ abstract class Option<T> extends _EitherBase<T, void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Value<T> extends Option<T> with _Left<T, void> {
|
class Value<T> extends Option<T> with _Left<T, void> {
|
||||||
final T value;
|
|
||||||
|
|
||||||
/// {@macro ok}
|
/// {@macro ok}
|
||||||
const Value(this.value) : super._();
|
const Value(this.value) : super._();
|
||||||
|
final T value;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_EitherBase<U, void> _and<U>(_EitherBase<U, void> res) => res as Option<U>;
|
_EitherBase<U, void> _and<U>(_EitherBase<U, void> res) => res as Option<U>;
|
||||||
|
@ -203,10 +203,10 @@ abstract class Result<T, E> extends _EitherBase<T, E> {
|
|||||||
/// {@macro result}
|
/// {@macro result}
|
||||||
/// {@endtemplate}
|
/// {@endtemplate}
|
||||||
class Ok<T, E> extends Result<T, E> with _Left<T, E> {
|
class Ok<T, E> extends Result<T, E> with _Left<T, E> {
|
||||||
final T value;
|
|
||||||
|
|
||||||
/// {@macro ok}
|
/// {@macro ok}
|
||||||
const Ok(this.value) : super._();
|
const Ok(this.value) : super._();
|
||||||
|
final T value;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnL(value);
|
U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnL(value);
|
||||||
@ -268,10 +268,10 @@ class Ok<T, E> extends Result<T, E> with _Left<T, E> {
|
|||||||
/// {@macro result}
|
/// {@macro result}
|
||||||
/// {@endtemplate}
|
/// {@endtemplate}
|
||||||
class Err<T, E> extends Result<T, E> with _Right<T, E> {
|
class Err<T, E> extends Result<T, E> with _Right<T, E> {
|
||||||
final E error;
|
|
||||||
|
|
||||||
/// {@macro err}
|
/// {@macro err}
|
||||||
const Err(this.error) : super._();
|
const Err(this.error) : super._();
|
||||||
|
final E error;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnR(error);
|
U _fold<U>(U Function(T left) fnL, U Function(E right) fnR) => fnR(error);
|
||||||
|
@ -22,11 +22,11 @@ extension PairExtension<T> on Pair<T, T> {
|
|||||||
/// [Pair] is a simple object which contains pair of two values.
|
/// [Pair] is a simple object which contains pair of two values.
|
||||||
/// {@endtemplate}
|
/// {@endtemplate}
|
||||||
class Pair<L, R> {
|
class Pair<L, R> {
|
||||||
final L? left;
|
|
||||||
final R? right;
|
|
||||||
|
|
||||||
/// {@macro pair}
|
/// {@macro pair}
|
||||||
const Pair(this.left, this.right);
|
const Pair(this.left, this.right);
|
||||||
|
final L? left;
|
||||||
|
final R? right;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => '($left, $right)';
|
String toString() => '($left, $right)';
|
||||||
|
@ -19,13 +19,13 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
|||||||
import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart';
|
import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart';
|
||||||
|
|
||||||
class AppBarLayout extends Layout {
|
class AppBarLayout extends Layout {
|
||||||
final String title;
|
|
||||||
final Widget body;
|
|
||||||
const AppBarLayout({
|
const AppBarLayout({
|
||||||
required this.title,
|
required this.title,
|
||||||
required this.body,
|
required this.body,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
final String title;
|
||||||
|
final Widget body;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Scaffold(
|
Widget build(BuildContext context) => Scaffold(
|
||||||
|
@ -3,14 +3,14 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
|||||||
import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart';
|
import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart';
|
||||||
|
|
||||||
class BottomNavigationBarLayout extends Layout {
|
class BottomNavigationBarLayout extends Layout {
|
||||||
final Widget body;
|
|
||||||
final int currentIndex;
|
|
||||||
|
|
||||||
const BottomNavigationBarLayout({
|
const BottomNavigationBarLayout({
|
||||||
required this.currentIndex,
|
required this.currentIndex,
|
||||||
required this.body,
|
required this.body,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
final Widget body;
|
||||||
|
final int currentIndex;
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Scaffold(
|
Widget build(BuildContext context) => Scaffold(
|
||||||
body: body,
|
body: body,
|
||||||
|
@ -19,9 +19,6 @@ import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
|
|||||||
import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart';
|
import 'package:wyatt_ui_layout/src/presentation/layouts/layout.dart';
|
||||||
|
|
||||||
class FrameLayout extends Layout {
|
class FrameLayout extends Layout {
|
||||||
final String title;
|
|
||||||
final Widget body;
|
|
||||||
final int currentIndex;
|
|
||||||
|
|
||||||
const FrameLayout({
|
const FrameLayout({
|
||||||
required this.title,
|
required this.title,
|
||||||
@ -29,6 +26,9 @@ class FrameLayout extends Layout {
|
|||||||
required this.currentIndex,
|
required this.currentIndex,
|
||||||
super.key,
|
super.key,
|
||||||
});
|
});
|
||||||
|
final String title;
|
||||||
|
final Widget body;
|
||||||
|
final int currentIndex;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) => Scaffold(
|
Widget build(BuildContext context) => Scaffold(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user