diff --git a/SessionMessagingKit/Database/Migrations/_009_OpenGroupPermission.swift b/SessionMessagingKit/Database/Migrations/_009_OpenGroupPermission.swift index 23e72bca2..4f6036a2d 100644 --- a/SessionMessagingKit/Database/Migrations/_009_OpenGroupPermission.swift +++ b/SessionMessagingKit/Database/Migrations/_009_OpenGroupPermission.swift @@ -12,12 +12,8 @@ enum _009_OpenGroupPermission: Migration { static func migrate(_ db: GRDB.Database) throws { try db.alter(table: OpenGroup.self) { t in - t.add(.permissions, .text) - .defaults(to: "" - .appending(OpenGroup.Permission.read.rawValue) - .appending(OpenGroup.Permission.write.rawValue) - .appending(OpenGroup.Permission.upload.rawValue) - ) + t.add(.permissions, .integer) + .defaults(to: OpenGroup.Permissions.all) } // When modifying OpenGroup behaviours we should always look to reset the `infoUpdates` diff --git a/SessionMessagingKit/Database/Models/OpenGroup.swift b/SessionMessagingKit/Database/Models/OpenGroup.swift index 2471aa9ea..57680de15 100644 --- a/SessionMessagingKit/Database/Models/OpenGroup.swift +++ b/SessionMessagingKit/Database/Models/OpenGroup.swift @@ -30,10 +30,35 @@ public struct OpenGroup: Codable, Identifiable, FetchableRecord, PersistableReco case permissions } - public enum Permission: String { - case read = "r" - case write = "w" - case upload = "u" + public struct Permissions: OptionSet, Codable, DatabaseValueConvertible { + public let rawValue: UInt16 + + public init(rawValue: UInt16) { + self.rawValue = rawValue + } + + public func toString() -> String { + return "" + .appending(self.contains(.read) ? "r" : "-") + .appending(self.contains(.write) ? "w" : "-") + .appending(self.contains(.upload) ? "u" : "-") + } + + public static func getPermissionsfromRoomInfo(_ roomInfo: OpenGroupAPI.RoomPollInfo) -> Permissions { + var permissions: Permissions = [] + + if roomInfo.read { permissions.insert(.read) } + if roomInfo.write { permissions.insert(.write) } + if roomInfo.upload { permissions.insert(.upload) } + + return permissions + } + + static let read: Permissions = Permissions(rawValue: 1 << 0) + static let write: Permissions = Permissions(rawValue: 1 << 1) + static let upload: Permissions = Permissions(rawValue: 1 << 2) + + static let all: Permissions = [ .read, .write, .upload ] } public var id: String { threadId } // Identifiable @@ -98,7 +123,7 @@ public struct OpenGroup: Codable, Identifiable, FetchableRecord, PersistableReco public let pollFailureCount: Int64 /// The permissions this room has for current user - public let permissions: String? + public let permissions: Permissions? // MARK: - Relationships @@ -133,7 +158,7 @@ public struct OpenGroup: Codable, Identifiable, FetchableRecord, PersistableReco inboxLatestMessageId: Int64 = 0, outboxLatestMessageId: Int64 = 0, pollFailureCount: Int64 = 0, - permissions: String? = nil + permissions: Permissions? = nil ) { self.threadId = OpenGroup.idFor(roomToken: roomToken, server: server) self.server = server.lowercased() @@ -214,7 +239,7 @@ extension OpenGroup: CustomStringConvertible, CustomDebugStringConvertible { "inboxLatestMessageId: \(inboxLatestMessageId)", "outboxLatestMessageId: \(outboxLatestMessageId)", "pollFailureCount: \(pollFailureCount))", - "permissions: \(permissions ?? "null")" + "permissions: \(permissions?.toString() ?? "---")" ].joined(separator: ", ") } } diff --git a/SessionMessagingKit/Open Groups/OpenGroupManager.swift b/SessionMessagingKit/Open Groups/OpenGroupManager.swift index f4016d84e..f4cc2b307 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupManager.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupManager.swift @@ -384,10 +384,7 @@ public final class OpenGroupManager: NSObject { // Only update the database columns which have changed (this is to prevent the UI from triggering // updates due to changing database columns to the existing value) - let permissions: String = "" - .appending(pollInfo.read == true ? OpenGroup.Permission.read.rawValue : nil) - .appending(pollInfo.write == true ? OpenGroup.Permission.write.rawValue : nil) - .appending(pollInfo.upload == true ? OpenGroup.Permission.upload.rawValue : nil) + let permissions = OpenGroup.Permissions.getPermissionsfromRoomInfo(pollInfo) try OpenGroup .filter(id: openGroup.id) diff --git a/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift b/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift index b3d996cd5..4e79e3917 100644 --- a/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift +++ b/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift @@ -99,7 +99,7 @@ public struct SessionThreadViewModel: FetchableRecordWithRowId, Decodable, Equat switch threadVariant { case .contact: return true case .closedGroup: return currentUserIsClosedGroupMember == true - case .openGroup: return openGroupPermissions?.range(of: OpenGroup.Permission.write.rawValue) != nil + case .openGroup: return openGroupPermissions?.contains(.write) ?? false } } @@ -118,7 +118,7 @@ public struct SessionThreadViewModel: FetchableRecordWithRowId, Decodable, Equat public let openGroupRoomToken: String? public let openGroupProfilePictureData: Data? private let openGroupUserCount: Int? - private let openGroupPermissions: String? + private let openGroupPermissions: OpenGroup.Permissions? // Interaction display info