Skip to content

Commit

Permalink
Extract single file many responsibility to it single responsibility &…
Browse files Browse the repository at this point in the history
… dedicated class
  • Loading branch information
theachoem committed Mar 3, 2025
1 parent b6bcbca commit 82666af
Show file tree
Hide file tree
Showing 85 changed files with 565 additions and 505 deletions.
2 changes: 1 addition & 1 deletion lib/app_theme.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:provider/provider.dart';
import 'package:storypad/core/constants/app_constants.dart';
import 'package:storypad/core/extensions/color_scheme_extension.dart';
import 'package:storypad/providers/theme_provider.dart';
import 'package:storypad/routes/utils/animated_page_route.dart';
import 'package:storypad/core/helpers/animated_route_helper.dart';

class AppTheme extends StatelessWidget {
const AppTheme({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,12 @@ StoryDbModel _objectToModel(Map<String, dynamic> map) {
createdAt: object.createdAt,
tags: object.tags,
assets: object.assets,
preferences: StoryDbConstructorService.decodePreferences(object),
preferences: decodePreferences(object),
rawChanges: object.changes,
movedToBinAt: object.movedToBinAt,
lastSavedDeviceId: object.lastSavedDeviceId,
latestChange:
object.changes.isNotEmpty ? StoryDbConstructorService.rawChangesToChanges([object.changes.last]).first : null,
allChanges: options?['all_changes'] == true ? StoryDbConstructorService.rawChangesToChanges(object.changes) : null,
latestChange: object.changes.isNotEmpty ? StoryRawToChangesService.call([object.changes.last]).first : null,
allChanges: options?['all_changes'] == true ? StoryRawToChangesService.call(object.changes) : null,
);
}

Expand Down Expand Up @@ -87,8 +86,24 @@ StoryObjectBox _modelToObject(Map<String, dynamic> map) {
updatedAt: story.updatedAt,
movedToBinAt: story.movedToBinAt,
metadata: story.latestChange?.safeMetadata,
changes: StoryDbConstructorService.changesToRawChanges(story),
changes: StoryChangesToRawService.call(story),
permanentlyDeletedAt: null,
preferences: story.preferences != null ? jsonEncode(story.preferences?.toJson()) : null,
);
}

StoryPreferencesDbModel decodePreferences(StoryObjectBox object) {
StoryPreferencesDbModel? preferences;

if (object.preferences != null) {
try {
preferences = StoryPreferencesDbModel.fromJson(jsonDecode(object.preferences!));
} catch (e) {
debugPrint(".decodePreferences error: $e");
}
}

preferences ??= StoryPreferencesDbModel.create();
if (object.showDayCount != null) preferences = preferences.copyWith(showDayCount: object.showDayCount);
return preferences;
}
4 changes: 3 additions & 1 deletion lib/core/databases/adapters/objectbox/stories_box.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import 'package:storypad/core/constants/app_constants.dart';
import 'package:storypad/core/databases/adapters/objectbox/base_box.dart';
import 'package:storypad/core/databases/adapters/objectbox/entities.dart';
import 'package:storypad/core/databases/models/story_db_model.dart';
import 'package:storypad/core/services/story_db_constructor_service.dart';
import 'package:storypad/core/databases/models/story_preferences_db_model.dart';
import 'package:storypad/core/services/stories/story_raw_to_changes_servce.dart';
import 'package:storypad/core/services/stories/story_changes_to_raw_service.dart';
import 'package:storypad/core/types/path_type.dart';
import 'package:storypad/objectbox.g.dart';

Expand Down
4 changes: 2 additions & 2 deletions lib/core/databases/legacy/storypad_legacy_database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:storypad/core/databases/adapters/objectbox/preferences_box.dart'
import 'package:storypad/core/databases/legacy/storypad_legacy_story_model.dart';
import 'package:storypad/core/databases/models/story_content_db_model.dart';
import 'package:storypad/core/databases/models/story_db_model.dart';
import 'package:storypad/core/services/quill_service.dart';
import 'package:storypad/core/services/quill/quill_root_to_plain_text_service.dart';
import 'package:storypad/core/types/path_type.dart';
import 'package:sqflite/sqflite.dart' as sqlite;

Expand Down Expand Up @@ -83,7 +83,7 @@ class StorypadLegacyDatabase {

final content = StoryContentDbModel.create(createdAt: storypadStory.createOn).copyWith(
title: storypadStory.title,
plainText: document != null ? QuillService.toPlainText(document.root) : null,
plainText: document != null ? QuillRootToPlainTextService.call(document.root) : null,
pages: document != null ? [document.toDelta().toJson()] : [[]],
);

Expand Down
20 changes: 12 additions & 8 deletions lib/core/databases/models/story_db_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import 'package:storypad/core/databases/adapters/objectbox/stories_box.dart';
import 'package:storypad/core/databases/models/base_db_model.dart';
import 'package:storypad/core/databases/models/story_content_db_model.dart';
import 'package:storypad/core/databases/models/story_preferences_db_model.dart';
import 'package:storypad/core/services/story_db_constructor_service.dart';
import 'package:storypad/core/services/story_helper.dart';
import 'package:storypad/core/services/stories/story_content_builder_service.dart';
import 'package:storypad/core/services/stories/story_raw_to_changes_servce.dart';
import 'package:storypad/core/types/path_type.dart';
import 'package:storypad/views/stories/edit/edit_story_view_model.dart';
import 'package:storypad/views/stories/show/show_story_view_model.dart';
Expand Down Expand Up @@ -221,6 +221,14 @@ class StoryDbModel extends BaseDbModel {
));
}

