diff --git a/client/lib/libphylum/phylum_account.dart b/client/lib/libphylum/phylum_account.dart index e9d90436..db34fd80 100644 --- a/client/lib/libphylum/phylum_account.dart +++ b/client/lib/libphylum/phylum_account.dart @@ -14,6 +14,7 @@ import 'package:phylum/util/logging.dart'; const _persistKeyAccessToken = 'accessToken'; const _persistKeyUser = 'user'; +const _persistKeyBootstrapUntil = 'bootstrapUntil'; AccountManager createAccountManager(bool autoInitialize) => AccountManager((id) async { final account = PhylumAccount.restore(id: id); @@ -59,7 +60,7 @@ class PhylumAccount extends Account { set loggedInUser(LoggedInUser value) { if (_loggedInUser != value) { _loggedInUser = value; - persist(_persistKeyUser, value.toJson()); + persist(_persistKeyUser, jsonEncode(value.toJson())); } } @@ -69,6 +70,11 @@ class PhylumAccount extends Account { String get userHome => _loggedInUser.home; int get userPermissions => _loggedInUser.permissions; + int get bootstrapUntil => getPersisted(_persistKeyBootstrapUntil)?.toInt() ?? 0; + set bootstrapUntil(int value) { + persist(_persistKeyBootstrapUntil, value); + } + PhylumAccount.create({required super.serverUri, required String accessToken, required LoggedInUser user}) : _initialAccessToken = accessToken, _initialLoggedInUser = user, @@ -100,7 +106,12 @@ class PhylumAccount extends Account { } } }); - _loggedInUser = _initialLoggedInUser ?? LoggedInUser.fromJson(jsonDecode(getPersisted(_persistKeyUser))); + if (_initialLoggedInUser != null) { + _loggedInUser = _initialLoggedInUser!; + persist(_persistKeyUser, jsonEncode(_initialLoggedInUser!.toJson())); + } else { + _loggedInUser = LoggedInUser.fromJson(jsonDecode(getPersisted(_persistKeyUser))); + } } @override diff --git a/client/lib/libphylum/repositories/bookmark_repository.dart b/client/lib/libphylum/repositories/bookmark_repository.dart index 0ed16a3d..5233c15d 100644 --- a/client/lib/libphylum/repositories/bookmark_repository.dart +++ b/client/lib/libphylum/repositories/bookmark_repository.dart @@ -7,15 +7,12 @@ import 'package:phylum/libphylum/actions/action_resource_bookmark_add.dart'; import 'package:phylum/libphylum/actions/action_resource_bookmark_remove.dart'; import 'package:phylum/libphylum/db/db.dart'; import 'package:phylum/libphylum/phylum_account.dart'; -import 'package:phylum/libphylum/requests/bookmarks_request.dart'; -import 'package:phylum/libphylum/responses/responses.dart'; const _remoteBookmarksBoxName = 'remote_bookmarks'; class BookmarkRepository extends Repository { late final PhylumAccount _account; late final LazyBox _remoteDataBox; - int? _lastBookmarkFetch; BookmarkRepository(); @@ -51,17 +48,6 @@ class BookmarkRepository extends Repository { )); } - Future refresh() async { - return _account.apiClient - .sendRequest(BookmarksRequest(since: _lastBookmarkFetch), - (request, response) => parseJsonMapResponse(response, BookmarkListResponse.fromResponse)) - .then((response) { - if (response is BookmarkListResponse) { - _lastBookmarkFetch = response.until; - } - }); - } - @override Future persistRemoteData(Map remoteData) { return _remoteDataBox.putAll(remoteData); diff --git a/client/lib/libphylum/repositories/user_repository.dart b/client/lib/libphylum/repositories/user_repository.dart index 9986fa96..1384bf51 100644 --- a/client/lib/libphylum/repositories/user_repository.dart +++ b/client/lib/libphylum/repositories/user_repository.dart @@ -6,8 +6,6 @@ import 'package:offtheline/offtheline.dart'; import 'package:phylum/libphylum/actions/action_user_invite.dart'; import 'package:phylum/libphylum/db/db.dart'; import 'package:phylum/libphylum/phylum_account.dart'; -import 'package:phylum/libphylum/requests/users_list_request.dart'; -import 'package:phylum/libphylum/responses/responses.dart'; import 'package:phylum/util/user_display_name.dart'; const _remoteUsersBoxName = 'remote_users'; @@ -42,13 +40,6 @@ class UserRepository extends Repository { return remoteData; } - Future refresh() async { - return _account.apiClient.sendRequest( - UsersListRequest(), - (request, response) => parseJsonMapResponse(response, UserListResponse.fromResponse), - ); - } - String getUserDisplayName(int userId) { return _users[userId]?.displayName ?? 'Unknown User($userId)'; } diff --git a/client/lib/libphylum/requests/bookmarks_request.dart b/client/lib/libphylum/requests/bootstrap_request.dart similarity index 69% rename from client/lib/libphylum/requests/bookmarks_request.dart rename to client/lib/libphylum/requests/bootstrap_request.dart index a614c4fc..f65f9870 100644 --- a/client/lib/libphylum/requests/bookmarks_request.dart +++ b/client/lib/libphylum/requests/bootstrap_request.dart @@ -3,14 +3,14 @@ import 'dart:typed_data'; import 'package:http/http.dart'; import 'package:offtheline/offtheline.dart'; -class BookmarksRequest extends ApiRequest { +class BootstrapRequest extends ApiRequest { final int? since; - BookmarksRequest({this.since}); + BootstrapRequest({this.since}); @override BaseRequest createRequest(ApiClient api, {Uint8List? data}) { - final uri = api.createUriBuilder('/api/v1/my/bookmarks/list'); + final uri = api.createUriBuilder('/api/v1/my/bootstrap'); if (since != null) { uri.queryParameters['since'] = since.toString(); } diff --git a/client/lib/libphylum/requests/users_list_request.dart b/client/lib/libphylum/requests/users_list_request.dart deleted file mode 100644 index ac90c290..00000000 --- a/client/lib/libphylum/requests/users_list_request.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'dart:typed_data'; - -import 'package:http/http.dart'; -import 'package:offtheline/offtheline.dart'; - -class UsersListRequest extends ApiRequest { - const UsersListRequest(); - - @override - BaseRequest createRequest(ApiClient api, {Uint8List? data}) { - final uri = api.createUriBuilder('/api/v1/users/list'); - return Request('get', uri.build()); - } -} diff --git a/client/lib/libphylum/responses/bookmark_list_response.dart b/client/lib/libphylum/responses/bookmark_list_response.dart deleted file mode 100644 index a12b9957..00000000 --- a/client/lib/libphylum/responses/bookmark_list_response.dart +++ /dev/null @@ -1,25 +0,0 @@ -part of 'responses.dart'; - -const keyLastBookmarkFetch = "lastBookmarksFetch"; - -class BookmarkListResponse extends PhylumApiSuccessResponse { - final Iterable bookmarks; - final int until; - - BookmarkListResponse({required this.bookmarks, required this.until}); - - factory BookmarkListResponse.fromResponse(Map data) { - final bookmarks = (data["bookmarks"] as List).cast().map((u) => parseBookmark(u.cast())); - return BookmarkListResponse(bookmarks: bookmarks, until: data['until'] as int); - } - - @override - Future process(PhylumAccount account) async { - await account.db.batch((batch) { - batch.insertAll(account.db.bookmarks, bookmarks, mode: InsertMode.replace); - }); - for (final b in bookmarks) { - await account.datastore.get().replaceRemoteData(b.resourceId, b); - } - } -} diff --git a/client/lib/libphylum/responses/bootstrap_login_response.dart b/client/lib/libphylum/responses/bootstrap_login_response.dart index 49267d49..924ec68d 100644 --- a/client/lib/libphylum/responses/bootstrap_login_response.dart +++ b/client/lib/libphylum/responses/bootstrap_login_response.dart @@ -41,6 +41,7 @@ class BootstrapLoginResponse extends PhylumApiSuccessResponse { }); account.loggedInUser = user; + account.bootstrapUntil = until; for (final b in bookmarks) { await account.datastore.get().replaceRemoteData(b.resourceId, b); diff --git a/client/lib/libphylum/responses/responses.dart b/client/lib/libphylum/responses/responses.dart index fec2f61f..f9bff1b5 100644 --- a/client/lib/libphylum/responses/responses.dart +++ b/client/lib/libphylum/responses/responses.dart @@ -9,7 +9,6 @@ import 'package:phylum/libphylum/parsers/parsers.dart'; import 'package:phylum/libphylum/phylum_account.dart'; import 'package:phylum/util/permissions.dart'; -part 'bookmark_list_response.dart'; part 'bookmark_response.dart'; part 'bootstrap_login_response.dart'; part 'empty_response.dart'; @@ -18,7 +17,6 @@ part 'resource_response.dart'; part 'search_response.dart'; part 'shared_resources_response.dart'; part 'trash_list_response.dart'; -part 'user_list_response.dart'; part 'user_response.dart'; typedef JsonMapResponseParser = PhylumApiSuccessResponse Function(Map data); diff --git a/client/lib/libphylum/responses/user_list_response.dart b/client/lib/libphylum/responses/user_list_response.dart deleted file mode 100644 index 04046767..00000000 --- a/client/lib/libphylum/responses/user_list_response.dart +++ /dev/null @@ -1,19 +0,0 @@ -part of 'responses.dart'; - -class UserListResponse extends PhylumApiSuccessResponse { - final Iterable users; - - @override - Future process(PhylumAccount account) async { - await account.db.batch((batch) { - batch.insertAllOnConflictUpdate(account.db.users, users); - }); - } - - UserListResponse({required this.users}); - - factory UserListResponse.fromResponse(Map data) { - final users = (data["users"] as List).cast().map((u) => parseUser(u)); - return UserListResponse(users: users); - } -} diff --git a/client/lib/ui/explorer/explorer_view.dart b/client/lib/ui/explorer/explorer_view.dart index 6ab733dd..f4fbd4df 100644 --- a/client/lib/ui/explorer/explorer_view.dart +++ b/client/lib/ui/explorer/explorer_view.dart @@ -6,6 +6,8 @@ import 'package:flutter/material.dart'; import 'package:phylum/libphylum/db/resource_helpers.dart'; import 'package:phylum/libphylum/local_upload_errors.dart'; import 'package:phylum/libphylum/phylum_account.dart'; +import 'package:phylum/libphylum/requests/bootstrap_request.dart'; +import 'package:phylum/libphylum/responses/responses.dart'; import 'package:phylum/ui/destination_picker/destination_picker.dart'; import 'package:phylum/ui/explorer/explorer_actions.dart'; import 'package:phylum/ui/explorer/explorer_gesture_handler.dart'; @@ -42,8 +44,8 @@ class _ExplorerViewState extends State { final account = context.read(); _listener = AppLifecycleListener(onResume: () { - account.userRepository.refresh(); - account.bookmarkRepository.refresh(); + account.apiClient.sendRequest(BootstrapRequest(since: account.bootstrapUntil), + (request, response) => parseJsonMapResponse(response, BootstrapLoginResponse.fromResponse)); }); if (!kIsWeb && Platform.isAndroid) {