session-ios/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage+Conven...

86 lines
3.7 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import GRDB
import SessionUtilitiesKit
extension ConfigurationMessage {
public static func getCurrent(_ db: Database) throws -> ConfigurationMessage {
let currentUserProfile: Profile = Profile.fetchOrCreateCurrentUser(db)
let displayName: String = currentUserProfile.name
let profilePictureUrl: String? = currentUserProfile.profilePictureUrl
let profileKey: Data? = currentUserProfile.profileEncryptionKey
let closedGroups: Set<CMClosedGroup> = try ClosedGroup.fetchAll(db)
.compactMap { closedGroup -> CMClosedGroup? in
guard let latestKeyPair: ClosedGroupKeyPair = try closedGroup.fetchLatestKeyPair(db) else {
return nil
}
return CMClosedGroup(
publicKey: closedGroup.publicKey,
name: closedGroup.name,
encryptionKeyPublicKey: latestKeyPair.publicKey,
encryptionKeySecretKey: latestKeyPair.secretKey,
members: try closedGroup.members
.select(GroupMember.Columns.profileId)
.asRequest(of: String.self)
.fetchSet(db),
admins: try closedGroup.admins
.select(GroupMember.Columns.profileId)
.asRequest(of: String.self)
.fetchSet(db),
expirationTimer: (try? DisappearingMessagesConfiguration
.fetchOne(db, id: closedGroup.threadId)
.map { ($0.isEnabled ? UInt32($0.durationSeconds) : 0) })
.defaulting(to: 0)
)
}
.asSet()
// The default room promise creates an OpenGroup with an empty `roomToken` value,
// we don't want to start a poller for this as the user hasn't actually joined a room
let openGroups: Set<String> = try OpenGroup
.filter(OpenGroup.Columns.roomToken != "")
.filter(OpenGroup.Columns.isActive)
.fetchAll(db)
.compactMap { openGroup in
SessionUtil.communityUrlFor(
server: openGroup.server,
roomToken: openGroup.roomToken,
publicKey: openGroup.publicKey
)
}
.asSet()
let contacts: Set<CMContact> = try Contact
.filter(Contact.Columns.id != currentUserProfile.id)
.fetchAll(db)
.map { contact -> CMContact in
// Can just default the 'hasX' values to true as they will be set to this
// when converting to proto anyway
let profile: Profile? = try? Profile.fetchOne(db, id: contact.id)
return CMContact(
publicKey: contact.id,
displayName: (profile?.name ?? contact.id),
profilePictureUrl: profile?.profilePictureUrl,
profileKey: profile?.profileEncryptionKey,
hasIsApproved: true,
isApproved: contact.isApproved,
hasIsBlocked: true,
isBlocked: contact.isBlocked,
hasDidApproveMe: true,
didApproveMe: contact.didApproveMe
)
}
.asSet()
return ConfigurationMessage(
displayName: displayName,
profilePictureUrl: profilePictureUrl,
profileKey: profileKey,
closedGroups: closedGroups,
openGroups: openGroups,
contacts: contacts
)
}
}