import 'package:riverpod_annotation/riverpod_annotation.dart'; import '../../core/models/models.dart'; import '../../core/network/api_client_provider.dart'; import '../../core/network/node_master_api_client.dart'; part 'services_repository.g.dart'; /// Wraps the `/services/*` endpoints — the compose-based services on this /// host and their start/stop/backup actions. class ServicesRepository { const ServicesRepository(this._client); final NodeMasterApiClient _client; Future> getAll() => _client.getAllServices(); Future get(String id) => _client.getService(id); Future add(Service service) => _client.addService(service); Future update(String id, Service service) => _client.updateService(id, service); Future delete(String id) => _client.deleteService(id); Future start(String id) => _client.startService(id); Future stop(String id) => _client.stopService(id); Future backupNow(String id) => _client.backupService(id); Future> getBackupTargets(String id) => _client.getServiceBackupTargets(id); Future addBackupTarget(String id, BackupTarget target) => _client.addServiceBackupTarget(id, target); Future updateBackupTarget(String id, String targetId, BackupTarget target) => _client.updateServiceBackupTarget(id, targetId, target); Future deleteBackupTarget(String id, String targetId) => _client.deleteServiceBackupTarget(id, targetId); Future runBackupTarget(String id, String targetId) => _client.runServiceBackupTarget(id, targetId); Future getBackupTargetProgress(String id, String targetId) => _client.getServiceBackupTargetProgress(id, targetId); Future> getBackupProgress(String id) => _client.getServiceBackupProgress(id); } /// Null when no connection is active, mirroring [apiClientProvider]. @riverpod ServicesRepository? servicesRepository(Ref ref) { final client = ref.watch(apiClientProvider); if (client == null) return null; return ServicesRepository(client); } /// The full services list for the active connection. Manual-refresh only /// (not polled) — this is a detail-heavy table screen where a mid-edit /// slide-over silently refreshing underneath the user would be worse than /// slightly stale data; Dashboard's polled summary is where "did something /// change" gets noticed at a glance. @riverpod Future> servicesList(Ref ref) async { final repo = ref.watch(servicesRepositoryProvider); if (repo == null) return []; return repo.getAll(); }