Add update all subscriptions

This commit is contained in:
problematicconsumer
2024-01-04 10:56:26 +03:30
parent 88108e0da5
commit 685d05c4d3
7 changed files with 122 additions and 43 deletions

View File

@@ -10,6 +10,8 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'profiles_update_notifier.g.dart';
typedef ProfileUpdateStatus = ({String name, bool success});
@Riverpod(keepAlive: true)
class ForegroundProfilesUpdateNotifier
extends _$ForegroundProfilesUpdateNotifier with AppLogger {
@@ -17,9 +19,9 @@ class ForegroundProfilesUpdateNotifier
static const interval = Duration(minutes: 15);
@override
Future<void> build() async {
Stream<ProfileUpdateStatus?> build() {
var cycleCount = 0;
final scheduler = NeatPeriodicTaskScheduler(
_scheduler = NeatPeriodicTaskScheduler(
name: 'profiles update worker',
interval: interval,
timeout: const Duration(minutes: 5),
@@ -30,30 +32,51 @@ class ForegroundProfilesUpdateNotifier
);
ref.onDispose(() async {
await scheduler.stop();
await _scheduler?.stop();
_scheduler = null;
});
if (ref.watch(introCompletedProvider)) {
loggy.debug("intro done, starting");
return scheduler.start();
_scheduler?.start();
} else {
loggy.debug("intro in process, skipping");
}
return const Stream.empty();
}
NeatPeriodicTaskScheduler? _scheduler;
bool _forceNextRun = false;
Future<void> trigger() async {
loggy.debug("triggering update");
_forceNextRun = true;
await _scheduler?.trigger();
}
@visibleForTesting
Future<void> updateProfiles() async {
var force = false;
if (_forceNextRun) {
force = true;
_forceNextRun = false;
}
try {
final previousRun = DateTime.tryParse(
ref.read(sharedPreferencesProvider).requireValue.getString(prefKey) ??
"",
);
if (previousRun != null && previousRun.add(interval) > DateTime.now()) {
if (!force &&
previousRun != null &&
previousRun.add(interval) > DateTime.now()) {
loggy.debug("too soon! previous run: [$previousRun]");
return;
}
loggy.debug("running, previous run: [$previousRun]");
loggy.debug(
"${force ? "[FORCED] " : ""}running, previous run: [$previousRun]",
);
final remoteProfiles = await ref
.read(profileRepositoryProvider)
@@ -69,20 +92,25 @@ class ForegroundProfilesUpdateNotifier
await for (final profile in Stream.fromIterable(remoteProfiles)) {
final updateInterval = profile.options?.updateInterval;
if (updateInterval != null &&
updateInterval <= DateTime.now().difference(profile.lastUpdate)) {
if (force ||
updateInterval != null &&
updateInterval <=
DateTime.now().difference(profile.lastUpdate)) {
await ref
.read(profileRepositoryProvider)
.requireValue
.updateSubscription(profile)
.mapLeft(
(l) => loggy.debug("error updating profile [${profile.id}]", l),
)
.map(
(_) =>
loggy.debug("profile [${profile.id}] updated successfully"),
)
.run();
(l) {
loggy.debug("error updating profile [${profile.id}]", l);
state = AsyncData((name: profile.name, success: false));
},
).map(
(_) {
loggy.debug("profile [${profile.id}] updated successfully");
state = AsyncData((name: profile.name, success: true));
},
).run();
} else {
loggy.debug(
"skipping profile [${profile.id}] update. last successful update: [${profile.lastUpdate}] - interval: [${profile.options?.updateInterval}]",