focus-flow/packages/scheduler_persistence_sqlite/lib/src/sqlite_repositories.dart

40 lines
2 KiB
Dart

// SPDX-FileCopyrightText: 2026 FocusFlow contributors
// SPDX-License-Identifier: AGPL-3.0-only
/// SQLite repository implementations backed by [SchedulerDb].
library;
import 'dart:convert';
import 'package:drift/drift.dart' as drift;
import 'package:scheduler_core/scheduler_core.dart' as core;
import 'package:scheduler_persistence/persistence.dart';
import 'scheduler_db.dart';
part 'sqlite_repositories/sqlite_task_repository.dart';
part 'sqlite_repositories/sqlite_project_repository.dart';
part 'sqlite_repositories/sqlite_locked_block_repository.dart';
part 'sqlite_repositories/sqlite_settings_repository.dart';
part 'sqlite_repositories/sqlite_schedule_snapshot_repository.dart';
/// Private file-level value for `_snapshotRetention`.
/// Keeping this value near the helpers that use it avoids hidden global configuration while still preventing duplicate literals.
const _snapshotRetention = Duration(days: 30);
/// Private file-level value for `_epoch`.
/// Keeping this value near the helpers that use it avoids hidden global configuration while still preventing duplicate literals.
final _epoch = DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
/// Adds focused helper behavior through `on`.
/// The extension keeps conversion or convenience logic near the type it supports while avoiding changes to the original model surface.
extension on int {
/// Performs the `next` behavior for this scheduler component.
/// The method provides a named entry point for this operation so callers do not need to know the lower-level state or persistence steps involved.
core.Revision next() => core.Revision(this).next();
}
/// Top-level helper that performs the `_windowsOverlap` operation for this file.
/// Keeping the helper private makes the surrounding flow easier to read while preventing unrelated libraries from depending on implementation detail.
bool _windowsOverlap(core.SchedulingWindow left, core.SchedulingWindow right) {
return left.start.isBefore(right.end) && right.start.isBefore(left.end);
}