worldhopper/lib/repositories/series_reading_mode_repository.dart

67 lines
2.3 KiB
Dart

import 'package:sqflite/sqflite.dart';
import 'package:worldhopper/database/database.dart';
import 'package:worldhopper/database/tables/series_reading_mode_table.dart';
import 'package:worldhopper/providers/reading_mode_provider.dart';
/// Repository for managing per-series reading mode overrides
class SeriesReadingModeRepository {
final DatabaseHelper _dbHelper;
SeriesReadingModeRepository({DatabaseHelper? dbHelper})
: _dbHelper = dbHelper ?? DatabaseHelper.instance;
/// Get database instance
Future<Database> get _db async => await _dbHelper.database;
/// Get the reading mode override for a series, or null if none set.
/// Updates last_accessed_at when a row is found.
Future<ReadingMode?> getReadingMode(String seriesFeedUrl) async {
final db = await _db;
final List<Map<String, dynamic>> maps = await db.query(
SeriesReadingModeTable.tableName,
where: 'series_feed_url = ?',
whereArgs: [seriesFeedUrl],
);
if (maps.isEmpty) return null;
// Update last_accessed_at
await db.update(
SeriesReadingModeTable.tableName,
{'last_accessed_at': DateTime.now().toUtc().toIso8601String()},
where: 'series_feed_url = ?',
whereArgs: [seriesFeedUrl],
);
final modeString = maps.first['reading_mode'] as String;
return ReadingMode.values.firstWhere(
(m) => m.name == modeString,
orElse: () => ReadingMode.ltr,
);
}
/// Set (insert or update) the reading mode override for a series.
/// Preserves created_at on updates.
Future<void> setReadingMode(String seriesFeedUrl, ReadingMode mode) async {
final db = await _db;
final now = DateTime.now().toUtc().toIso8601String();
await db.rawInsert('''
INSERT INTO ${SeriesReadingModeTable.tableName}
(series_feed_url, reading_mode, created_at, last_accessed_at)
VALUES (?, ?, ?, ?)
ON CONFLICT(series_feed_url) DO UPDATE SET
reading_mode = excluded.reading_mode,
last_accessed_at = excluded.last_accessed_at
''', [seriesFeedUrl, mode.name, now, now]);
}
/// Delete the reading mode override for a series
Future<void> deleteReadingMode(String seriesFeedUrl) async {
final db = await _db;
await db.delete(
SeriesReadingModeTable.tableName,
where: 'series_feed_url = ?',
whereArgs: [seriesFeedUrl],
);
}
}