import 'package:comunic/enums/user_page_visibility.dart'; import 'package:comunic/helpers/database/users_database_helper.dart'; import 'package:comunic/lists/users_list.dart'; import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/user.dart'; /// User helper /// /// Helper used to get information about the users of Comunic /// /// @author Pierre HUBERT class UsersHelper { final UsersDatabaseHelper _usersDatabaseHelper = UsersDatabaseHelper(); /// Download information about some given users ID /// /// Return the list of users information in case of success, null in case of /// failure Future _downloadInfo(List users) async { // Execute the request final response = await APIRequest( uri: "user/getInfoMultiple", needLogin: true, args: {"usersID": users.join(",")}).exec(); // Check if the request did not execute correctly if (response.code != 200) return null; final list = UsersList(); response.getObject().forEach( (k, v) => list.add( User( id: v["userID"], firstName: v["firstName"], lastName: v["lastName"], pageVisibility: v["publicPage"] == "false" ? UserPageVisibility.PRIVATE : (v["openPage"] == "false" ? UserPageVisibility.PRIVATE : UserPageVisibility.OPEN), virtualDirectory: v["virtualDirectory"] == "" ? null : v["virtualDirectory"], accountImageURL: v["accountImage"], ), ), ); // Save the list _usersDatabaseHelper.insertOrUpdateAll(list); return list; } /// Get users information from a given [Set] Future getList(Set users, {bool forceDownload = false}) async { return await getUsersInfo(users.toList()); } /// Get users information /// /// If [forceDownload] is set to true, the data will always be retrieved from /// the server, otherwise cached data will be used if available Future getUsersInfo(List users, {bool forceDownload = false}) async { List toDownload = List(); UsersList list = UsersList(); // Check cache for (int userID in users) { if (!forceDownload && await _usersDatabaseHelper.has(userID)) list.add(await _usersDatabaseHelper.get(userID)); else toDownload.add(userID); } // Process download if required if (toDownload.length > 0) { final downloadedList = await _downloadInfo(toDownload); if (downloadedList == null) return null; list.addAll(downloadedList); } return list; } }