Compare commits
7 Commits
742bf1d614
...
80ce7aff91
Author | SHA1 | Date | |
---|---|---|---|
![]() |
80ce7aff91 | ||
![]() |
a9121b6862 | ||
![]() |
54f92e8042 | ||
![]() |
00393a6ba7 | ||
![]() |
136e0e8c98 | ||
![]() |
500a6ae51d | ||
![]() |
79fdde25fc |
@ -31,10 +31,10 @@ The Wyatt Architecture for Flutter.
|
||||
|
||||
## Features
|
||||
|
||||
* Usecase
|
||||
* Repository
|
||||
* DataSource
|
||||
* Entity
|
||||
- Usecase
|
||||
- Repository
|
||||
- DataSource
|
||||
- Entity
|
||||
|
||||
## Usage
|
||||
|
||||
@ -75,16 +75,17 @@ abstract class PhotoRepository extends BaseRepository {
|
||||
|
||||
> Here the repository is just a proxy of the data sources with result type (to have beautiful error handling).
|
||||
|
||||
And finaly create your different usecases by using `UseCase<Parameters, ReturnType>` :
|
||||
And finaly create your different usecases :
|
||||
|
||||
Several use cases are supported :
|
||||
|
||||
- Classic usecase :
|
||||
|
||||
```dart
|
||||
class RetrieveAllPhoto extends UseCase<QueryParameters, List<Photo>> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
RetrieveAllPhotos(this._photoRepository);
|
||||
class Test extends AsyncUseCase<QueryParameters, List<Photo>>> {
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> call(QueryParameters params) {
|
||||
FuturOrResult<List<Photo>>> call(QueryParameters? params) {
|
||||
final photos = _photoRepository.getAllPhotos(
|
||||
start: params.start,
|
||||
limit: params.limit,
|
||||
@ -94,6 +95,54 @@ class RetrieveAllPhoto extends UseCase<QueryParameters, List<Photo>> {
|
||||
}
|
||||
```
|
||||
|
||||
You can add alternatve scenarios and check pre/post conditions using our extensions :
|
||||
|
||||
```dart
|
||||
class SearchPhotos extends AsyncUseCase<QueryParameters, List<Photo>>> {
|
||||
|
||||
@override
|
||||
FutureOrResult<List<Photo>>> call(QueryParameters? params) {
|
||||
final photos = _photoRepository.getAllPhotos(
|
||||
start: params.start,
|
||||
limit: params.limit,
|
||||
);
|
||||
return photos;
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(QueryParameters? params) {
|
||||
if(params.start == null || params.limit == null){
|
||||
throw ClientException('Préconndition non valides');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
You can implement error scenarios overriding `onError`, or check postconditions by overriding `onComplete` .
|
||||
|
||||
- Stream usecase :
|
||||
|
||||
```dart
|
||||
class SearchPhotos extends StreamUseCase<QueryParameters, List<Photo>>> {
|
||||
|
||||
@override
|
||||
FutureOrResult<Stream<List<Photo>>>> call(QueryParameters? params) {
|
||||
final photos = _photoRepository.getAllPhotos(
|
||||
start: params.start,
|
||||
limit: params.limit,
|
||||
);
|
||||
return photos;
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
On this case, observers allow you to add alternative scénarios when data changed, overriding `onData` or `onDone`.
|
||||
|
||||
Please note that to use handlers, call `execute` methodes instead of `call`.
|
||||
|
||||
> In fact, here we need a new parameter object, so let's create it:
|
||||
|
||||
```dart
|
||||
|
@ -35,46 +35,47 @@ class PhotoRepositoryImpl extends PhotoRepository {
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<void> addPhotoToFavorites(Photo photo) => Result.tryCatchAsync(
|
||||
FutureOrResult<void> addPhotoToFavorites(Photo photo) => Result.tryCatchAsync(
|
||||
() => _favoriteLocalDataSource.addPhotoToFavorites(photo),
|
||||
(error) => ClientException('Cannot add photo to favorites.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<bool> checkIfPhotoIsInFavorites(int id) => Result.tryCatchAsync(
|
||||
FutureOrResult<bool> checkIfPhotoIsInFavorites(int id) =>
|
||||
Result.tryCatchAsync(
|
||||
() => _favoriteLocalDataSource.checkIfPhotoIsInFavorites(id),
|
||||
(error) =>
|
||||
ClientException('Cannot check if photo `$id` is in favorites.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<void> deletePhotoFromFavorites(int id) => Result.tryCatchAsync(
|
||||
FutureOrResult<void> deletePhotoFromFavorites(int id) => Result.tryCatchAsync(
|
||||
() => _favoriteLocalDataSource.deletePhotoFromFavorites(id),
|
||||
(error) => ClientException('Cannot delete photo `$id` from favorites.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<Album> getAlbum(int id) => Result.tryCatchAsync(
|
||||
FutureOrResult<Album> getAlbum(int id) => Result.tryCatchAsync(
|
||||
() => _albumRemoteDataSource.getAlbum(id),
|
||||
(error) => ServerException('Cannot retrieve album $id.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<List<Album>> getAllAlbums({int? start, int? limit}) =>
|
||||
FutureOrResult<List<Album>> getAllAlbums({int? start, int? limit}) =>
|
||||
Result.tryCatchAsync(
|
||||
() => _albumRemoteDataSource.getAllAlbums(start: start, limit: limit),
|
||||
(error) => ServerException('Cannot retrieve all albums.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> getAllPhotos({int? start, int? limit}) async =>
|
||||
FutureOrResult<List<Photo>> getAllPhotos({int? start, int? limit}) async =>
|
||||
Result.tryCatchAsync(
|
||||
() => _photoRemoteDataSource.getAllPhotos(start: start, limit: limit),
|
||||
(error) => ServerException('Cannot retrieve all photos.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> getAllPhotosFromFavorites() async {
|
||||
FutureOrResult<List<Photo>> getAllPhotosFromFavorites() async {
|
||||
try {
|
||||
final response = <Photo>[];
|
||||
final favorites =
|
||||
@ -95,13 +96,13 @@ class PhotoRepositoryImpl extends PhotoRepository {
|
||||
}
|
||||
|
||||
@override
|
||||
FutureResult<Photo> getPhoto(int id) => Result.tryCatchAsync(
|
||||
FutureOrResult<Photo> getPhoto(int id) => Result.tryCatchAsync(
|
||||
() => _photoRemoteDataSource.getPhoto(id),
|
||||
(error) => ServerException('Cannot retrieve photo $id.'),
|
||||
);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> getPhotosFromAlbum(
|
||||
FutureOrResult<List<Photo>> getPhotosFromAlbum(
|
||||
int albumId, {
|
||||
int? start,
|
||||
int? limit,
|
||||
|
@ -19,17 +19,17 @@ import 'package:architecture_example/domain/entities/photo.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
abstract class PhotoRepository extends BaseRepository {
|
||||
FutureResult<Album> getAlbum(int id);
|
||||
FutureResult<List<Album>> getAllAlbums({int? start, int? limit});
|
||||
FutureResult<Photo> getPhoto(int id);
|
||||
FutureResult<List<Photo>> getAllPhotos({int? start, int? limit});
|
||||
FutureResult<List<Photo>> getPhotosFromAlbum(
|
||||
FutureOrResult<Album> getAlbum(int id);
|
||||
FutureOrResult<List<Album>> getAllAlbums({int? start, int? limit});
|
||||
FutureOrResult<Photo> getPhoto(int id);
|
||||
FutureOrResult<List<Photo>> getAllPhotos({int? start, int? limit});
|
||||
FutureOrResult<List<Photo>> getPhotosFromAlbum(
|
||||
int albumId, {
|
||||
int? start,
|
||||
int? limit,
|
||||
});
|
||||
FutureResult<void> addPhotoToFavorites(Photo photo);
|
||||
FutureResult<void> deletePhotoFromFavorites(int id);
|
||||
FutureResult<List<Photo>> getAllPhotosFromFavorites();
|
||||
FutureResult<bool> checkIfPhotoIsInFavorites(int id);
|
||||
FutureOrResult<void> addPhotoToFavorites(Photo photo);
|
||||
FutureOrResult<void> deletePhotoFromFavorites(int id);
|
||||
FutureOrResult<List<Photo>> getAllPhotosFromFavorites();
|
||||
FutureOrResult<bool> checkIfPhotoIsInFavorites(int id);
|
||||
}
|
||||
|
@ -14,18 +14,27 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:architecture_example/domain/entities/photo.dart';
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class AddPhotoToFavorites extends UseCase<Photo, List<Photo>> {
|
||||
class AddPhotoToFavorites extends AsyncUseCase<Photo, List<Photo>> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
AddPhotoToFavorites(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> call(Photo params) async {
|
||||
await _photoRepository.addPhotoToFavorites(params);
|
||||
FutureOrResult<List<Photo>> call(Photo? params) async {
|
||||
await _photoRepository.addPhotoToFavorites(params!);
|
||||
return _photoRepository.getAllPhotosFromFavorites();
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(Photo? params) {
|
||||
if (params == null) {
|
||||
throw ClientException('Photo cannot be null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,15 +14,24 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class CheckIfPhotoIsInFavorites extends UseCase<int, bool> {
|
||||
class CheckIfPhotoIsInFavorites extends AsyncUseCase<int, bool> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
CheckIfPhotoIsInFavorites(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<bool> call(int params) async =>
|
||||
_photoRepository.checkIfPhotoIsInFavorites(params);
|
||||
FutureOrResult<bool> call(int? params) async =>
|
||||
_photoRepository.checkIfPhotoIsInFavorites(params!);
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(int? params) {
|
||||
if (params == null) {
|
||||
throw ClientException('id cannot be null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -18,13 +18,13 @@ import 'package:architecture_example/domain/entities/photo.dart';
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class DisplayFavorites extends UseCase<void, List<Photo>> {
|
||||
class DisplayFavorites extends AsyncUseCase<NoParam, List<Photo>> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
DisplayFavorites(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> call(void params) {
|
||||
FutureOrResult<List<Photo>> call(void params) {
|
||||
final photos = _photoRepository.getAllPhotosFromFavorites();
|
||||
return photos;
|
||||
}
|
||||
|
@ -14,18 +14,27 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:architecture_example/domain/entities/photo.dart';
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class DisplayPhoto extends UseCase<int, Photo> {
|
||||
class DisplayPhoto extends AsyncUseCase<int, Photo> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
DisplayPhoto(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<Photo> call(int params) {
|
||||
final photo = _photoRepository.getPhoto(params);
|
||||
FutureOrResult<Photo> call(int? params) {
|
||||
final photo = _photoRepository.getPhoto(params!);
|
||||
return photo;
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(int? params) {
|
||||
if (params == null) {
|
||||
throw ClientException('id cannot be null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,24 +14,33 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:architecture_example/domain/entities/photo.dart';
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:architecture_example/domain/usecases/photos/params/query_parameters.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class OpenAlbum extends UseCase<QueryParameters, List<Photo>> {
|
||||
class OpenAlbum extends AsyncUseCase<QueryParameters, List<Photo>> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
OpenAlbum(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> call(QueryParameters params) {
|
||||
FutureOrResult<List<Photo>> call(QueryParameters? params) {
|
||||
final photos = _photoRepository.getPhotosFromAlbum(
|
||||
params.albumId,
|
||||
params!.albumId,
|
||||
start: params.start,
|
||||
limit: params.limit,
|
||||
);
|
||||
|
||||
return photos;
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(QueryParameters? params) {
|
||||
if (params == null) {
|
||||
throw ClientException('params cannot be null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,18 +14,27 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:architecture_example/domain/entities/photo.dart';
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class RemovePhotoFromFavorites extends UseCase<int, List<Photo>> {
|
||||
class RemovePhotoFromFavorites extends AsyncUseCase<int, List<Photo>> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
RemovePhotoFromFavorites(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<List<Photo>> call(int params) async {
|
||||
await _photoRepository.deletePhotoFromFavorites(params);
|
||||
FutureOrResult<List<Photo>> call(int? params) async {
|
||||
await _photoRepository.deletePhotoFromFavorites(params!);
|
||||
return _photoRepository.getAllPhotosFromFavorites();
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(int? params) {
|
||||
if (params == null) {
|
||||
throw ClientException('id cannot be null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,22 +14,31 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:architecture_example/domain/entities/album.dart';
|
||||
import 'package:architecture_example/domain/repositories/photo_repository.dart';
|
||||
import 'package:architecture_example/domain/usecases/photos/params/query_parameters.dart';
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
class RetrieveAllAlbums extends UseCase<QueryParameters, List<Album>> {
|
||||
class RetrieveAllAlbums extends AsyncUseCase<QueryParameters, List<Album>> {
|
||||
final PhotoRepository _photoRepository;
|
||||
|
||||
RetrieveAllAlbums(this._photoRepository);
|
||||
|
||||
@override
|
||||
FutureResult<List<Album>> call(QueryParameters params) {
|
||||
FutureOrResult<List<Album>> call(QueryParameters? params) {
|
||||
final albums = _photoRepository.getAllAlbums(
|
||||
start: params.start,
|
||||
start: params!.start,
|
||||
limit: params.limit,
|
||||
);
|
||||
return albums;
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> onStart(QueryParameters? params) {
|
||||
if (params == null) {
|
||||
throw ClientException('params cannot be null');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,44 @@
|
||||
// Copyright (C) 2022 WYATT GROUP
|
||||
// Please see the AUTHORS file for details.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:wyatt_architecture/wyatt_architecture.dart';
|
||||
|
||||
/// Usecase observers
|
||||
mixin Observer<Parameters, ReturnType> {
|
||||
/// Called before usecase is runned.
|
||||
/// Usefull to check the preconditions
|
||||
FutureOr<void> onStart(Parameters? params) {}
|
||||
|
||||
/// Called when error occures during main scenario
|
||||
/// Usefull to run alternative scenario
|
||||
FutureOr<void> onError(AppException? error) {}
|
||||
}
|
||||
|
||||
/// Specific observer for classic usecase
|
||||
mixin AsyncObserver<ReturnType> {
|
||||
FutureOr<void> onComplete(ReturnType? data) {}
|
||||
}
|
||||
|
||||
/// Specific observer for stream case usecase
|
||||
mixin StreamObserver<ReturnType> {
|
||||
/// Replaces the data event handler of this subscription.
|
||||
void onDone() {}
|
||||
|
||||
/// Replaces the done event handler of this subscription.
|
||||
void onData(ReturnType? data) {}
|
||||
}
|
@ -14,14 +14,67 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:wyatt_architecture/src/core/exceptions/exceptions.dart';
|
||||
import 'package:wyatt_architecture/src/domain/usecases/observers.dart';
|
||||
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
|
||||
|
||||
typedef FutureResult<T> = Future<Result<T, AppException>>;
|
||||
typedef FutureOrResult<T> = FutureOr<Result<T, AppException>>;
|
||||
typedef StreamResult<T> = Stream<Result<T, AppException>>;
|
||||
typedef Res<T> = Result<T, AppException>;
|
||||
|
||||
// ignore: one_member_abstracts
|
||||
abstract class UseCase<Parameters, ReturnType> {
|
||||
FutureResult<ReturnType> call(Parameters params);
|
||||
/// Abstract class of a use case
|
||||
abstract class BaseUseCase<Parameters, ReturnType> {
|
||||
/// Run use case scenarios
|
||||
ReturnType execute(Parameters parameters);
|
||||
|
||||
/// Private function to implement main scenario
|
||||
/// of your usecase.
|
||||
ReturnType call(Parameters params);
|
||||
}
|
||||
|
||||
/// Abstract class of a use case that deals specifically
|
||||
/// with the response and its state.
|
||||
abstract class UseCase<Parameters, ReturnType>
|
||||
extends BaseUseCase<Parameters?, FutureOrResult<ReturnType>>
|
||||
with Observer<Parameters, ReturnType> {
|
||||
FutureOr<void> _onSuccess(ReturnType data);
|
||||
|
||||
/// Supports the result of the main scenario and integrates
|
||||
/// some alternative scenarios if necessary.
|
||||
@override
|
||||
FutureOrResult<ReturnType> execute(Parameters? parameters) async {
|
||||
try {
|
||||
await onStart(parameters);
|
||||
final response = await call(parameters);
|
||||
if (response.isErr) {
|
||||
await onError(response.err);
|
||||
} else if (response.isOk && response.ok != null) {
|
||||
await _onSuccess(response.ok as ReturnType);
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return Err(ClientException(e.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Abtstract classic usecase.
|
||||
abstract class AsyncUseCase<Parameters, ReturnType>
|
||||
extends UseCase<Parameters?, ReturnType> with AsyncObserver<ReturnType> {
|
||||
@override
|
||||
FutureOr<void> _onSuccess(ReturnType data) => onComplete(data);
|
||||
}
|
||||
|
||||
/// Abstract specific usecase bases on streams
|
||||
abstract class StreamUseCase<Parameters, ReturnType>
|
||||
extends UseCase<Parameters?, Stream<ReturnType>>
|
||||
with StreamObserver<ReturnType> {
|
||||
@override
|
||||
FutureOr<void> _onSuccess(Stream<ReturnType> data) {
|
||||
data.listen(
|
||||
onData,
|
||||
onDone: onDone,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -15,4 +15,5 @@
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
export 'no_param.dart';
|
||||
export 'observers.dart';
|
||||
export 'usecase.dart';
|
||||
|
BIN
packages/wyatt_architecture/models/class_model.png
Normal file
BIN
packages/wyatt_architecture/models/class_model.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 117 KiB |
86
packages/wyatt_architecture/models/class_model.puml
Normal file
86
packages/wyatt_architecture/models/class_model.puml
Normal file
@ -0,0 +1,86 @@
|
||||
@startuml
|
||||
set namespaceSeparator ::
|
||||
|
||||
abstract class "wyatt_architecture::src::core::exceptions::exceptions.dart::AppException" {
|
||||
+String? message
|
||||
+String toString()
|
||||
}
|
||||
|
||||
"dart::core::Exception" <|-- "wyatt_architecture::src::core::exceptions::exceptions.dart::AppException"
|
||||
|
||||
class "wyatt_architecture::src::core::exceptions::exceptions.dart::ClientException" {
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::core::exceptions::exceptions.dart::AppException" <|-- "wyatt_architecture::src::core::exceptions::exceptions.dart::ClientException"
|
||||
class "wyatt_architecture::src::core::exceptions::exceptions.dart::ServerException" {
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::core::exceptions::exceptions.dart::AppException" <|-- "wyatt_architecture::src::core::exceptions::exceptions.dart::ServerException"
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::repositories::base_repository.dart::BaseRepository" {
|
||||
}
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::data_sources::local::base_local_data_source.dart::BaseLocalDataSource" {
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::domain::data_sources::base_data_source.dart::BaseDataSource" <|-- "wyatt_architecture::src::domain::data_sources::local::base_local_data_source.dart::BaseLocalDataSource"
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::data_sources::base_data_source.dart::BaseDataSource" {
|
||||
}
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::data_sources::remote::base_remote_data_source.dart::BaseRemoteDataSource" {
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::domain::data_sources::base_data_source.dart::BaseDataSource" <|-- "wyatt_architecture::src::domain::data_sources::remote::base_remote_data_source.dart::BaseRemoteDataSource"
|
||||
|
||||
class "wyatt_architecture::src::domain::usecases::no_param.dart::NoParam" {
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::domain::entities::entity.dart::Entity" <|-- "wyatt_architecture::src::domain::usecases::no_param.dart::NoParam"
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::observers.dart::Observer" {
|
||||
+FutureOr<void> onStart()
|
||||
+FutureOr<void> onError()
|
||||
}
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::observers.dart::AsyncObserver" {
|
||||
+FutureOr<void> onComplete()
|
||||
}
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::observers.dart::StreamObserver" {
|
||||
+void onDone()
|
||||
+void onData()
|
||||
}
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::usecase.dart::BaseUseCase" {
|
||||
+ReturnType execute()
|
||||
+ReturnType call()
|
||||
}
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::usecase.dart::UseCase" {
|
||||
-FutureOr<void> _onSuccess()
|
||||
+FutureOr<Result<ReturnType, AppException>> execute()
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::domain::usecases::usecase.dart::BaseUseCase" <|-- "wyatt_architecture::src::domain::usecases::usecase.dart::UseCase"
|
||||
"wyatt_architecture::src::domain::usecases::observers.dart::Observer" <|-- "wyatt_architecture::src::domain::usecases::usecase.dart::UseCase"
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::usecase.dart::AsyncUseCase" {
|
||||
-FutureOr<void> _onSuccess()
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::domain::usecases::usecase.dart::UseCase" <|-- "wyatt_architecture::src::domain::usecases::usecase.dart::AsyncUseCase"
|
||||
"wyatt_architecture::src::domain::usecases::observers.dart::AsyncObserver" <|-- "wyatt_architecture::src::domain::usecases::usecase.dart::AsyncUseCase"
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::usecases::usecase.dart::StreamUseCase" {
|
||||
-FutureOr<void> _onSuccess()
|
||||
}
|
||||
|
||||
"wyatt_architecture::src::domain::usecases::usecase.dart::UseCase" <|-- "wyatt_architecture::src::domain::usecases::usecase.dart::StreamUseCase"
|
||||
"wyatt_architecture::src::domain::usecases::observers.dart::StreamObserver" <|-- "wyatt_architecture::src::domain::usecases::usecase.dart::StreamUseCase"
|
||||
|
||||
abstract class "wyatt_architecture::src::domain::entities::entity.dart::Entity" {
|
||||
}
|
||||
|
||||
|
||||
@enduml
|
Loading…
x
Reference in New Issue
Block a user