import 'package:comunic/lists/groups_list.dart'; import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/group.dart'; /// Groups helper /// /// @author Pierre HUBERT const _APIGroupsMembershipLevelsMap = { "administrator": GroupMembershipLevel.ADMINISTRATOR, "moderator": GroupMembershipLevel.MODERATOR, "member": GroupMembershipLevel.MEMBER, "invited": GroupMembershipLevel.INVITED, "pending": GroupMembershipLevel.PENDING, "visitor": GroupMembershipLevel.VISITOR }; const _APIGroupsVisibilityLevelsMap = { "open": GroupVisibilityLevel.OPEN, "private": GroupVisibilityLevel.PRIVATE, "secrete": GroupVisibilityLevel.SECRETE }; const _APIGroupsRegistrationLevelsMap = { "open": GroupRegistrationLevel.OPEN, "moderated": GroupRegistrationLevel.MODERATED, "closed": GroupRegistrationLevel.CLOSED }; const _APIGroupsPostsCreationLevelsMap = { "moderators": GroupPostCreationLevel.MODERATORS, "members": GroupPostCreationLevel.MEMBERS }; final _groupsListCache = GroupsList(); class GroupsHelper { /// Download a list of groups information from the server Future _downloadList(Set groups) async { final response = await APIRequest( uri: "groups/get_multiple_info", needLogin: true, args: {"list": groups.join(",")}, ).exec(); if (response.code != 200) return null; final list = GroupsList(); response .getObject() .forEach((k, d) => list[int.parse(k)] = _getGroupFromAPI(d)); return list; } /// Get a list of groups from the server. In case of error, this method throws /// an exception Future getListOrThrow(Set groups, {bool force = false}) async { final list = await getList(groups, force: force); if (list == null) throw Exception("Could not get the list of groups!"); return list; } /// Get a list of groups from the server Future getList(Set groups, {bool force = false}) async { final list = GroupsList(); // Check which groups information to download final toDownload = Set(); groups.forEach((groupID) { if (_groupsListCache.containsKey(groupID)) list[groupID] = _groupsListCache[groupID]; else toDownload.add(groupID); }); // Download required groups information if (toDownload.length > 0) { final downloaded = await _downloadList(toDownload); if (downloaded == null) return null; list.addAll(downloaded); _groupsListCache.addAll(downloaded); } return list; } /// Turn an API entry into a group object Group _getGroupFromAPI(Map map) { return Group( id: map["id"], name: map["name"], numberMembers: map["number_members"], membershipLevel: _APIGroupsMembershipLevelsMap[map["membership"]], visibilityLevel: _APIGroupsVisibilityLevelsMap[map["visibility"]], registrationLevel: _APIGroupsRegistrationLevelsMap[map["registration_level"]], postCreationLevel: _APIGroupsPostsCreationLevelsMap[map["posts_level"]], virtualDirectory: map["virtual_directory"], following: map["following"]); } }