Signal-iOS/Signal/src/ViewControllers/ThreadSettings/UpdateGroupViewController.swift

93 lines
3.6 KiB
Swift

//
// Copyright (c) 2020 Open Whisper Systems. All rights reserved.
//
import Foundation
@objc
public extension UpdateGroupViewController {
// MARK: - Dependencies
private var tsAccountManager: TSAccountManager {
return TSAccountManager.sharedInstance()
}
private var databaseStorage: SDSDatabaseStorage {
return SDSDatabaseStorage.shared
}
// MARK: -
func updateGroupThread(oldGroupModel: TSGroupModel,
newTitle: String?,
newAvatarData: Data?,
v1Members: Set<SignalServiceAddress>,
success: @escaping (TSGroupThread) -> Void,
failure: @escaping (Error) -> Void) {
let groupId = oldGroupModel.groupId
// GroupsV2 TODO: handle membership, access, etc. in this view.
let groupMembership: GroupMembership
switch oldGroupModel.groupsVersion {
case .V1:
groupMembership = GroupMembership(v1Members: v1Members)
case .V2:
// GroupsV2 TODO: This is a temporary implementation until we
// rewrite groups v2 to be aware of roles. For now, new users
// will _not_ be added as administrators.
let oldGroupMembership = oldGroupModel.groupMembership
var groupMembershipBuilder = oldGroupMembership.asBuilder
databaseStorage.read { transaction in
for address in v1Members {
guard GroupManager.doesUserSupportGroupsV2(address: address, transaction: transaction) else {
Logger.warn("Invalid address: \(address)")
continue
}
if !oldGroupMembership.allUsers.contains(address) {
groupMembershipBuilder.addNonPendingMember(address, role: .normal)
}
}
}
// GroupsV2 TODO: Remove members, change roles, etc. when
// UI supports pending members, kicking members, etc..
groupMembership = groupMembershipBuilder.build()
}
let groupAccess = GroupAccess.forV1
let groupsVersion = oldGroupModel.groupsVersion
guard let localAddress = tsAccountManager.localAddress else {
return failure(OWSAssertionError("Missing localAddress."))
}
// GroupsV2 TODO: Skip change where the user didn't change anything.
// dmConfiguration: nil means don't change disappearing messages configuration.
GroupManager.updateExistingGroup(groupId: groupId,
name: newTitle,
avatarData: newAvatarData,
groupMembership: groupMembership,
groupAccess: groupAccess,
groupsVersion: groupsVersion,
dmConfiguration: nil,
groupUpdateSourceAddress: localAddress)
.done(on: .global()) { groupThread in
success(groupThread)
}.catch(on: .global()) { (error) in
switch error {
case GroupsV2Error.redundantChange:
// GroupsV2 TODO: Treat this as a success.
owsFailDebug("Could not update group: \(error)")
failure(error)
default:
owsFailDebug("Could not update group: \(error)")
failure(error)
}
}.retainUntilComplete()
}
}