Future<StoryDbModel> loadAllChanges() async {
if (rawChanges != null) {
List<StoryContentDbModel> changes = await compute(StoryRawToChangesService.call, rawChanges!);
return copyWith(allChanges: changes);
}
return copyWith();
}

StoryDbModel copyWithPreferences({
bool? showDayCount,
String? starIcon,
Expand Down Expand Up @@ -273,7 +281,7 @@ class StoryDbModel extends BaseDbModel {
}

static Future<StoryDbModel> fromShowPage(ShowStoryViewModel viewModel) async {
StoryContentDbModel content = await StoryHelper.buildContent(
StoryContentDbModel content = await StoryContentBuilderService.call(
viewModel.draftContent!,
viewModel.quillControllers,
);
Expand All @@ -285,7 +293,7 @@ class StoryDbModel extends BaseDbModel {
}

static Future<StoryDbModel> fromDetailPage(EditStoryViewModel viewModel) async {
StoryContentDbModel content = await StoryHelper.buildContent(
StoryContentDbModel content = await StoryContentBuilderService.call(
viewModel.draftContent!,
viewModel.quillControllers,
);
Expand Down Expand Up @@ -329,10 +337,6 @@ class StoryDbModel extends BaseDbModel {
return initialStory;
}

Future<StoryDbModel> loadAllChanges() async {
return StoryDbConstructorService.loadAllChanges(this);
}

factory StoryDbModel.fromJson(Map<String, dynamic> json) => _$StoryDbModelFromJson(json);

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:animations/animations.dart';
import 'package:flutter/material.dart';
export 'package:animations/src/shared_axis_transition.dart';

class AnimatedPageRoute {
class AnimatedRouteHelper {
static Route<T> fadeThrough<T>({
required WidgetBuilder builder,
RouteSettings? settings,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import 'dart:ui';
import 'package:intl/intl.dart';

class DateFormatService {
class DateFormatHelper {
static String E(DateTime date, Locale locale) {
return DateFormat.E(locale.toLanguageTag()).format(date);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/core/services/analytics/analytics_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:storypad/core/databases/models/tag_db_model.dart';
import 'package:storypad/core/objects/backup_file_object.dart';
import 'package:storypad/core/objects/cloud_file_object.dart';
import 'package:storypad/core/services/analytics/base_analytics_service.dart';
import 'package:storypad/routes/base_route.dart';
import 'package:storypad/widgets/view/base_route.dart';

// Logging analytics events without user-identifiable information.
class AnalyticsService extends BaseAnalyticsService {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
// ignore_for_file: library_private_types_in_public_api
import 'dart:isolate';
import 'package:flutter/material.dart';
import 'package:storypad/core/databases/models/asset_db_model.dart';
import 'package:storypad/core/databases/models/collection_db_model.dart';
import 'package:storypad/core/services/backup_sources/base_backup_source.dart';

part of '../backup_provider.dart';
class AssetBackupService {
final void Function() notifyListeners;
final BaseBackupSource source;

AssetBackupService({
required this.notifyListeners,
required this.source,
});

mixin _AssetBackupConcern on _BaseBackupProvider {
CollectionDbModel<AssetDbModel>? assets;
List<AssetDbModel>? localAssets;
ValueNotifier<int?> loadingAssetIdNotifier = ValueNotifier(null);

Future<void> _loadAssets() async {
Future<void> loadAssets() async {
assets = await AssetDbModel.db.where();

final items = assets?.items ?? [];
Expand Down Expand Up @@ -40,7 +50,7 @@ mixin _AssetBackupConcern on _BaseBackupProvider {
}
}

await _loadAssets();
await loadAssets();
debugPrint('🚧 $runtimeType#uploadAssets -> Done with remain un-uploaded assets: ${localAssets?.length}');
notifyListeners();
}
Expand Down Expand Up @@ -91,9 +101,5 @@ mixin _AssetBackupConcern on _BaseBackupProvider {
return null;
}

@override
void dispose() {
loadingAssetIdNotifier.dispose();
super.dispose();
}
void dispose() => loadingAssetIdNotifier.dispose();
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
import 'dart:convert';
import 'dart:io' as io;
import 'package:flutter/foundation.dart';
import 'package:storypad/core/constants/app_constants.dart';
import 'package:storypad/core/databases/adapters/base_db_adapter.dart';
import 'package:storypad/core/databases/models/base_db_model.dart';
import 'package:storypad/core/databases/models/collection_db_model.dart';
import 'package:storypad/core/objects/backup_file_object.dart';
import 'package:storypad/core/objects/backup_object.dart';
import 'package:storypad/core/types/file_path_type.dart';

class BackupFileConstructor {
Future<BackupObject> constructBackup({
class BackupDatabasesToBackupObjectService {
static Future<BackupObject> call({
required List<BaseDbAdapter<BaseDbModel>> databases,
required DateTime lastUpdatedAt,
}) async {
Expand All @@ -27,26 +24,7 @@ class BackupFileConstructor {
);
}

Future<io.File> constructFile(
String cloudStorageId,
BackupObject backup,
) async {
io.Directory parent = io.Directory("${kSupportDirectory.path}/${FilePathType.backups.name}");

var file = io.File("${parent.path}/$cloudStorageId.json");
if (!file.existsSync()) {
await file.create(recursive: true);
debugPrint('BackupFileConstructor#constructFile createdFile: ${file.path.replaceAll(' ', '%20')}');
}

debugPrint('BackupFileConstructor#constructFile encodingJson');
String encodedJson = jsonEncode(backup.toContents());
debugPrint('BackupFileConstructor#constructFile encodedJson');

return file.writeAsString(encodedJson);
}

Future<Map<String, dynamic>> _constructTables(List<BaseDbAdapter> databases) async {
static Future<Map<String, dynamic>> _constructTables(List<BaseDbAdapter> databases) async {
Map<String, CollectionDbModel<BaseDbModel>> tables = {};

for (BaseDbAdapter db in databases) {
Expand Down
27 changes: 27 additions & 0 deletions lib/core/services/backup_sources/backup_to_file_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'dart:convert';
import 'dart:io' as io;
import 'package:flutter/foundation.dart';
import 'package:storypad/core/constants/app_constants.dart';
import 'package:storypad/core/objects/backup_object.dart';
import 'package:storypad/core/types/file_path_type.dart';

class BackupToFileService {
static Future<io.File> call(
String cloudStorageId,
BackupObject backup,
) async {
io.Directory parent = io.Directory("${kSupportDirectory.path}/${FilePathType.backups.name}");

var file = io.File("${parent.path}/$cloudStorageId.json");
if (!file.existsSync()) {
await file.create(recursive: true);
debugPrint('BackupFileConstructor#constructFile createdFile: ${file.path.replaceAll(' ', '%20')}');
}

debugPrint('BackupFileConstructor#constructFile encodingJson');
String encodedJson = jsonEncode(backup.toContents());
debugPrint('BackupFileConstructor#constructFile encodedJson');

return file.writeAsString(encodedJson);
}
}
7 changes: 4 additions & 3 deletions lib/core/services/backup_sources/base_backup_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import 'package:storypad/core/databases/models/tag_db_model.dart';
import 'package:storypad/core/objects/backup_object.dart';
import 'package:storypad/core/objects/cloud_file_list_object.dart';
import 'package:storypad/core/objects/cloud_file_object.dart';
import 'package:storypad/core/services/backup_sources/backup_file_constructor.dart';
import 'package:storypad/core/services/backup_sources/backup_databases_to_backup_object_service.dart';
import 'package:storypad/core/services/backup_sources/backup_to_file_service.dart';
import 'package:storypad/core/services/backup_sources/google_drive_backup_source.dart';

abstract class BaseBackupSource {
Expand Down Expand Up @@ -70,12 +71,12 @@ abstract class BaseBackupSource {
Future<CloudFileObject?> backup({
required DateTime lastDbUpdatedAt,
}) async {
BackupObject backup = await BackupFileConstructor().constructBackup(
BackupObject backup = await BackupDatabasesToBackupObjectService.call(
databases: databases,
lastUpdatedAt: lastDbUpdatedAt,
);

final io.File file = await BackupFileConstructor().constructFile(
final io.File file = await BackupToFileService.call(
cloudId,
backup,
);
Expand Down
40 changes: 40 additions & 0 deletions lib/core/services/backups/json_tables_to_model_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import 'package:storypad/core/databases/adapters/base_db_adapter.dart';
import 'package:storypad/core/databases/models/base_db_model.dart';
import 'package:storypad/core/services/backup_sources/base_backup_source.dart';

class JsonTablesToModelService {
// {
// "stories": [ story1, story2 ],
// "todos": [ todo1, todo2 ]
// }
static Map<String, List<BaseDbModel>> decode(
Map<String, dynamic> tables,
) {
Map<String, List<BaseDbModel>> maps = {};

for (BaseDbAdapter db in BaseBackupSource.databases) {
dynamic contents = tables[db.tableName];
if (contents is List) {
maps[db.tableName] = _decodeContents(contents, db);
}
}

return maps;
}

static List<T> _decodeContents<T extends BaseDbModel>(
List contents,
BaseDbAdapter<T> db,
) {
List<T> items = [];

for (dynamic json in contents) {
if (json is Map<String, dynamic>) {
T? item = db.modelFromJson(json);
items.add(item);
}
}

return items;
}
}
Loading

0 comments on commit 82666af

Please sign in to comment.