Skip to content

Commit 2809557

Browse files
committed
wip
1 parent 2b32051 commit 2809557

File tree

4 files changed

+117
-273
lines changed

4 files changed

+117
-273
lines changed

lib/data/user_repository_imp.dart

Lines changed: 64 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -50,80 +50,84 @@ class UserRepositoryImpl implements UserRepository {
5050
}) {
5151
return _execute(() => _remoteDataSource.loginUser(email, password))
5252
.flatMapResult((result) {
53-
final token = result!.token!;
54-
return _execute(() => _remoteDataSource
55-
.getUserProfile(email, token)
56-
.then((user) => Tuple2(user, token)));
57-
}).flatMapResult(
58-
(tuple) => _execute(
59-
() => _localDataSource
60-
.saveUserAndToken(
53+
final token = result.token!;
54+
return _execute(() => _remoteDataSource
55+
.getUserProfile(email, token)
56+
.then((user) => Tuple2(user, token)));
57+
})
58+
.flatMapResult(
59+
(tuple) => _execute(
60+
() => _localDataSource.saveUserAndToken(
6161
_Mappers.userResponseToUserAndTokenEntity(
62-
tuple!.item1,
62+
tuple.item1,
6363
tuple.item2,
6464
),
65-
)
66-
.then((value) => unit),
67-
),
68-
);
65+
),
66+
),
67+
)
68+
.asUnit();
6969
}
7070

