worldhopper/lib/repositories/series_cover_page_repository.dart

62 lines
2.1 KiB
Dart

import 'package:sqflite/sqflite.dart';
import 'package:worldhopper/database/database.dart';
import 'package:worldhopper/database/tables/series_cover_page_table.dart';
/// Repository for managing per-series "first page is cover" overrides
class SeriesCoverPageRepository {
final DatabaseHelper _dbHelper;
SeriesCoverPageRepository({DatabaseHelper? dbHelper})
: _dbHelper = dbHelper ?? DatabaseHelper.instance;
/// Get database instance
Future<Database> get _db async => await _dbHelper.database;
/// Get the cover page override for a series, or null if none set.
/// Updates last_accessed_at when a row is found.
Future<bool?> getCoverPage(String seriesFeedUrl) async {
final db = await _db;
final List<Map<String, dynamic>> maps = await db.query(
SeriesCoverPageTable.tableName,
where: 'series_feed_url = ?',
whereArgs: [seriesFeedUrl],
);
if (maps.isEmpty) return null;
// Update last_accessed_at
await db.update(
SeriesCoverPageTable.tableName,
{'last_accessed_at': DateTime.now().toUtc().toIso8601String()},
where: 'series_feed_url = ?',
whereArgs: [seriesFeedUrl],
);
return (maps.first['first_page_is_cover'] as int) == 1;
}
/// Set (insert or update) the cover page override for a series.
/// Preserves created_at on updates.
Future<void> setCoverPage(String seriesFeedUrl, bool value) async {
final db = await _db;
final now = DateTime.now().toUtc().toIso8601String();
await db.rawInsert('''
INSERT INTO ${SeriesCoverPageTable.tableName}
(series_feed_url, first_page_is_cover, created_at, last_accessed_at)
VALUES (?, ?, ?, ?)
ON CONFLICT(series_feed_url) DO UPDATE SET
first_page_is_cover = excluded.first_page_is_cover,
last_accessed_at = excluded.last_accessed_at
''', [seriesFeedUrl, value ? 1 : 0, now, now]);
}
/// Delete the cover page override for a series
Future<void> deleteCoverPage(String seriesFeedUrl) async {
final db = await _db;
await db.delete(
SeriesCoverPageTable.tableName,
where: 'series_feed_url = ?',
whereArgs: [seriesFeedUrl],
);
}
}