Files
manager/lib/data/repositories/services_repository.dart
2026-07-27 14:42:23 +02:00

58 lines
2.6 KiB
Dart

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<List<Service>> getAll() => _client.getAllServices();
Future<Service> get(String id) => _client.getService(id);
Future<Service> add(Service service) => _client.addService(service);
Future<Service> update(String id, Service service) => _client.updateService(id, service);
Future<void> delete(String id) => _client.deleteService(id);
Future<void> start(String id) => _client.startService(id);
Future<void> stop(String id) => _client.stopService(id);
Future<void> backupNow(String id) => _client.backupService(id);
Future<List<BackupTarget>> getBackupTargets(String id) => _client.getServiceBackupTargets(id);
Future<BackupTarget> addBackupTarget(String id, BackupTarget target) =>
_client.addServiceBackupTarget(id, target);
Future<BackupTarget> updateBackupTarget(String id, String targetId, BackupTarget target) =>
_client.updateServiceBackupTarget(id, targetId, target);
Future<void> deleteBackupTarget(String id, String targetId) =>
_client.deleteServiceBackupTarget(id, targetId);
Future<void> runBackupTarget(String id, String targetId) =>
_client.runServiceBackupTarget(id, targetId);
Future<RunState> getBackupTargetProgress(String id, String targetId) =>
_client.getServiceBackupTargetProgress(id, targetId);
Future<List<RunState>> 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<List<Service>> servicesList(Ref ref) async {
final repo = ref.watch(servicesRepositoryProvider);
if (repo == null) return [];
return repo.getAll();
}