7171
@override
72-
Stream<Result<void>> registerUser({
72+
Single_Result_Unit registerUser({
7373
required String name,
7474
required String email,
7575
required String password,
7676
}) =>
77-
_execute(() => _remoteDataSource.registerUser(name, email, password));
77+
_execute(() => _remoteDataSource.registerUser(name, email, password))
78+
.asUnit();
7879

7980
@override
80-
Stream<Result<void>> logout() =>
81-
_execute<void>(() => _localDataSource.removeUserAndToken());
81+
Single_Result_Unit logout() =>
82+
_execute<void>(() => _localDataSource.removeUserAndToken()).asUnit();
8283

8384
@override
84-
Stream<Result<void>> uploadImage(File image) {
85-
return _userAndToken.flatMapResult((userAndToken) {
86-
if (userAndToken == null) {
87-
return Stream.value(
88-
Failure(
89-
(b) => b
90-
..message = 'Require login!'
91-
..error = 'Email or token is null',
92-
),
93-
);
94-
}
95-
96-
return _execute(
97-
() => _remoteDataSource.uploadImage(
98-
image,
99-
userAndToken.user.email,
100-
userAndToken.token,
101-
),
102-
).flatMapResult(
103-
(user) => _execute(
104-
() => _localDataSource.saveUserAndToken(
105-
_Mappers.userResponseToUserAndTokenEntity(
106-
user!,
107-
userAndToken.token,
85+
Single_Result_Unit uploadImage(File image) {
86+
return _userAndToken
87+
.flatMapResult((userAndToken) {
88+
if (userAndToken == null) {
89+
return Single.value(
90+
Failure(
91+
message: 'Require login!',
92+
error: 'Email or token is null',
93+
),
94+
);
95+
}
96+
97+
return _execute(
98+
() => _remoteDataSource
99+
.uploadImage(
100+
image,
101+
userAndToken.user.email,
102+
userAndToken.token,
103+
)
104+
.then((user) => Tuple2(user, userAndToken.token)),
105+
);
106+
})
107+
.flatMapResult(
108+
(tuple) => _execute(
109+
() => _localDataSource.saveUserAndToken(
110+
_Mappers.userResponseToUserAndTokenEntity(
111+
tuple.item1,
112+
tuple.item2,
113+
),
108114
),
109115
),
110-
),
111-
);
112-
});
116+
)
117+
.asUnit();
113118
}
114119

115120
@override
116-
Stream<Result<void>> changePassword({
121+
Single_Result_Unit changePassword({
117122
required String password,
118123
required String newPassword,
119124
}) {
120125
return _userAndToken.flatMapResult((userAndToken) {
121126
if (userAndToken == null) {
122-
return Stream.value(
127+
return Single.value(
123128
Failure(
124-
(b) => b
125-
..message = 'Require login!'
126-
..error = 'Email or token is null',
129+
message: 'Require login!',
130+
error: 'Email or token is null',
127131
),
128132
);
129133
}
@@ -135,12 +139,12 @@ class UserRepositoryImpl implements UserRepository {
135139
newPassword,
136140
userAndToken.token,
137141
),
138-
);
142+
).asUnit();
139143
});
140144
}
141145

142146
@override
143-
Stream<Result<void>> resetPassword({
147+
Single_Result_Unit resetPassword({
144148
required String email,
145149
required String token,
146150
required String newPassword,
@@ -151,17 +155,17 @@ class UserRepositoryImpl implements UserRepository {
151155
token: token,
152156
newPassword: newPassword,
153157
),
154-
);
158+
).asUnit();
155159

156160
@override
157-
Stream<Result<void>> sendResetPasswordEmail(String email) =>
158-
_execute(() => _remoteDataSource.resetPassword(email));
161+
Single_Result_Unit sendResetPasswordEmail(String email) =>
162+
_execute(() => _remoteDataSource.resetPassword(email)).asUnit();
159163

160164
///
161165
/// Helpers functions
162166
///
163167
164-
Stream<Result<UserAndTokenEntity?>> get _userAndToken =>
168+
Single<Result<UserAndTokenEntity?>> get _userAndToken =>
165169
_execute(() => _localDataSource.userAndToken);
166170

167171
///
@@ -174,7 +178,7 @@ class UserRepositoryImpl implements UserRepository {
174178
.doOnError(
175179
_handleUnauthenticatedError) // TODO(single): remove singleOrError
176180
.singleOrError()
177-
.map<Result<T>>((value) => Success<T>.of(value: value))
181+
.map<Result<T>>((value) => Success<T>(value))
178182
.onErrorReturnWith(_errorToResult);
179183

180184
///
@@ -192,14 +196,14 @@ class UserRepositoryImpl implements UserRepository {
192196
///
193197
/// Convert error to [Failure]
194198
///
195-
static Failure<T> _errorToResult<T extends Object>(Object e, StackTrace s) {
199+
static Failure _errorToResult(Object e, StackTrace s) {
196200
if (e is RemoteDataSourceException) {
197-
return Failure.of(message: e.message, error: e);
201+
return Failure(message: e.message, error: e);
198202
}
199203
if (e is LocalDataSourceException) {
200-
return Failure.of(message: e.message, error: e);
204+
return Failure(message: e.message, error: e);
201205
}
202-
return Failure.of(message: e.toString(), error: e);
206+
return Failure(message: e.toString(), error: e);
203207
}
204208

205209
///

lib/domain/repositories/user_repository.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ import 'dart:io';
22

33
import 'package:node_auth/domain/models/auth_state.dart';
44
import 'package:node_auth/utils/result.dart';
5-
import 'package:rxdart_ext/rxdart_ext.dart';
6-
7-
typedef Single_Result_Unit = Single<Result<Unit>>;
85

96
abstract class UserRepository {
107
Stream<AuthenticationState> get authenticationState$;

lib/utils/result.dart

Lines changed: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,94 @@
1-
import 'package:built_value/built_value.dart';
21
import 'package:meta/meta.dart';
32
import 'package:rxdart_ext/rxdart_ext.dart';
43

5-
part 'result.g.dart';
6-
74
@sealed
85
@immutable
96
abstract class Result<T> {}
107

118
extension ResultExtensions<T> on Result<T> {
129
R fold<R>(
13-
R Function(T? value) onSuccess,
10+
R Function(T value) onSuccess,
1411
R Function(Object error, String message) onFailure,
1512
) {
1613
final self = this;
1714
if (self is Success<T>) {
1815
return onSuccess(self.value);
1916
}
20-
if (self is Failure<T>) {
17+
if (self is Failure) {
2118
return onFailure(self.error, self.message);
2219
}
2320
throw StateError('Cannot handle $this');
2421
}
2522
}
2623

27-
abstract class Success<T>
28-
implements Built<Success<T>, SuccessBuilder<T>>, Result<T> {
29-
T? get value;
24+
class Success<T> implements Result<T> {
25+
final T value;
26+
27+
Success(this.value);
3028

31-
Success._();
29+
@override
30+
String toString() => 'Success{value: $value}';
3231

33-
factory Success.of({required T? value}) = _$Success._;
32+
@override
33+
bool operator ==(Object other) =>
34+
identical(this, other) ||
35+
other is Success &&
36+
runtimeType == other.runtimeType &&
37+
value == other.value;
3438

35-
factory Success([void Function(SuccessBuilder<T>) updates]) = _$Success<T>;
39+
@override
40+
int get hashCode => value.hashCode;
3641
}
3742

38-
abstract class Failure<T>
39-
implements Built<Failure<T>, FailureBuilder<T>>, Result<T> {
40-
String get message;
43+
class Failure implements Result<Never> {
44+
final String message;
45+
final Object error;
4146

42-
Object get error;
47+
Failure({
48+
required this.message,
49+
required this.error,
50+
});
4351

44-
Failure._();
52+
@override
53+
String toString() => 'Failure{message: $message, error: $error}';
4554

46-
factory Failure.of({
47-
required String message,
48-
required Object error,
49-
}) = _$Failure._;
55+
@override
56+
bool operator ==(Object other) =>
57+
identical(this, other) ||
58+
other is Failure &&
59+
runtimeType == other.runtimeType &&
60+
message == other.message &&
61+
error == other.error;
5062

51-
factory Failure([void Function(FailureBuilder<T>) updates]) = _$Failure<T>;
63+
@override
64+
int get hashCode => message.hashCode ^ error.hashCode;
5265
}
5366

5467
extension FlatMapResultExtension<T extends Object?> on Single<Result<T>> {
5568
Single<Result<R>> flatMapResult<R>(
56-
Single<Result<R>> Function(T? value) mapper,
57-
) {
58-
return flatMapSingle(
59-
(result) => result.fold(
60-
mapper,
61-
(error, message) => Single.value(
62-
Failure<R>.of(
63-
message: message,
64-
error: error,
65-
),
69+
Single<Result<R>> Function(T value) mapper,
70+
) =>
71+
flatMapSingle(
72+
(result) => result.fold(
73+
mapper,
74+
(error, message) => Single.value(result as Failure),
6675
),
67-
),
68-
);
69-
}
76+
);
7077
}
7178

79+
extension UnitSingleResultExtension<T> on Single<Result<T>> {
80+
Single_Result_Unit asUnit() => map(
81+
(r) => r.fold(
82+
(_) => Success<Unit>(unit),
83+
(error, message) => r as Result<Unit>,
84+
),
85+
);
86+
}
87+
88+
typedef Single_Result_Unit = Single<Result<Unit>>;
89+
7290
class Unit {
7391
const Unit._();
7492
}
7593

76-
const unit = Unit._();
94+
const unit = Unit._();

0 commit comments

Comments
 (0)