mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-26 06:49:22 +00:00
137 lines
4.1 KiB
Dart
137 lines
4.1 KiB
Dart
import 'package:comunic/lists/groups_list.dart';
|
|
import 'package:comunic/models/api_request.dart';
|
|
import 'package:comunic/models/group.dart';
|
|
import 'package:comunic/utils/api_utils.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<GroupsList> _downloadList(Set<int> 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<GroupsList> getListOrThrow(Set<int> 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<GroupsList> getList(Set<int> groups, {bool force = false}) async {
|
|
final list = GroupsList();
|
|
|
|
// Check which groups information to download
|
|
final toDownload = Set<int>();
|
|
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;
|
|
}
|
|
|
|
/// Get the list of groups of a user
|
|
Future<Set<int>> getListUser() async =>
|
|
(await APIRequest(uri: "groups/get_my_list", needLogin: true).exec())
|
|
.assertOk()
|
|
.getArray()
|
|
.map((f) => cast<int>(f))
|
|
.toSet();
|
|
|
|
/// Perform a simple membership request
|
|
Future<bool> _simpleMembershipRequest(int groupID, String uri) async =>
|
|
(await (APIRequest(uri: uri, needLogin: true)..addInt("id", groupID))
|
|
.exec())
|
|
.isOK;
|
|
|
|
/// Remove group membership
|
|
Future<bool> removeMembership(int groupID) async =>
|
|
_simpleMembershipRequest(groupID, "groups/remove_membership");
|
|
|
|
/// Cancel membership request
|
|
Future<bool> cancelRequest(int groupID) async =>
|
|
_simpleMembershipRequest(groupID, "groups/cancel_request");
|
|
|
|
/// Send a new membership request
|
|
Future<bool> sendRequest(int groupID) async =>
|
|
_simpleMembershipRequest(groupID, "groups/send_request");
|
|
|
|
/// Turn an API entry into a group object
|
|
Group _getGroupFromAPI(Map<String, dynamic> map) {
|
|
return Group(
|
|
id: map["id"],
|
|
name: map["name"],
|
|
iconURL: map["icon_url"],
|
|
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"]);
|
|
}
|
|
}
|