From 6c86296149c1e0ce015ba297c5da346ac6ef3f6e Mon Sep 17 00:00:00 2001 From: Lukas Hermann Date: Fri, 1 Aug 2025 20:41:55 +0200 Subject: [PATCH] feat: Migrate models to entities --- .templates/newDTO/___dto_name____dto.dart | 6 ++++ .../newEntity/___entity_name____entity.dart | 10 ++++++ .templates/newEntity/template.config.json | 6 ++++ .../___feature_name____event.dart | 2 +- .../newModel/___model_name____model.dart | 30 ----------------- .templates/newModel/template.config.json | 6 ---- README.md | 4 +-- build.yaml | 8 ++--- flutter.code-workspace | 1 + .../placeholder/error_placeholder_widget.dart | 2 +- lib/common/data/dto/user_response_dto.dart | 12 +++++++ .../exception/custom_exception.dart | 0 .../exception/validator_exception.dart | 0 .../notification_payload_entity.dart} | 22 ++++++------- lib/common/data/entity/user_entity.dart | 19 +++++++++++ lib/common/data/model/user_model.dart | 32 ------------------- lib/common/extension/async_value.dart | 2 +- lib/common/extension/response.dart | 2 +- ...del_state.dart => current_user_state.dart} | 14 ++++---- .../provider/firebase_messaging_service.dart | 8 ++--- .../provider/notifications_service.dart | 18 +++++------ .../sign_in_anonymously_use_case.dart | 4 +-- .../sign_in_completion_use_case.dart | 12 +++---- .../sign_in_with_apple_use_case.dart | 4 +-- ...sign_in_with_auth_credential_use_case.dart | 6 ++-- .../sign_in_with_google_use_case.dart | 4 +-- .../authentication/sign_out_use_case.dart | 4 +-- .../user/get_current_user_use_case.dart | 6 ++-- .../user/get_database_user_use_case.dart | 8 ++--- .../user/set_database_user_use_case.dart | 4 +-- .../text_validator_controller_general.dart | 2 +- .../validator/text_field_validator_state.dart | 2 +- lib/core/analytics/analytics_manager.dart | 4 +-- .../authentication/authentication_state.dart | 6 ++-- .../debug_tools_colors_page_content.dart | 2 +- .../{model => entity}/debug_tools_color.dart | 0 .../debug_tools_text_styles_page_content.dart | 2 +- .../debug_tools_text_style.dart | 0 lib/features/landing/landing_page.dart | 4 +-- lib/features/profile/profile_state.dart | 6 ++-- project_setup/lib/configuration.dart | 4 +-- .../lib/core/app_icon_generator.dart | 4 +-- .../core/model/app_icon_variant_model.dart | 2 +- .../lib/core/splash_screen_generator.dart | 2 +- 44 files changed, 141 insertions(+), 155 deletions(-) create mode 100644 .templates/newEntity/___entity_name____entity.dart create mode 100644 .templates/newEntity/template.config.json delete mode 100644 .templates/newModel/___model_name____model.dart delete mode 100644 .templates/newModel/template.config.json rename lib/common/data/{model => entity}/exception/custom_exception.dart (100%) rename lib/common/data/{model => entity}/exception/validator_exception.dart (100%) rename lib/common/data/{model/notification_payload_model.dart => entity/notification_payload_entity.dart} (62%) create mode 100644 lib/common/data/entity/user_entity.dart delete mode 100644 lib/common/data/model/user_model.dart rename lib/common/provider/{current_user_model_state.dart => current_user_state.dart} (59%) rename lib/features/debug_tools/page/colors/{model => entity}/debug_tools_color.dart (100%) rename lib/features/debug_tools/page/text_styles/{model => entity}/debug_tools_text_style.dart (100%) diff --git a/.templates/newDTO/___dto_name____dto.dart b/.templates/newDTO/___dto_name____dto.dart index f8dd6e6..d60a974 100644 --- a/.templates/newDTO/___dto_name____dto.dart +++ b/.templates/newDTO/___dto_name____dto.dart @@ -11,3 +11,9 @@ abstract class ___DtoName___DTO with _$___DtoName___DTO { factory ___DtoName___DTO.fromJson(Map json) => _$___DtoName___DTOFromJson(json); } + +extension ___DtoName___DTOExtension on ___DtoName___DTO { + ___DtoName___Entity toEntity() => ___DtoName___Entity( + sampleField: sampleField, + ); +} diff --git a/.templates/newEntity/___entity_name____entity.dart b/.templates/newEntity/___entity_name____entity.dart new file mode 100644 index 0000000..32789d5 --- /dev/null +++ b/.templates/newEntity/___entity_name____entity.dart @@ -0,0 +1,10 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part '___entity_name____entity.freezed.dart'; + +@freezed +abstract class ___EntityName___Entity with _$___EntityName___Entity { + const factory ___EntityName___Entity({ + required String? sampleField, + }) = ____EntityName___Entity; +} diff --git a/.templates/newEntity/template.config.json b/.templates/newEntity/template.config.json new file mode 100644 index 0000000..3c3060e --- /dev/null +++ b/.templates/newEntity/template.config.json @@ -0,0 +1,6 @@ +{ + "name": "New Data Entity", + "variables": [ + "entityName" + ] +} \ No newline at end of file diff --git a/.templates/newFeature/___feature_name___/___feature_name____event.dart b/.templates/newFeature/___feature_name___/___feature_name____event.dart index aa203fa..1175089 100644 --- a/.templates/newFeature/___feature_name___/___feature_name____event.dart +++ b/.templates/newFeature/___feature_name___/___feature_name____event.dart @@ -1,4 +1,4 @@ -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; import 'package:flutter_app/core/riverpod/event_notifier.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; diff --git a/.templates/newModel/___model_name____model.dart b/.templates/newModel/___model_name____model.dart deleted file mode 100644 index 0527574..0000000 --- a/.templates/newModel/___model_name____model.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; - -part '___model_name____model.freezed.dart'; - -@freezed -abstract class ___ModelName___Model with _$___ModelName___Model { - const ___ModelName___Model._(); - - const factory ___ModelName___Model({ - required String? sampleField, - }) = ____ModelName___Model; - - factory ___ModelName___Model.fromAPI({required ___ModelName___DTO dto}) { - return ___ModelName___Model( - sampleField: dto.sampleField, - ); - } - - factory ___ModelName___Model.fromStorage({required ___ModelName___DBO dbo}) { - return ___ModelName___Model( - sampleField: dbo.sampleField, - ); - } - - ___ModelName___DBO toStorageDTO() { - return ___ModelName___DBO( - sampleField: sampleField, - ); - } -} diff --git a/.templates/newModel/template.config.json b/.templates/newModel/template.config.json deleted file mode 100644 index 9bcacf6..0000000 --- a/.templates/newModel/template.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "New Data Model", - "variables": [ - "modelName" - ] -} \ No newline at end of file diff --git a/README.md b/README.md index a80a475..7cf2979 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,7 @@ These are our four core values: ‣ dbo -> Classes to transfer data over to the database ‣ dto -> Classes to transfer data over the network ‣ enum -> Enum classes used across the App - ‣ model -> Model classes used across the App + ‣ entity -> Entity classes used across the App ‣ extensions -> Extension classes/methods over existing data types ‣ provider -> Global Services and manager providers, like Notification Service ‣ usecase -> Methods used to get/post data. Usually from/to network or local database @@ -324,7 +324,7 @@ On the iOS side, on the other hand, the notification will be always displayed by ![Push Notifications Payload](docs/push_notifications_payload.jpg) -As for the handling of notifications of different types, we introduced `NotificationPayloadModel`, and `NotificationType`. These both define all the notifications types expected from BE, which the app will be able to handle. All the rest of the logic is handled inside `FirebaseMessagingService` and `NotificationsService` files. +As for the handling of notifications of different types, we introduced `NotificationPayloadEntity`, and `NotificationType`. These both define all the notifications types expected from BE, which the app will be able to handle. All the rest of the logic is handled inside `FirebaseMessagingService` and `NotificationsService` files. ![Displaying Push Notifications](docs/displaying_push_notifications.jpg) diff --git a/build.yaml b/build.yaml index a0ab740..763d999 100644 --- a/build.yaml +++ b/build.yaml @@ -11,8 +11,8 @@ targets: - lib/common/data/enum/*.dart - lib/common/data/enum/**/*.dart - - lib/common/data/model/*.dart - - lib/common/data/model/**/*.dart + - lib/common/data/entity/*.dart + - lib/common/data/entity/**/*.dart - lib/common/validator/*.dart @@ -58,8 +58,8 @@ targets: - lib/common/data/enum/*.dart - lib/common/data/enum/**/*.dart - - lib/common/data/model/*.dart - - lib/common/data/model/**/*.dart + - lib/common/data/entity/*.dart + - lib/common/data/entity/**/*.dart # Title: Auto Route diff --git a/flutter.code-workspace b/flutter.code-workspace index 10b6934..9d1622e 100644 --- a/flutter.code-workspace +++ b/flutter.code-workspace @@ -178,6 +178,7 @@ "section": "components", "dbo": "database", "dto": "api", + "entity": "enum", "exception": "error", "analytics": "tasks", "network": "connection", diff --git a/lib/common/composition/placeholder/error_placeholder_widget.dart b/lib/common/composition/placeholder/error_placeholder_widget.dart index 98adf46..10dfac4 100644 --- a/lib/common/composition/placeholder/error_placeholder_widget.dart +++ b/lib/common/composition/placeholder/error_placeholder_widget.dart @@ -3,7 +3,7 @@ import 'package:flutter_app/common/component/custom_button/custom_button_primary import 'package:flutter_app/common/component/custom_text/custom_text.dart'; import 'package:flutter_app/common/composition/expandable_single_child_scroll_view.dart'; import 'package:flutter_app/common/composition/responsive_widget.dart'; -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; import 'package:flutter_app/common/extension/build_context.dart'; class ErrorPlaceholderWidget extends StatelessWidget { diff --git a/lib/common/data/dto/user_response_dto.dart b/lib/common/data/dto/user_response_dto.dart index c2864d6..4b6ce38 100644 --- a/lib/common/data/dto/user_response_dto.dart +++ b/lib/common/data/dto/user_response_dto.dart @@ -1,3 +1,4 @@ +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/data/enum/user_role.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; @@ -16,3 +17,14 @@ abstract class UserResponseDTO with _$UserResponseDTO { factory UserResponseDTO.fromJson(Map json) => _$UserResponseDTOFromJson(json); } + +extension UserResponseDTOExtension on UserResponseDTO { + UserEntity toEntity() => UserEntity( + id: id, + role: role, + email: email, + displayName: displayName, + imageUrl: null, + referredId: referredId, + ); +} diff --git a/lib/common/data/model/exception/custom_exception.dart b/lib/common/data/entity/exception/custom_exception.dart similarity index 100% rename from lib/common/data/model/exception/custom_exception.dart rename to lib/common/data/entity/exception/custom_exception.dart diff --git a/lib/common/data/model/exception/validator_exception.dart b/lib/common/data/entity/exception/validator_exception.dart similarity index 100% rename from lib/common/data/model/exception/validator_exception.dart rename to lib/common/data/entity/exception/validator_exception.dart diff --git a/lib/common/data/model/notification_payload_model.dart b/lib/common/data/entity/notification_payload_entity.dart similarity index 62% rename from lib/common/data/model/notification_payload_model.dart rename to lib/common/data/entity/notification_payload_entity.dart index 53e5452..5d4843f 100644 --- a/lib/common/data/model/notification_payload_model.dart +++ b/lib/common/data/entity/notification_payload_entity.dart @@ -1,8 +1,8 @@ import 'package:collection/collection.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -part 'notification_payload_model.freezed.dart'; -part 'notification_payload_model.g.dart'; +part 'notification_payload_entity.freezed.dart'; +part 'notification_payload_entity.g.dart'; @JsonEnum(valueField: 'value', alwaysCreate: true) enum NotificationType { @@ -17,32 +17,32 @@ enum NotificationType { } @Freezed(fromJson: true, toJson: true) -sealed class NotificationPayloadModel with _$NotificationPayloadModel { - const NotificationPayloadModel._(); +sealed class NotificationPayloadEntity with _$NotificationPayloadEntity { + const NotificationPayloadEntity._(); // Title: Sample - const factory NotificationPayloadModel.sample({ + const factory NotificationPayloadEntity.sample({ required int id, required String title, required String body, @Default(NotificationType.sample) NotificationType type, - }) = NotificationPayloadModelSample; + }) = NotificationPayloadEntitySample; // Subtitle: unknown - const factory NotificationPayloadModel.unknown({ + const factory NotificationPayloadEntity.unknown({ @Default(-1) int id, @Default('') String title, @Default('') String body, @Default(NotificationType.unknown) NotificationType type, - }) = NotificationPayloadModelUnknown; + }) = NotificationPayloadEntityUnknown; - factory NotificationPayloadModel.fromJson(Map json) { + factory NotificationPayloadEntity.fromJson(Map json) { switch (NotificationType.fromString(json['type'] as String?)) { case NotificationType.sample: - return NotificationPayloadModelSample.fromJson(json); + return NotificationPayloadEntitySample.fromJson(json); case NotificationType.unknown: - return const NotificationPayloadModelUnknown(); + return const NotificationPayloadEntityUnknown(); } } } diff --git a/lib/common/data/entity/user_entity.dart b/lib/common/data/entity/user_entity.dart new file mode 100644 index 0000000..109265c --- /dev/null +++ b/lib/common/data/entity/user_entity.dart @@ -0,0 +1,19 @@ +import 'package:flutter_app/common/data/enum/user_role.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user_entity.freezed.dart'; +part 'user_entity.g.dart'; + +@freezed +abstract class UserEntity with _$UserEntity { + const factory UserEntity({ + required String id, + required UserRole role, + required String? email, + required String? displayName, + required String? imageUrl, + required String? referredId, + }) = _UserEntity; + + factory UserEntity.fromJson(Map json) => _$UserEntityFromJson(json); +} diff --git a/lib/common/data/model/user_model.dart b/lib/common/data/model/user_model.dart deleted file mode 100644 index 4ccec67..0000000 --- a/lib/common/data/model/user_model.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter_app/common/data/dto/user_response_dto.dart'; -import 'package:flutter_app/common/data/enum/user_role.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'user_model.freezed.dart'; -part 'user_model.g.dart'; - -@freezed -abstract class UserModel with _$UserModel { - const factory UserModel({ - required String id, - required UserRole role, - required String? email, - required String? displayName, - required String? imageUrl, - required String? referredId, - }) = _UserModel; - const UserModel._(); - - factory UserModel.fromJson(Map json) => _$UserModelFromJson(json); - - factory UserModel.fromAPI({required UserResponseDTO user}) { - return UserModel( - id: user.id, - role: user.role, - email: user.email, - displayName: user.displayName, - imageUrl: null, - referredId: user.referredId, - ); - } -} diff --git a/lib/common/extension/async_value.dart b/lib/common/extension/async_value.dart index 2efc898..d0ad327 100644 --- a/lib/common/extension/async_value.dart +++ b/lib/common/extension/async_value.dart @@ -3,7 +3,7 @@ import 'package:flutter_app/common/component/custom_app_bar.dart'; import 'package:flutter_app/common/component/custom_progress_indicator.dart'; import 'package:flutter_app/common/composition/placeholder/empty_placeholder_widget.dart'; import 'package:flutter_app/common/composition/placeholder/error_placeholder_widget.dart'; -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; import 'package:flutter_app/common/extension/dynamic.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; diff --git a/lib/common/extension/response.dart b/lib/common/extension/response.dart index 20994b5..9c83193 100644 --- a/lib/common/extension/response.dart +++ b/lib/common/extension/response.dart @@ -1,5 +1,5 @@ import 'package:dio/dio.dart'; -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; extension ResponseExtension on Response> { /// Tries to downcast `data` as `List`. If decoding fails, diff --git a/lib/common/provider/current_user_model_state.dart b/lib/common/provider/current_user_state.dart similarity index 59% rename from lib/common/provider/current_user_model_state.dart rename to lib/common/provider/current_user_state.dart index 0101ca0..0934e20 100644 --- a/lib/common/provider/current_user_model_state.dart +++ b/lib/common/provider/current_user_state.dart @@ -1,28 +1,28 @@ -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/usecase/user/get_database_user_use_case.dart'; import 'package:flutter_app/common/usecase/user/set_database_user_use_case.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_app/core/riverpod/state_handler.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -part 'current_user_model_state.g.dart'; +part 'current_user_state.g.dart'; @Riverpod(keepAlive: true) -class CurrentUserModelState extends _$CurrentUserModelState with NullableStateHandler { +class CurrentUserState extends _$CurrentUserState with NullableStateHandler { @override - FutureOr build() async { + FutureOr build() async { return await _getUserFromDatabase(); } - Future updateCurrentUser(UserModel? user) async { - Flogger.d('[CurrentUserModelState] Going to set user $user'); + Future updateCurrentUser(UserEntity? user) async { + Flogger.d('[CurrentUserEntityState] Going to set user $user'); await ref.read(setDatabaseUserUseCaseProvider(user: user).future); setStateData(user); } - Future _getUserFromDatabase() async { + Future _getUserFromDatabase() async { return await ref.read(getDatabaseUserUseCaseProvider.future); } } diff --git a/lib/common/provider/firebase_messaging_service.dart b/lib/common/provider/firebase_messaging_service.dart index 582c57d..983f3ea 100644 --- a/lib/common/provider/firebase_messaging_service.dart +++ b/lib/common/provider/firebase_messaging_service.dart @@ -1,8 +1,8 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter_app/app/configuration/configuration.dart'; import 'package:flutter_app/app/setup/app_platform.dart'; -import 'package:flutter_app/common/data/model/notification_payload_model.dart'; -import 'package:flutter_app/common/provider/current_user_model_state.dart'; +import 'package:flutter_app/common/data/entity/notification_payload_entity.dart'; +import 'package:flutter_app/common/provider/current_user_state.dart'; import 'package:flutter_app/common/provider/notifications_service.dart'; import 'package:flutter_app/common/usecase/create_device_token_use_case.dart'; import 'package:flutter_app/core/analytics/crashlytics_manager.dart'; @@ -16,7 +16,7 @@ class FirebaseMessagingService extends _$FirebaseMessagingService { @pragma('vm:entry-point') static Future firebaseNotificationDisplayBgHandler(RemoteMessage message) async { Flogger.d('[Firebase Messaging] Display notification with payload: ${message.data}'); - await NotificationsService.showNotification(NotificationPayloadModel.fromJson(message.data)); + await NotificationsService.showNotification(NotificationPayloadEntity.fromJson(message.data)); } @pragma('vm:entry-point') @@ -45,7 +45,7 @@ class FirebaseMessagingService extends _$FirebaseMessagingService { } try { - if (await ref.read(currentUserModelStateProvider.future) != null) { + if (await ref.read(currentUserStateProvider.future) != null) { await ref.read(createDeviceTokenUseCaseProvider(deviceToken: fcmToken.toString()).future); } } on Exception catch (e, st) { diff --git a/lib/common/provider/notifications_service.dart b/lib/common/provider/notifications_service.dart index 8c02cd1..94411f5 100644 --- a/lib/common/provider/notifications_service.dart +++ b/lib/common/provider/notifications_service.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter_app/common/data/model/notification_payload_model.dart'; +import 'package:flutter_app/common/data/entity/notification_payload_entity.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -52,13 +52,13 @@ class NotificationsService extends _$NotificationsService { _tryOpeningNotificationFromPayload(notificationResponse.payload); } - static void handleNotificationOpen(NotificationPayloadModel notificationModel) { - switch (notificationModel) { - case NotificationPayloadModelSample(): + static void handleNotificationOpen(NotificationPayloadEntity notification) { + switch (notification) { + case NotificationPayloadEntitySample(): Flogger.d('[Notifications] Handle open of Sample notification'); // TODO(HELU): [Notifications] Handle Notification open action here - case NotificationPayloadModelUnknown(): + case NotificationPayloadEntityUnknown(): // Do nothing } } @@ -73,8 +73,8 @@ class NotificationsService extends _$NotificationsService { await _tryOpeningNotificationFromPayload(notificationAppLaunchDetails?.notificationResponse?.payload); } - static Future showNotification(NotificationPayloadModel notification) async { - if (notification is NotificationPayloadModelUnknown) return; + static Future showNotification(NotificationPayloadEntity notification) async { + if (notification is NotificationPayloadEntityUnknown) return; Flogger.i('[Notifications] New local notification to display: $notification'); await _flutterLocalNotifications.cancelAll(); @@ -93,7 +93,7 @@ class NotificationsService extends _$NotificationsService { } try { - handleNotificationOpen(NotificationPayloadModel.fromJson(jsonDecode(payload) as Map)); + handleNotificationOpen(NotificationPayloadEntity.fromJson(jsonDecode(payload) as Map)); return Future.value(true); } on Exception catch (e) { Flogger.e('[Notifications] Could not parse payload from notification: $payload with error $e'); @@ -107,7 +107,7 @@ class NotificationsService extends _$NotificationsService { } try { - handleNotificationOpen(NotificationPayloadModel.fromJson(message.data)); + handleNotificationOpen(NotificationPayloadEntity.fromJson(message.data)); return Future.value(true); } on Exception catch (e) { Flogger.e('[Notifications] Could not parse payload from notification: ${message.data} with error $e'); diff --git a/lib/common/usecase/authentication/sign_in_anonymously_use_case.dart b/lib/common/usecase/authentication/sign_in_anonymously_use_case.dart index e3bf828..f3cf90c 100644 --- a/lib/common/usecase/authentication/sign_in_anonymously_use_case.dart +++ b/lib/common/usecase/authentication/sign_in_anonymously_use_case.dart @@ -1,5 +1,5 @@ import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_completion_use_case.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -8,7 +8,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'sign_in_anonymously_use_case.g.dart'; @riverpod -Future signInAnonymouslyUseCase(Ref ref) async { +Future signInAnonymouslyUseCase(Ref ref) async { Flogger.d('[Authentication] Going to sign in user anonymously'); await FirebaseAuth.instance.signInAnonymously(); diff --git a/lib/common/usecase/authentication/sign_in_completion_use_case.dart b/lib/common/usecase/authentication/sign_in_completion_use_case.dart index 47de897..c782576 100644 --- a/lib/common/usecase/authentication/sign_in_completion_use_case.dart +++ b/lib/common/usecase/authentication/sign_in_completion_use_case.dart @@ -1,6 +1,6 @@ +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/data/enum/user_role.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; -import 'package:flutter_app/common/provider/current_user_model_state.dart'; +import 'package:flutter_app/common/provider/current_user_state.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -8,17 +8,17 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'sign_in_completion_use_case.g.dart'; @riverpod -Future signInCompletionUseCase(Ref ref) async { +Future signInCompletionUseCase(Ref ref) async { Flogger.d('[Authentication] Going to sign in user on BE'); /* final dio = ref.read(dioProvider); final response = await dio.post('v1/sign-in'); final userResponse = UserResponseDTO.fromJson(response.data); - final user = UserModel.fromAPI(user: userResponse); + final user = UserEntity.fromAPI(user: userResponse); */ // TODO(HELU): Remove this line and uncomment the above lines - const user = UserModel( + const user = UserEntity( id: '1', email: 'john.doe@example.com', displayName: 'John Doe', @@ -29,7 +29,7 @@ Future signInCompletionUseCase(Ref ref) async { Flogger.d('[Authentication] Received new user from BE $user'); - await ref.read(currentUserModelStateProvider.notifier).updateCurrentUser(user); + await ref.read(currentUserStateProvider.notifier).updateCurrentUser(user); Flogger.d('[Authentication] Current user updated'); diff --git a/lib/common/usecase/authentication/sign_in_with_apple_use_case.dart b/lib/common/usecase/authentication/sign_in_with_apple_use_case.dart index ae0041a..da6c411 100644 --- a/lib/common/usecase/authentication/sign_in_with_apple_use_case.dart +++ b/lib/common/usecase/authentication/sign_in_with_apple_use_case.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:crypto/crypto.dart'; import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_with_auth_credential_use_case.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -12,7 +12,7 @@ import 'package:sign_in_with_apple/sign_in_with_apple.dart'; part 'sign_in_with_apple_use_case.g.dart'; @riverpod -Future signInWithAppleUseCase(Ref ref) async { +Future signInWithAppleUseCase(Ref ref) async { Flogger.d('[Authentication] Sign in with Apple started'); // To prevent replay attacks with the credential returned from Apple, we include a nonce in the credential request. diff --git a/lib/common/usecase/authentication/sign_in_with_auth_credential_use_case.dart b/lib/common/usecase/authentication/sign_in_with_auth_credential_use_case.dart index d5ac5ed..49c1f62 100644 --- a/lib/common/usecase/authentication/sign_in_with_auth_credential_use_case.dart +++ b/lib/common/usecase/authentication/sign_in_with_auth_credential_use_case.dart @@ -1,6 +1,6 @@ import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_completion_use_case.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -9,7 +9,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'sign_in_with_auth_credential_use_case.g.dart'; @riverpod -FutureOr signInWithAuthCredentialUseCase( +FutureOr signInWithAuthCredentialUseCase( Ref ref, { required AuthCredential credential, }) async { diff --git a/lib/common/usecase/authentication/sign_in_with_google_use_case.dart b/lib/common/usecase/authentication/sign_in_with_google_use_case.dart index 4884f2e..2904883 100644 --- a/lib/common/usecase/authentication/sign_in_with_google_use_case.dart +++ b/lib/common/usecase/authentication/sign_in_with_google_use_case.dart @@ -1,5 +1,5 @@ import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_with_auth_credential_use_case.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -13,7 +13,7 @@ const List _scopes = [ ]; @riverpod -Future signInWithGoogleUseCase(Ref ref) async { +Future signInWithGoogleUseCase(Ref ref) async { Flogger.d('[Authentication] Sign in with Google started'); final googleSignIn = GoogleSignIn.instance; diff --git a/lib/common/usecase/authentication/sign_out_use_case.dart b/lib/common/usecase/authentication/sign_out_use_case.dart index 1be59e6..34307c7 100644 --- a/lib/common/usecase/authentication/sign_out_use_case.dart +++ b/lib/common/usecase/authentication/sign_out_use_case.dart @@ -1,6 +1,6 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_app/common/provider/current_user_model_state.dart'; +import 'package:flutter_app/common/provider/current_user_state.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_sign_in/google_sign_in.dart'; @@ -25,7 +25,7 @@ Future signOutUseCase(Ref ref) async { await FirebaseAuth.instance.signOut(); // Title: Clear current user state - await ref.read(currentUserModelStateProvider.notifier).updateCurrentUser(null); + await ref.read(currentUserStateProvider.notifier).updateCurrentUser(null); Flogger.d('[Authentication] Sign out complete'); } diff --git a/lib/common/usecase/user/get_current_user_use_case.dart b/lib/common/usecase/user/get_current_user_use_case.dart index a89ba48..b347fc4 100644 --- a/lib/common/usecase/user/get_current_user_use_case.dart +++ b/lib/common/usecase/user/get_current_user_use_case.dart @@ -1,5 +1,5 @@ import 'package:flutter_app/common/data/dto/user_response_dto.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/core/network/dio_provider.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -7,9 +7,9 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'get_current_user_use_case.g.dart'; @riverpod -Future getCurrentUserUseCase(Ref ref) async { +Future getCurrentUserUseCase(Ref ref) async { final dio = ref.read(dioProvider); final response = await dio.get>('/v1/users/me'); - return UserModel.fromAPI(user: UserResponseDTO.fromJson(response.data!)); + return UserResponseDTO.fromJson(response.data!).toEntity(); } diff --git a/lib/common/usecase/user/get_database_user_use_case.dart b/lib/common/usecase/user/get_database_user_use_case.dart index dc67515..c724eca 100644 --- a/lib/common/usecase/user/get_database_user_use_case.dart +++ b/lib/common/usecase/user/get_database_user_use_case.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/core/database/shared_preferences.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -9,16 +9,16 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'get_database_user_use_case.g.dart'; @riverpod -Future getDatabaseUserUseCase(Ref ref) async { +Future getDatabaseUserUseCase(Ref ref) async { final preferences = await ref.read(sharedPreferencesProvider.future); final currentUserData = preferences.getString(PreferencesKeys.currentUserData.value); if (currentUserData != null) { try { - return UserModel.fromJson(jsonDecode(currentUserData) as Map); + return UserEntity.fromJson(jsonDecode(currentUserData) as Map); // ignore: avoid_catches_without_on_clauses } catch (e) { - Flogger.e('[CurrentUserModelState] Error while parsing user data: $e'); + Flogger.e('[CurrentUserEntityState] Error while parsing user data: $e'); return null; } } else { diff --git a/lib/common/usecase/user/set_database_user_use_case.dart b/lib/common/usecase/user/set_database_user_use_case.dart index eca26e2..f633be4 100644 --- a/lib/common/usecase/user/set_database_user_use_case.dart +++ b/lib/common/usecase/user/set_database_user_use_case.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/core/database/shared_preferences.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -10,7 +10,7 @@ part 'set_database_user_use_case.g.dart'; @riverpod Future setDatabaseUserUseCase( Ref ref, { - required UserModel? user, + required UserEntity? user, }) async { final preferences = await ref.read(sharedPreferencesProvider.future); diff --git a/lib/common/validator/controller/text_validator_controller_general.dart b/lib/common/validator/controller/text_validator_controller_general.dart index 3d2fbfa..b864f29 100644 --- a/lib/common/validator/controller/text_validator_controller_general.dart +++ b/lib/common/validator/controller/text_validator_controller_general.dart @@ -1,5 +1,5 @@ import 'package:flutter/widgets.dart'; -import 'package:flutter_app/common/data/model/exception/validator_exception.dart'; +import 'package:flutter_app/common/data/entity/exception/validator_exception.dart'; import 'package:flutter_app/common/validator/text_field_validator_state.dart'; import 'package:flutter_app/common/validator/text_validator_controller.dart'; diff --git a/lib/common/validator/text_field_validator_state.dart b/lib/common/validator/text_field_validator_state.dart index 6e02c95..fa2da15 100644 --- a/lib/common/validator/text_field_validator_state.dart +++ b/lib/common/validator/text_field_validator_state.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_app/common/data/model/exception/validator_exception.dart'; +import 'package:flutter_app/common/data/entity/exception/validator_exception.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'text_field_validator_state.freezed.dart'; diff --git a/lib/core/analytics/analytics_manager.dart b/lib/core/analytics/analytics_manager.dart index 2e52165..c7c0cd3 100644 --- a/lib/core/analytics/analytics_manager.dart +++ b/lib/core/analytics/analytics_manager.dart @@ -1,6 +1,6 @@ import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/core/analytics/analytics_event.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -8,7 +8,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'analytics_manager.g.dart'; @riverpod -Future analyticsManagerUpdateUserInfo(Ref ref, {required UserModel? user}) async { +Future analyticsManagerUpdateUserInfo(Ref ref, {required UserEntity? user}) async { await FirebaseAnalytics.instance.setUserId(id: user?.id); await FirebaseAnalytics.instance.setUserProperty(name: 'display_name', value: user?.displayName); } diff --git a/lib/features/authentication/authentication_state.dart b/lib/features/authentication/authentication_state.dart index 14ca836..0af3230 100644 --- a/lib/features/authentication/authentication_state.dart +++ b/lib/features/authentication/authentication_state.dart @@ -1,5 +1,5 @@ -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; -import 'package:flutter_app/common/data/model/user_model.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; +import 'package:flutter_app/common/data/entity/user_entity.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_anonymously_use_case.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_with_apple_use_case.dart'; import 'package:flutter_app/common/usecase/authentication/sign_in_with_google_use_case.dart'; @@ -40,7 +40,7 @@ class AuthenticationStateNotifier extends _$AuthenticationStateNotifier with Aut await _signInWithProvider(signInWithAppleUseCaseProvider); } - Future _signInWithProvider(AutoDisposeFutureProvider provider) async { + Future _signInWithProvider(AutoDisposeFutureProvider provider) async { setStateData(currentData?.copyWith(isSigningIn: true)); try { diff --git a/lib/features/debug_tools/page/colors/debug_tools_colors_page_content.dart b/lib/features/debug_tools/page/colors/debug_tools_colors_page_content.dart index 5ba4052..dcb11a4 100644 --- a/lib/features/debug_tools/page/colors/debug_tools_colors_page_content.dart +++ b/lib/features/debug_tools/page/colors/debug_tools_colors_page_content.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_app/common/component/custom_text/custom_text.dart'; import 'package:flutter_app/common/extension/build_context.dart'; -import 'package:flutter_app/features/debug_tools/page/colors/model/debug_tools_color.dart'; +import 'package:flutter_app/features/debug_tools/page/colors/entity/debug_tools_color.dart'; class DebugToolsColorsPageContent extends StatelessWidget { const DebugToolsColorsPageContent({super.key}); diff --git a/lib/features/debug_tools/page/colors/model/debug_tools_color.dart b/lib/features/debug_tools/page/colors/entity/debug_tools_color.dart similarity index 100% rename from lib/features/debug_tools/page/colors/model/debug_tools_color.dart rename to lib/features/debug_tools/page/colors/entity/debug_tools_color.dart diff --git a/lib/features/debug_tools/page/text_styles/debug_tools_text_styles_page_content.dart b/lib/features/debug_tools/page/text_styles/debug_tools_text_styles_page_content.dart index 16b151c..15a3551 100644 --- a/lib/features/debug_tools/page/text_styles/debug_tools_text_styles_page_content.dart +++ b/lib/features/debug_tools/page/text_styles/debug_tools_text_styles_page_content.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_app/common/extension/build_context.dart'; -import 'package:flutter_app/features/debug_tools/page/text_styles/model/debug_tools_text_style.dart'; +import 'package:flutter_app/features/debug_tools/page/text_styles/entity/debug_tools_text_style.dart'; class DebugToolsTextStylesPageContent extends StatelessWidget { const DebugToolsTextStylesPageContent({super.key}); diff --git a/lib/features/debug_tools/page/text_styles/model/debug_tools_text_style.dart b/lib/features/debug_tools/page/text_styles/entity/debug_tools_text_style.dart similarity index 100% rename from lib/features/debug_tools/page/text_styles/model/debug_tools_text_style.dart rename to lib/features/debug_tools/page/text_styles/entity/debug_tools_text_style.dart diff --git a/lib/features/landing/landing_page.dart b/lib/features/landing/landing_page.dart index 1530228..ba42a24 100644 --- a/lib/features/landing/landing_page.dart +++ b/lib/features/landing/landing_page.dart @@ -5,7 +5,7 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_app/app/navigation/app_router.dart'; import 'package:flutter_app/app/setup/app_platform.dart'; -import 'package:flutter_app/common/provider/current_user_model_state.dart'; +import 'package:flutter_app/common/provider/current_user_state.dart'; import 'package:flutter_app/common/provider/firebase_remote_config_service.dart'; import 'package:flutter_app/core/flogger.dart'; import 'package:flutter_app/features/landing/force_update_page_content.dart'; @@ -49,7 +49,7 @@ class _LandingPageState extends ConsumerState { final forceUpdateRequired = await _handleForceUpdate(); if (forceUpdateRequired) return; - final currentUser = await ref.read(currentUserModelStateProvider.future); + final currentUser = await ref.read(currentUserStateProvider.future); if (mounted) { FlutterNativeSplash.remove(); diff --git a/lib/features/profile/profile_state.dart b/lib/features/profile/profile_state.dart index b22c074..b62c1b8 100644 --- a/lib/features/profile/profile_state.dart +++ b/lib/features/profile/profile_state.dart @@ -1,5 +1,5 @@ -import 'package:flutter_app/common/data/model/exception/custom_exception.dart'; -import 'package:flutter_app/common/provider/current_user_model_state.dart'; +import 'package:flutter_app/common/data/entity/exception/custom_exception.dart'; +import 'package:flutter_app/common/provider/current_user_state.dart'; import 'package:flutter_app/common/usecase/authentication/sign_out_use_case.dart'; import 'package:flutter_app/common/usecase/get_random_image_url_use_case.dart'; import 'package:flutter_app/core/flogger.dart'; @@ -24,7 +24,7 @@ abstract class ProfileState with _$ProfileState { class ProfileStateNotifier extends _$ProfileStateNotifier with AutoDisposeStateHandler { @override FutureOr build() async { - final currentUser = await ref.read(currentUserModelStateProvider.future); + final currentUser = await ref.read(currentUserStateProvider.future); final imageUrl = ref.read(getRandomImageUrlUseCaseProvider(width: 120, height: 120)); await Future.delayed(const Duration(seconds: 2)); diff --git a/project_setup/lib/configuration.dart b/project_setup/lib/configuration.dart index e841fa8..7951bea 100644 --- a/project_setup/lib/configuration.dart +++ b/project_setup/lib/configuration.dart @@ -1,5 +1,5 @@ -import 'package:project_setup/core/model/app_icon_variant_model.dart'; -import 'package:project_setup/core/model/setup_platform.dart'; +import 'package:project_setup/core/entity/app_icon_variant_model.dart'; +import 'package:project_setup/core/entity/setup_platform.dart'; class Configuration { // Title: App Icon diff --git a/project_setup/lib/core/app_icon_generator.dart b/project_setup/lib/core/app_icon_generator.dart index 6c573db..54052e1 100644 --- a/project_setup/lib/core/app_icon_generator.dart +++ b/project_setup/lib/core/app_icon_generator.dart @@ -4,8 +4,8 @@ import 'dart:typed_data'; import 'package:image/image.dart'; import 'package:interact/interact.dart'; import 'package:project_setup/configuration.dart'; -import 'package:project_setup/core/model/app_icon_variant_model.dart'; -import 'package:project_setup/core/model/setup_platform.dart'; +import 'package:project_setup/core/entity/app_icon_variant_model.dart'; +import 'package:project_setup/core/entity/setup_platform.dart'; import 'package:project_setup/core/util/print.dart'; import 'package:project_setup/core/util/util.dart'; diff --git a/project_setup/lib/core/model/app_icon_variant_model.dart b/project_setup/lib/core/model/app_icon_variant_model.dart index d927562..2804c60 100644 --- a/project_setup/lib/core/model/app_icon_variant_model.dart +++ b/project_setup/lib/core/model/app_icon_variant_model.dart @@ -1,4 +1,4 @@ -import 'package:project_setup/core/model/setup_platform.dart'; +import 'package:project_setup/core/entity/setup_platform.dart'; class AppIconVariantModel { const AppIconVariantModel({ diff --git a/project_setup/lib/core/splash_screen_generator.dart b/project_setup/lib/core/splash_screen_generator.dart index 0120534..7f32dca 100644 --- a/project_setup/lib/core/splash_screen_generator.dart +++ b/project_setup/lib/core/splash_screen_generator.dart @@ -4,7 +4,7 @@ import 'dart:typed_data'; import 'package:image/image.dart'; import 'package:interact/interact.dart'; import 'package:project_setup/configuration.dart'; -import 'package:project_setup/core/model/setup_platform.dart'; +import 'package:project_setup/core/entity/setup_platform.dart'; import 'package:project_setup/core/util/print.dart'; import 'package:project_setup/core/util/util.dart';