mirror of
https://github.com/kuhyx/todo-app.git
synced 2026-11-10 19:07:02 +01:00
Some checks are pending
Also bumps Flutter 3.47.3, flutter_secure_storage 11.1.0, idb_shim 2.9.9, sqflite_common_ffi 2.4.3, very_good_analysis 11 and mcp 2.2.0 so the freshness gate lets this through; v11 adds async_return_with_no_await, so the 18 flagged return sites now await explicitly. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwtowrowDXx6ccmWVPkCaF
68 lines
2.4 KiB
Dart
68 lines
2.4 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:crdt_sync/crdt_sync_io.dart';
|
|
import 'package:path/path.dart' as p;
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
|
import 'package:todo/data/legacy_sqlite_migration.dart';
|
|
import 'package:todo/data/note_repository.dart';
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
/// Opens the note store on a `dart:io` platform (Android).
|
|
///
|
|
/// Also performs the one-time, idempotent import of a pre-crdt_sync sqlite
|
|
/// database, guarded by a persisted flag. The legacy DB file is left untouched
|
|
/// as a safety net.
|
|
// coverage:ignore-start
|
|
// Resolves the real per-platform application-support directory, so it cannot
|
|
// run under test; [openRepositoryIn] holds all the logic and is covered.
|
|
Future<NoteRepository> openRepository() async {
|
|
final dir = await getApplicationSupportDirectory();
|
|
return await openRepositoryIn(dir.path);
|
|
}
|
|
// coverage:ignore-end
|
|
|
|
/// Opens the note store rooted at [dirPath].
|
|
///
|
|
/// Split out from [openRepository] so tests can drive the legacy-migration
|
|
/// paths against a temporary directory without going through `path_provider`.
|
|
Future<NoteRepository> openRepositoryIn(String dirPath) async {
|
|
// Keep the FFI initialisation for any non-Android io host that still reads a
|
|
// legacy DB (and for the test host, which is Linux).
|
|
if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) {
|
|
sqfliteFfiInit();
|
|
}
|
|
|
|
final dbPath = p.join(dirPath, 'todo.db');
|
|
final persistence = FileLogPersistence(
|
|
File(p.join(dirPath, NoteRepository.logFileName)),
|
|
);
|
|
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final migrated = prefs.getBool(NoteRepository.kMigrated) ?? false;
|
|
var nodeId = prefs.getString(NoteRepository.kNodeId) ?? '';
|
|
|
|
if (!migrated && LegacySqliteMigration.exists(dbPath)) {
|
|
final legacy = await LegacySqliteMigration.read(dbPath, nodeId);
|
|
nodeId = legacy.nodeId;
|
|
final repository = await NoteRepository.openWith(
|
|
persistence: persistence,
|
|
nodeId: nodeId,
|
|
);
|
|
await repository.seedFrom(legacy.log);
|
|
await prefs.setString(NoteRepository.kNodeId, nodeId);
|
|
await prefs.setBool(NoteRepository.kMigrated, true);
|
|
return repository;
|
|
}
|
|
|
|
if (nodeId.isEmpty) {
|
|
nodeId = const Uuid().v4();
|
|
await prefs.setString(NoteRepository.kNodeId, nodeId);
|
|
}
|
|
return await NoteRepository.openWith(
|
|
persistence: persistence,
|
|
nodeId: nodeId,
|
|
);
|
|
}
|