Last active
April 16, 2020 20:27
-
-
Save HerrNiklasRaab/45c0b0cc9a52d6838501cfcf0eba3818 to your computer and use it in GitHub Desktop.
Revisions
-
HerrNiklasRaab renamed this gist
Apr 16, 2020 . 1 changed file with 0 additions and 0 deletions.There are no files selected for viewing
File renamed without changes. -
HerrNiklasRaab revised this gist
Apr 12, 2020 . 1 changed file with 1 addition and 136 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,9 +1,3 @@ abstract class User extends DataModel { final Name name; @@ -164,133 +158,4 @@ class UserImpl extends DataModel implements User { bool get hasEmailSettings => authenticationProvider.any((authenticationProvider) => authenticationProvider.runtimeType == EmailAuthenticationProvider); } -
HerrNiklasRaab created this gist
Apr 12, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,296 @@ import 'package:dart_json_mapper/dart_json_mapper.dart'; import 'package:fazua_domain/fazua_domain.dart'; import 'package:fazua_domain/src/entities/country.dart'; import 'package:intl/intl.dart'; import 'data_model.dart'; import 'gender.dart'; abstract class User extends DataModel { final Name name; final Address address; final Gender gender; final Birthday birthDay; final Email email; final Weight weight; final Length height; final bool hasFinishedSignUp; Iterable<String> get notificationTokens; bool get needsEmailVerification; bool get hasEmailSettings; User finishSignUp(); User updateAuthenticationProvider( List<AuthenticationProvider> authenticationProvider); @override User copyWith( {String id, Email email, Name name, Address address, Gender gender, Birthday birthDay, Weight weight, Length height, bool setNameNull = false, bool setAddressNull = false, bool setBirthdayNull = false, bool setWeightNull = false, bool setHeightNull = false, bool setGenderNull = false}); factory User(String id, AuthenticationProvider authenticationProvider) = UserImpl.newUser; } @jsonSerializable class UserImpl extends DataModel implements User { @override @JsonProperty(enumValues: Gender.values) final Gender gender; @override @JsonProperty() final Birthday birthDay; @override @JsonProperty() final Email email; @override @JsonProperty() final List<String> notificationTokens; @JsonProperty() final List<AuthenticationProvider> authenticationProvider; @override @JsonProperty() final Name name; @override @JsonProperty() final Address address; @override @JsonProperty() final bool hasFinishedSignUp; @override @JsonProperty() final Length height; @override @JsonProperty() final Weight weight; UserImpl({ String id, this.name, this.birthDay, this.email, this.hasFinishedSignUp = false, this.gender, this.address, this.authenticationProvider = const [], this.notificationTokens = const [], this.height, this.weight, }) : super(id: id); factory UserImpl.newUser( String id, AuthenticationProvider authenticationProvider) { return UserImpl( id: id, ).updateAuthenticationProvider([authenticationProvider]) as UserImpl; } @override User copyWith( {Email email, Address address, Gender gender, Birthday birthDay, Name name, bool hasFinishedSignUp, List<AuthenticationProvider> authenticationProvider, List<String> notificationTokens, Length height, Weight weight, bool setNameNull = false, bool setAddressNull = false, bool setBirthdayNull = false, bool setWeightNull = false, bool setHeightNull = false, bool setGenderNull = false, String id}) { return UserImpl( id: id ?? this.id, email: email ?? this.email, name: setNameNull ? null : name ?? this.name, hasFinishedSignUp: hasFinishedSignUp ?? this.hasFinishedSignUp, address: setAddressNull ? null : address ?? this.address, gender: setGenderNull ? null : gender ?? this.gender, birthDay: setBirthdayNull ? null : birthDay ?? this.birthDay, authenticationProvider: authenticationProvider ?? this.authenticationProvider, notificationTokens: notificationTokens ?? this.notificationTokens, height: setHeightNull ? null : height ?? this.height, weight: setWeightNull ? null : weight ?? this.weight); } @override User updateAuthenticationProvider( List<AuthenticationProvider> newAuthenticationProvider) { return copyWith(authenticationProvider: [ ...newAuthenticationProvider.toSet().toList() ]); } @override bool get needsEmailVerification => authenticationProvider.every( (authenticationProvider) => authenticationProvider.shouldValidateEmail); @override User finishSignUp() { return copyWith(hasFinishedSignUp: true); } @override bool get hasEmailSettings => authenticationProvider.any((authenticationProvider) => authenticationProvider.runtimeType == EmailAuthenticationProvider); } //Need to make a type because enum lists are not serializable @jsonSerializable abstract class AuthenticationProvider extends AutoEquatable { bool get shouldValidateEmail; } @jsonSerializable class GoogleAuthenticationProvider extends AuthenticationProvider { @override bool get shouldValidateEmail => false; } @jsonSerializable class EmailAuthenticationProvider extends AuthenticationProvider { @override bool get shouldValidateEmail => true; } @jsonSerializable class FacebookAuthenticationProvider extends AuthenticationProvider { @override bool get shouldValidateEmail => false; } //Let's fight primitive Obsession: https://medium.com/the-sixt-india-blog/primitive-obsession-code-smell-that-hurt-people-the-most-5cbdd70496e9 @jsonSerializable class Name extends AutoEquatable { @JsonProperty() final String firstName; @JsonProperty() final String lastName; String get fullName => firstName + " " + lastName; Name({this.firstName, this.lastName}); @override String toString() { return fullName.toString(); } } @jsonSerializable class Email extends AutoEquatable { static final validationRegex = RegExp( r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+"); @JsonProperty() final String email; String get localPart => _parts[0]; List<String> get _parts => email.split("@"); Email(this.email) : assert(validationRegex.hasMatch(email)); @override String toString() { return email; } } @jsonSerializable class Birthday extends AutoEquatable { static final minBirthday = DateTime(1900); @JsonProperty() final DateTime birthday; Birthday(this.birthday) : assert(birthday != null), assert(birthday.isAfter(minBirthday)); @override String toString() { return "${DateFormat('dd.MM.yyyy').format(birthday)}"; } } @jsonSerializable @JsonProperty() class Address extends AutoEquatable { @JsonProperty() final Country country; @JsonProperty() final Postcode postalCode; Address({this.country, this.postalCode}); } @jsonSerializable class Postcode extends AutoEquatable { @JsonProperty() final String postcode; Postcode(this.postcode); @override String toString() { return postcode.toString(); } } @jsonSerializable class Length extends AutoEquatable { @JsonProperty() final double meter; Length(this.meter); @override String toString() { return meter.toStringAsFixed(2) + " m"; } } @jsonSerializable class Weight extends AutoEquatable { @JsonProperty() final double kg; Weight(this.kg); @override String toString() { return kg.toStringAsFixed(0) + " kg"; } }