40 lines
2 KiB
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);
|
|
}
|