mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Swift
		
	
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | 
						|
 | 
						|
import Foundation
 | 
						|
import GRDB
 | 
						|
import SessionSnodeKit
 | 
						|
import SessionUtilitiesKit
 | 
						|
 | 
						|
public struct ConfigDump: Codable, Equatable, Hashable, FetchableRecord, PersistableRecord, TableRecord, ColumnExpressible {
 | 
						|
    public static var databaseTableName: String { "configDump" }
 | 
						|
    
 | 
						|
    public typealias Columns = CodingKeys
 | 
						|
    public enum CodingKeys: String, CodingKey, ColumnExpression {
 | 
						|
        case variant
 | 
						|
        case publicKey
 | 
						|
        case data
 | 
						|
        case timestampMs
 | 
						|
    }
 | 
						|
    
 | 
						|
    public enum Variant: String, Codable, DatabaseValueConvertible {
 | 
						|
        case userProfile
 | 
						|
        case contacts
 | 
						|
        case convoInfoVolatile
 | 
						|
        case userGroups
 | 
						|
    }
 | 
						|
    
 | 
						|
    /// The type of config this dump is for
 | 
						|
    public let variant: Variant
 | 
						|
    
 | 
						|
    /// The public key for the swarm this dump is for
 | 
						|
    ///
 | 
						|
    /// **Note:** For user config items this will be an empty string
 | 
						|
    public let publicKey: String
 | 
						|
    
 | 
						|
    /// The data for this dump
 | 
						|
    public let data: Data
 | 
						|
    
 | 
						|
    /// When the configDump was created in milliseconds since epoch
 | 
						|
    public let timestampMs: Int64
 | 
						|
    
 | 
						|
    internal init(
 | 
						|
        variant: Variant,
 | 
						|
        publicKey: String,
 | 
						|
        data: Data,
 | 
						|
        timestampMs: Int64
 | 
						|
    ) {
 | 
						|
        self.variant = variant
 | 
						|
        self.publicKey = publicKey
 | 
						|
        self.data = data
 | 
						|
        self.timestampMs = timestampMs
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: - Convenience
 | 
						|
 | 
						|
public extension ConfigDump.Variant {
 | 
						|
    static let userVariants: [ConfigDump.Variant] = [
 | 
						|
        .userProfile, .contacts, .convoInfoVolatile, .userGroups
 | 
						|
    ]
 | 
						|
    
 | 
						|
    var configMessageKind: SharedConfigMessage.Kind {
 | 
						|
        switch self {
 | 
						|
            case .userProfile: return .userProfile
 | 
						|
            case .contacts: return .contacts
 | 
						|
            case .convoInfoVolatile: return .convoInfoVolatile
 | 
						|
            case .userGroups: return .userGroups
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    var namespace: SnodeAPI.Namespace {
 | 
						|
        switch self {
 | 
						|
            case .userProfile: return SnodeAPI.Namespace.configUserProfile
 | 
						|
            case .contacts: return SnodeAPI.Namespace.configContacts
 | 
						|
            case .convoInfoVolatile: return SnodeAPI.Namespace.configConvoInfoVolatile
 | 
						|
            case .userGroups: return SnodeAPI.Namespace.configUserGroups
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    /// This value defines the order that the SharedConfigMessages should be processed in, while we re-process config
 | 
						|
    /// messages every time we poll this will prevent an edge-case where data/logic between different config messages
 | 
						|
    /// could be dependant on each other (eg. there could be `convoInfoVolatile` data related to a new conversation
 | 
						|
    /// which hasn't been created yet because it's associated `contacts`/`userGroups` message hasn't yet been
 | 
						|
    /// processed (without this we would have to wait until the next poll for it to be processed correctly)
 | 
						|
    var processingOrder: Int {
 | 
						|
        switch self {
 | 
						|
            case .userProfile, .contacts: return 0
 | 
						|
            case .userGroups: return 1
 | 
						|
            case .convoInfoVolatile: return 2
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |