import 'package:isar/isar.dart'; import '../../core/database/app_database.dart'; import '../../core/database/database_service.dart'; import '../../core/utils/result.dart'; import '../models/content_provider_config.dart'; import '../models/provider_diagnostics.dart'; import '../models/provider_health.dart'; class ProviderRepository { ProviderRepository(this._databaseService); final DatabaseService _databaseService; static List seedProviders() { final now = DateTime.now(); return [ ContentProviderConfig( id: 'gelbooru', name: 'Gelbooru', baseUrl: 'https://gelbooru.com', apiType: 'gelbooru', enabled: true, priority: 0, timeoutSeconds: 20, customHeaders: const {}, createdAt: now, updatedAt: now, ), ContentProviderConfig( id: 'rule34', name: 'Rule34', baseUrl: 'https://api.rule34.xxx', apiType: 'rule34', enabled: true, priority: 1, timeoutSeconds: 20, customHeaders: const {}, createdAt: now, updatedAt: now, ), ContentProviderConfig( id: 'realbooru', name: 'Realbooru', baseUrl: 'https://realbooru.com', apiType: 'realbooru_html', enabled: true, priority: 2, timeoutSeconds: 20, customHeaders: const {}, createdAt: now, updatedAt: now, ), ContentProviderConfig( id: 'e621', name: 'e621', baseUrl: 'https://e621.net', apiType: 'e621', enabled: true, priority: 3, timeoutSeconds: 20, customHeaders: const { 'User-Agent': 'Prisma/2.0.2 Flutter local booru browser', }, createdAt: now, updatedAt: now, ), ContentProviderConfig( id: 'e926', name: 'e926', baseUrl: 'https://e926.net', apiType: 'e621', enabled: true, priority: 4, timeoutSeconds: 20, customHeaders: const { 'User-Agent': 'Prisma/2.0.2 Flutter local booru browser', }, createdAt: now, updatedAt: now, ), ContentProviderConfig( id: 'pawchive', name: 'Pawchive', baseUrl: 'https://pawchive.pw', apiType: 'pawchive', enabled: true, priority: 5, timeoutSeconds: 20, customHeaders: const {}, createdAt: now, updatedAt: now, ), ]; } Future> ensureSeedProviders() { return _databaseService.safeWrite((isar) async { final existingProviders = await isar.providerConfigEntitys.where().findAll(); const removedIds = { 'safebooru', 'konachan', 'yandere', 'xbooru', 'paheal', 'kemono', 'coomer', }; for (final provider in existingProviders) { if (provider.providerId == 'cosbooru') { provider.enabled = false; provider.updatedAt = DateTime.now(); await isar.providerConfigEntitys.put(provider); } else if (removedIds.contains(provider.providerId)) { await isar.providerConfigEntitys.delete(provider.isarId); } } final seeds = seedProviders(); for (final seed in seeds) { final exists = await isar.providerConfigEntitys .filter() .providerIdEqualTo(seed.id) .findFirst(); if (exists == null) { await isar.providerConfigEntitys .put(ProviderConfigEntity.fromModel(seed)); } else if (seed.id == 'realbooru' && (exists.apiType != seed.apiType || exists.baseUrl != seed.baseUrl || exists.name != seed.name)) { exists.name = seed.name; exists.baseUrl = seed.baseUrl; exists.apiType = seed.apiType; exists.enabled = seed.enabled; exists.priority = seed.priority; exists.timeoutSeconds = seed.timeoutSeconds; exists.updatedAt = DateTime.now(); await isar.providerConfigEntitys.put(exists); } } }); } Future>> getProviders({ bool enabledOnly = false, }) { return _databaseService.safeRead((isar) async { final providers = enabledOnly ? await isar.providerConfigEntitys .filter() .enabledEqualTo(true) .findAll() : await isar.providerConfigEntitys.where().findAll(); providers.sort((a, b) => a.priority.compareTo(b.priority)); return providers.map((entity) => entity.toModel()).toList(); }); } Future> getProvider(String id) { return _databaseService.safeRead((isar) async { final entity = await isar.providerConfigEntitys .filter() .providerIdEqualTo(id) .findFirst(); return entity?.toModel(); }); } Future> saveProvider(ContentProviderConfig config) { return _databaseService.safeWrite((isar) async { await isar.providerConfigEntitys .put(ProviderConfigEntity.fromModel(config)); }); } Future> deleteProvider(String id) { return _databaseService.safeWrite((isar) async { await isar.providerConfigEntitys .filter() .providerIdEqualTo(id) .deleteAll(); await isar.providerHealthEntitys .filter() .providerIdEqualTo(id) .deleteAll(); }); } Future> saveHealth(ProviderHealth health) { return _databaseService.safeWrite((isar) async { await isar.providerHealthEntitys .put(ProviderHealthEntity.fromModel(health)); }); } Future> getHealth(String providerId) { return _databaseService.safeRead((isar) async { final entity = await isar.providerHealthEntitys .filter() .providerIdEqualTo(providerId) .findFirst(); return entity?.toModel(); }); } Future> saveDiagnostics(ProviderDiagnostics diagnostics) { return _databaseService.safeWrite((isar) async { await isar.providerDiagnosticsEntitys.put( ProviderDiagnosticsEntity.fromModel(diagnostics), ); }); } Future>> getDiagnostics() { return _databaseService.safeRead((isar) async { final items = await isar.providerDiagnosticsEntitys.where().findAll(); return items.map((item) => item.toModel()).toList(); }); } }