Skip to content

Instantly share code, notes, and snippets.

@HerrNiklasRaab
Last active April 16, 2020 20:27
Show Gist options
  • Select an option

  • Save HerrNiklasRaab/45c0b0cc9a52d6838501cfcf0eba3818 to your computer and use it in GitHub Desktop.

Select an option

Save HerrNiklasRaab/45c0b0cc9a52d6838501cfcf0eba3818 to your computer and use it in GitHub Desktop.

Revisions

  1. HerrNiklasRaab renamed this gist Apr 16, 2020. 1 changed file with 0 additions and 0 deletions.
  2. HerrNiklasRaab revised this gist Apr 12, 2020. 1 changed file with 1 addition and 136 deletions.
    137 changes: 1 addition & 136 deletions Dart serialize private members
    Original file line number Diff line number Diff line change
    @@ -1,9 +1,3 @@
    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;
    @@ -164,133 +158,4 @@ class UserImpl extends DataModel implements User {
    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";
    }
    }
    }
  3. HerrNiklasRaab created this gist Apr 12, 2020.
    296 changes: 296 additions & 0 deletions Dart serialize private members
    Original 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";
    }
    }