Files
smooth-app/packages/smooth_app/lib/database/local_database.dart
monsieurtanuki f98bce1977 feat: 4941 - refresh products when switching app language (#5016)
New file:
* `background_task_language_refresh.dart`: Background task about downloading products to translate.

Impacted files:
* `background_task_manager.dart`: minor refactoring
* `dao_product.dart`: new method `getTopProductsToTranslate`
* `local_database.dart`: minor refactoring
* `offline_tasks_page.dart`: minor refactoring
* `operation_type.dart`: new operation type `languageRefresh`
* `product_refresher.dart`: minor refactoring
* `up_to_date_mixin.dart`: minor refactoring
* `up_to_date_product_provider.dart`: minor refactoring
* `user_preferences_language_selector.dart`: now calling new task `BackgroundTaskLanguageRefresh` when changing language
2024-02-24 11:08:58 +01:00

112 lines
4.0 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:smooth_app/background/background_task_manager.dart';
import 'package:smooth_app/data_models/up_to_date_product_list_provider.dart';
import 'package:smooth_app/data_models/up_to_date_product_provider.dart';
import 'package:smooth_app/database/abstract_dao.dart';
import 'package:smooth_app/database/dao_hive_product.dart';
import 'package:smooth_app/database/dao_instant_string.dart';
import 'package:smooth_app/database/dao_int.dart';
import 'package:smooth_app/database/dao_product.dart';
import 'package:smooth_app/database/dao_product_last_access.dart';
import 'package:smooth_app/database/dao_product_list.dart';
import 'package:smooth_app/database/dao_string.dart';
import 'package:smooth_app/database/dao_string_list.dart';
import 'package:smooth_app/database/dao_string_list_map.dart';
import 'package:smooth_app/database/dao_transient_operation.dart';
import 'package:smooth_app/database/dao_work_barcode.dart';
import 'package:sqflite/sqflite.dart';
class LocalDatabase extends ChangeNotifier {
LocalDatabase._(final Database database) : _database = database {
_upToDateProductProvider = UpToDateProductProvider(this);
_upToDateProductListProvider = UpToDateProductListProvider(this);
}
final Database _database;
late final UpToDateProductProvider _upToDateProductProvider;
late final UpToDateProductListProvider _upToDateProductListProvider;
Database get database => _database;
UpToDateProductProvider get upToDate => _upToDateProductProvider;
UpToDateProductListProvider get upToDateProductList =>
_upToDateProductListProvider;
@override
void notifyListeners() {
BackgroundTaskManager.getInstance(this).run();
super.notifyListeners();
}
/// Returns all the pending background task ids.
///
/// Ugly solution to be able to mock hive data.
List<String> getAllTaskIds() =>
DaoStringList(this).getAll(DaoStringList.keyTasks);
static Future<LocalDatabase> getLocalDatabase() async {
// sql from there
final String databasesRootPath;
if (defaultTargetPlatform == TargetPlatform.iOS) {
// as suggested in https://pub.dev/documentation/sqflite/latest/sqflite/getDatabasesPath.html
final Directory directory = await getLibraryDirectory();
databasesRootPath = directory.path;
} else {
databasesRootPath = await getDatabasesPath();
}
final String databasePath = join(databasesRootPath, 'smoothie.db');
final Database database = await openDatabase(
databasePath,
version: 5,
singleInstance: true,
onUpgrade: _onUpgrade,
);
final LocalDatabase localDatabase = LocalDatabase._(database);
// only hive from there
await Hive.initFlutter();
final List<AbstractDao> daos = <AbstractDao>[
DaoHiveProduct(localDatabase),
DaoProductList(localDatabase),
DaoStringList(localDatabase),
DaoString(localDatabase),
DaoInstantString(localDatabase),
DaoInt(localDatabase),
DaoStringListMap(localDatabase),
DaoTransientOperation(localDatabase),
];
for (final AbstractDao dao in daos) {
dao.registerAdapter();
}
for (final AbstractDao dao in daos) {
await dao.init();
}
// Migrations here
// (no migration for the moment)
return localDatabase;
}
static int nowInMillis() => DateTime.now().millisecondsSinceEpoch;
/// we don't use onCreate and onUpgrade, we use only onUpgrade instead.
/// checked: from scratch, onUpgrade is called with oldVersion = 0.
static FutureOr<void> _onUpgrade(
final Database db,
final int oldVersion,
final int newVersion,
) async {
await DaoProduct.onUpgrade(db, oldVersion, newVersion);
await DaoWorkBarcode.onUpgrade(db, oldVersion, newVersion);
await DaoProductLastAccess.onUpgrade(db, oldVersion, newVersion);
}
}