From aa54c23c445b39cfaa38dc78eecd7f6da9c7d33f Mon Sep 17 00:00:00 2001 From: Nikolas Rimikis Date: Sat, 28 Oct 2023 12:13:33 +0200 Subject: [PATCH] refactor: use named records for version checks Signed-off-by: Nikolas Rimikis --- packages/neon/neon/lib/src/blocs/apps.dart | 17 +++++++++++------ .../neon/lib/src/models/app_implementation.dart | 10 +++++----- packages/neon/neon_dashboard/lib/src/app.dart | 8 -------- packages/neon/neon_files/lib/neon_files.dart | 7 ------- packages/neon/neon_news/lib/neon_news.dart | 2 +- packages/neon/neon_notes/lib/neon_notes.dart | 6 +++--- .../lib/neon_notifications.dart | 8 -------- packages/nextcloud/lib/nextcloud.dart | 1 + packages/nextcloud/lib/src/helpers/common.dart | 2 ++ packages/nextcloud/lib/src/helpers/core.dart | 10 +++++++--- packages/nextcloud/lib/src/helpers/news.dart | 7 ++++--- packages/nextcloud/lib/src/helpers/notes.dart | 10 +++++++--- packages/nextcloud/test/core_test.dart | 4 ++-- packages/nextcloud/test/news_test.dart | 4 ++-- packages/nextcloud/test/notes_test.dart | 4 ++-- 15 files changed, 47 insertions(+), 53 deletions(-) create mode 100644 packages/nextcloud/lib/src/helpers/common.dart diff --git a/packages/neon/neon/lib/src/blocs/apps.dart b/packages/neon/neon/lib/src/blocs/apps.dart index 411e1a77..7200037d 100644 --- a/packages/neon/neon/lib/src/blocs/apps.dart +++ b/packages/neon/neon/lib/src/blocs/apps.dart @@ -123,9 +123,9 @@ class AppsBloc extends InteractiveBloc implements AppsBlocEvents, AppsBlocStates final notSupported = {}; try { - final (coreSupported, coreMinimumVersion) = _account.client.core.isSupported(capabilities.requireData); - if (!coreSupported) { - notSupported['core'] = coreMinimumVersion.toString(); + final coreCheck = _account.client.core.isSupported(capabilities.requireData); + if (!coreCheck.isSupported) { + notSupported['core'] = coreCheck.minimumVersion.toString(); } } catch (e, s) { debugPrint(e.toString()); @@ -134,9 +134,14 @@ class AppsBloc extends InteractiveBloc implements AppsBlocEvents, AppsBlocStates for (final app in apps.requireData) { try { - final (supported, minimumVersion) = await app.isSupported(_account, capabilities.requireData); - if (!(supported ?? true)) { - notSupported[app.id] = minimumVersion; + final check = await app.isSupported(_account, capabilities.requireData); + + if (check == null) { + continue; + } + + if (!check.isSupported) { + notSupported[app.id] = check.minimumVersion; } } catch (e, s) { debugPrint(e.toString()); diff --git a/packages/neon/neon/lib/src/models/app_implementation.dart b/packages/neon/neon/lib/src/models/app_implementation.dart index bca76377..e57aa2bd 100644 --- a/packages/neon/neon/lib/src/models/app_implementation.dart +++ b/packages/neon/neon/lib/src/models/app_implementation.dart @@ -15,6 +15,7 @@ import 'package:neon/src/settings/models/storage.dart'; import 'package:neon/src/utils/provider.dart'; import 'package:neon/src/widgets/drawer_destination.dart'; import 'package:nextcloud/core.dart' as core; +import 'package:nextcloud/nextcloud.dart' show VersionSupported; import 'package:provider/provider.dart'; import 'package:rxdart/rxdart.dart'; import 'package:vector_graphics/vector_graphics.dart'; @@ -36,15 +37,14 @@ abstract class AppImplementation /// Checks if the app is supported on the server of the [account]. /// - /// A `supported` value of `null` means that it can not be known if the app is supported. + /// A value of `null` means that it can not be known if the app is supported. /// This is the case for apps that depend on the server version like files and we assume that the app is supported. /// The server support is handled differently. - /// - /// The first value of the record is the supported status and the second value is the supported minimum version. - FutureOr<(bool? supported, String? minimumVersion)> isSupported( + FutureOr?> isSupported( final Account account, final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, - ); + ) => + null; final blocsCache = AccountCache(); diff --git a/packages/neon/neon_dashboard/lib/src/app.dart b/packages/neon/neon_dashboard/lib/src/app.dart index 69c4c1f6..9c4f5f38 100644 --- a/packages/neon/neon_dashboard/lib/src/app.dart +++ b/packages/neon/neon_dashboard/lib/src/app.dart @@ -6,7 +6,6 @@ import 'package:neon_dashboard/src/blocs/dashboard.dart'; import 'package:neon_dashboard/src/options.dart'; import 'package:neon_dashboard/src/pages/main.dart'; import 'package:neon_dashboard/src/routes.dart'; -import 'package:nextcloud/core.dart' as core; import 'package:nextcloud/nextcloud.dart'; /// Implementation of the server `dashboard` app. @@ -34,11 +33,4 @@ class DashboardApp extends AppImplementation - const (null, null); } diff --git a/packages/neon/neon_files/lib/neon_files.dart b/packages/neon/neon_files/lib/neon_files.dart index d6df44da..6942c5ac 100644 --- a/packages/neon/neon_files/lib/neon_files.dart +++ b/packages/neon/neon_files/lib/neon_files.dart @@ -72,11 +72,4 @@ class FilesApp extends AppImplementation { @override final RouteBase route = $filesAppRoute; - - @override - (bool? supported, String? minimumVersion) isSupported( - final Account account, - final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, - ) => - const (null, null); } diff --git a/packages/neon/neon_news/lib/neon_news.dart b/packages/neon/neon_news/lib/neon_news.dart index 53948723..81fef6e0 100644 --- a/packages/neon/neon_news/lib/neon_news.dart +++ b/packages/neon/neon_news/lib/neon_news.dart @@ -85,7 +85,7 @@ class NewsApp extends AppImplementation { BehaviorSubject getUnreadCounter(final NewsBloc bloc) => bloc.unreadCounter; @override - Future<(bool? supported, String? minimumVersion)> isSupported( + Future> isSupported( final Account account, final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, ) => diff --git a/packages/neon/neon_notes/lib/neon_notes.dart b/packages/neon/neon_notes/lib/neon_notes.dart index 620174a3..d0a1d314 100644 --- a/packages/neon/neon_notes/lib/neon_notes.dart +++ b/packages/neon/neon_notes/lib/neon_notes.dart @@ -71,11 +71,11 @@ class NotesApp extends AppImplementation { final RouteBase route = $notesAppRoute; @override - (bool? supported, String? minimumVersion) isSupported( + VersionSupported isSupported( final Account account, final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, ) { - final (supported, minimumVersion) = account.client.notes.isSupported(capabilities); - return (supported, minimumVersion.toString()); + final result = account.client.notes.isSupported(capabilities); + return (isSupported: result.isSupported, minimumVersion: result.minimumVersion.toString()); } } diff --git a/packages/neon/neon_notifications/lib/neon_notifications.dart b/packages/neon/neon_notifications/lib/neon_notifications.dart index 82c149d0..89dbaec0 100644 --- a/packages/neon/neon_notifications/lib/neon_notifications.dart +++ b/packages/neon/neon_notifications/lib/neon_notifications.dart @@ -13,7 +13,6 @@ import 'package:neon/utils.dart'; import 'package:neon/widgets.dart'; import 'package:neon_notifications/l10n/localizations.dart'; import 'package:neon_notifications/routes.dart'; -import 'package:nextcloud/core.dart' as core; import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/notifications.dart' as notifications; import 'package:rxdart/rxdart.dart'; @@ -54,11 +53,4 @@ class NotificationsApp extends AppImplementation getUnreadCounter(final NotificationsBloc bloc) => bloc.unreadCounter; - - @override - (bool? supported, String? minimumVersion) isSupported( - final Account account, - final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, - ) => - const (null, null); } diff --git a/packages/nextcloud/lib/nextcloud.dart b/packages/nextcloud/lib/nextcloud.dart index b43863e9..bffeff8f 100644 --- a/packages/nextcloud/lib/nextcloud.dart +++ b/packages/nextcloud/lib/nextcloud.dart @@ -4,4 +4,5 @@ export 'package:dynamite_runtime/models.dart'; export 'ids.dart'; export 'src/client.dart'; +export 'src/helpers/common.dart'; export 'webdav.dart'; diff --git a/packages/nextcloud/lib/src/helpers/common.dart b/packages/nextcloud/lib/src/helpers/common.dart new file mode 100644 index 00000000..f2e6b9a1 --- /dev/null +++ b/packages/nextcloud/lib/src/helpers/common.dart @@ -0,0 +1,2 @@ +/// The result of a version check. +typedef VersionSupported = ({bool isSupported, T minimumVersion}); diff --git a/packages/nextcloud/lib/src/helpers/core.dart b/packages/nextcloud/lib/src/helpers/core.dart index f4982e51..de13b505 100644 --- a/packages/nextcloud/lib/src/helpers/core.dart +++ b/packages/nextcloud/lib/src/helpers/core.dart @@ -1,6 +1,7 @@ // ignore_for_file: public_member_api_docs import 'package:nextcloud/src/api/core.openapi.dart' as core; +import 'package:nextcloud/src/helpers/common.dart'; /// Version of core/Server supported const supportedVersion = 27; @@ -9,9 +10,12 @@ extension CoreVersionSupported on core.Client { /// Check if the core/Server version is supported by this client /// /// Also returns the supported version number - (bool, int) isSupported(final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities) => ( - capabilities.version.major == supportedVersion, - supportedVersion, + VersionSupported isSupported( + final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, + ) => + ( + isSupported: capabilities.version.major == supportedVersion, + minimumVersion: supportedVersion, ); } diff --git a/packages/nextcloud/lib/src/helpers/news.dart b/packages/nextcloud/lib/src/helpers/news.dart index f907424c..0761a554 100644 --- a/packages/nextcloud/lib/src/helpers/news.dart +++ b/packages/nextcloud/lib/src/helpers/news.dart @@ -1,6 +1,7 @@ // ignore_for_file: public_member_api_docs import 'package:nextcloud/src/api/news.openapi.dart' as news; +import 'package:nextcloud/src/helpers/common.dart'; /// API version of the news app supported const supportedVersion = 'v1-3'; @@ -9,11 +10,11 @@ extension NewsVersionSupported on news.Client { /// Check if the news app version is supported by this client /// /// Also returns the supported API version number - Future<(bool, String)> isSupported() async { + Future> isSupported() async { final response = await getSupportedApiVersions(); return ( - response.body.apiLevels!.contains(supportedVersion), - supportedVersion, + isSupported: response.body.apiLevels!.contains(supportedVersion), + minimumVersion: supportedVersion, ); } } diff --git a/packages/nextcloud/lib/src/helpers/notes.dart b/packages/nextcloud/lib/src/helpers/notes.dart index dbde1c7d..e0c16c62 100644 --- a/packages/nextcloud/lib/src/helpers/notes.dart +++ b/packages/nextcloud/lib/src/helpers/notes.dart @@ -1,6 +1,7 @@ import 'package:collection/collection.dart'; import 'package:nextcloud/src/api/core.openapi.dart' as core; import 'package:nextcloud/src/api/notes.openapi.dart' as notes; +import 'package:nextcloud/src/helpers/common.dart'; import 'package:version/version.dart'; /// API version of the notes app supported @@ -11,11 +12,14 @@ extension NotesVersionSupported on notes.Client { /// Check if the notes app version is supported by this client /// /// Also returns the supported API version number - (bool, int) isSupported(final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities) => ( - capabilities.capabilities.notesCapabilities?.notes.apiVersion + VersionSupported isSupported( + final core.OcsGetCapabilitiesResponseApplicationJson_Ocs_Data capabilities, + ) => + ( + isSupported: capabilities.capabilities.notesCapabilities?.notes.apiVersion ?.map(Version.parse) .firstWhereOrNull((final version) => version.major == supportedVersion) != null, - supportedVersion, + minimumVersion: supportedVersion, ); } diff --git a/packages/nextcloud/test/core_test.dart b/packages/nextcloud/test/core_test.dart index 0fdd1c80..766d6976 100644 --- a/packages/nextcloud/test/core_test.dart +++ b/packages/nextcloud/test/core_test.dart @@ -25,8 +25,8 @@ void main() { expect(response.statusCode, 200); expect(() => response.headers, isA()); - final (supported, _) = client.core.isSupported(response.body.ocs.data); - expect(supported, isTrue); + final result = client.core.isSupported(response.body.ocs.data); + expect(result.isSupported, isTrue); }); test('Is supported from status', () async { diff --git a/packages/nextcloud/test/news_test.dart b/packages/nextcloud/test/news_test.dart index 7ca96f47..ece64797 100644 --- a/packages/nextcloud/test/news_test.dart +++ b/packages/nextcloud/test/news_test.dart @@ -38,8 +38,8 @@ void main() { ); test('Is supported', () async { - final (supported, _) = await client.news.isSupported(); - expect(supported, isTrue); + final result = await client.news.isSupported(); + expect(result.isSupported, isTrue); }); test('Add feed', () async { diff --git a/packages/nextcloud/test/notes_test.dart b/packages/nextcloud/test/notes_test.dart index 800dc371..1d49683e 100644 --- a/packages/nextcloud/test/notes_test.dart +++ b/packages/nextcloud/test/notes_test.dart @@ -25,8 +25,8 @@ void main() { expect(response.statusCode, 200); expect(() => response.headers, isA()); - final (supported, _) = client.notes.isSupported(response.body.ocs.data); - expect(supported, isTrue); + final result = client.notes.isSupported(response.body.ocs.data); + expect(result.isSupported, isTrue); }); test('Create note favorite', () async {