1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-10-23 15:03:22 +00:00
comunicmobile/lib/helpers/users_helper.dart

91 lines
2.7 KiB
Dart

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<UsersList> _downloadInfo(List<int> users) async {
// Execute the request
final response = await APIRequest(
uri: "user/getInfoMultiple", 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<UsersList> getList(Set<int> 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<UsersList> getUsersInfo(List<int> users,
{bool forceDownload = false}) async {
List<int> 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;
}
}