From 2f9b38e823c5512ae6d98e4313b888ca7531157a Mon Sep 17 00:00:00 2001 From: Bruno Muniz Azevedo Filho <bruno@elixxir.io> Date: Wed, 22 Jun 2022 00:28:01 -0300 Subject: [PATCH] Removed database target --- .../Session/Session+Contacts.swift | 1 - Sources/Integration/Session/Session.swift | 59 +- Sources/Integration/Session/SessionType.swift | 11 - Sources/Models/Attachment.swift | 98 +-- Sources/Models/Contact.swift | 246 +++--- Sources/Models/FileTransfer.swift | 74 +- Sources/Models/Group.swift | 84 +-- Sources/Models/GroupChatInfo.swift | 44 +- Sources/Models/GroupMember.swift | 84 +-- Sources/Models/GroupMessage.swift | 112 +-- Sources/Models/Message.swift | 140 ++-- Sources/Models/Payload.swift | 78 +- Sources/Models/Reply.swift | 38 +- Sources/Models/SingleChatInfo.swift | 36 +- Sources/PushFeature/PushHandler.swift | 1 - .../xcshareddata/swiftpm/Package.resolved | 700 +++++++++--------- 16 files changed, 872 insertions(+), 934 deletions(-) diff --git a/Sources/Integration/Session/Session+Contacts.swift b/Sources/Integration/Session/Session+Contacts.swift index 53204708..c78c8fa3 100644 --- a/Sources/Integration/Session/Session+Contacts.swift +++ b/Sources/Integration/Session/Session+Contacts.swift @@ -1,7 +1,6 @@ import Retry import Models import Shared -import Database import Foundation extension Session { diff --git a/Sources/Integration/Session/Session.swift b/Sources/Integration/Session/Session.swift index 2982b295..bb47d124 100644 --- a/Sources/Integration/Session/Session.swift +++ b/Sources/Integration/Session/Session.swift @@ -3,7 +3,7 @@ import Models import Shared import Combine import Defaults -import Database +import XXModels import Foundation import BackupFeature import NetworkMonitor @@ -52,7 +52,7 @@ public final class Session: SessionType { @Dependency var networkMonitor: NetworkMonitoring public let client: Client - public let dbManager: DatabaseManager + public let dbManager: Database private var cancellables = Set<AnyCancellable>() public var myId: Data { client.bindings.myId } @@ -76,61 +76,6 @@ public final class Session: SessionType { networkMonitor.statusPublisher.map { $0 == .available }.eraseToAnyPublisher() } - public func groups(_ request: Group.Request) -> AnyPublisher<[Group], Never> { - self.dbManager - .publisher(fetch: Group.self, request) - .catch { _ in Just([]) } - .eraseToAnyPublisher() - } - - public func groupMembers(_ request: GroupMember.Request) -> AnyPublisher<[GroupMember], Never> { - self.dbManager - .publisher(fetch: GroupMember.self, request) - .catch { _ in Just([]) } - .eraseToAnyPublisher() - } - - lazy public var contacts: (Contact.Request) -> AnyPublisher<[Contact], Never> = { - self.dbManager.publisher(fetch: Contact.self, $0).catch { _ in Just([]) }.eraseToAnyPublisher() - } - - lazy public var singleMessages: (Contact) -> AnyPublisher<[Message], Never> = { - self.dbManager.publisher(fetch: Message.self, .withContact($0.userId)).catch { _ in Just([]) }.eraseToAnyPublisher() - } - - lazy public var groupMessages: (Group) -> AnyPublisher<[GroupMessage], Never> = { - self.dbManager.publisher(fetch: GroupMessage.self, .fromGroup($0.groupId)).catch { _ in Just([]) }.eraseToAnyPublisher() - } - - lazy public var groupChats: (GroupChatInfo.Request) -> AnyPublisher<[GroupChatInfo], Never> = { - self.dbManager.publisher(fetch: GroupChatInfo.self, $0).catch { _ in Just([]) }.eraseToAnyPublisher() - } - - lazy public var singleChats: (SingleChatInfo.Request) -> AnyPublisher<[SingleChatInfo], Never> = { _ in - self.dbManager.publisher(fetch: Contact.self, .friends) - .flatMap { [unowned self] contactList -> AnyPublisher<[SingleChatInfo], Error> in - let contactIds = contactList.map { $0.userId } - - let messagesPublisher: AnyPublisher<[Message], Error> = dbManager - .publisher(fetch: .latestOnesFromContactIds(contactIds)) - .map { $0.sorted(by: { $0.timestamp > $1.timestamp }) } - .eraseToAnyPublisher() - - return messagesPublisher.map { messages -> [SingleChatInfo] in - contactList.map { contact -> SingleChatInfo in - SingleChatInfo(contact: contact, lastMessage: messages.first { - $0.sender == contact.userId || $0.receiver == contact.userId - }) - } - } - .eraseToAnyPublisher() - } - .catch { _ in Just([]) } - .map { $0.filter { $0.lastMessage != nil }} - .map { $0.sorted(by: { $0.lastMessage!.timestamp > $1.lastMessage!.timestamp })} - .eraseToAnyPublisher() - } - public init( passphrase: String, backupFile: Data, diff --git a/Sources/Integration/Session/SessionType.swift b/Sources/Integration/Session/SessionType.swift index 12146949..e32ecf0a 100644 --- a/Sources/Integration/Session/SessionType.swift +++ b/Sources/Integration/Session/SessionType.swift @@ -1,6 +1,5 @@ import Models import Combine -import Database import Foundation public protocol SessionType { @@ -10,16 +9,6 @@ public protocol SessionType { var hasRunningTasks: Bool { get } var isOnline: AnyPublisher<Bool, Never> { get } - var contacts: (Contact.Request) -> AnyPublisher<[Contact], Never> { get } - var singleMessages: (Contact) -> AnyPublisher<[Message], Never> { get } - var singleChats: (SingleChatInfo.Request) -> AnyPublisher<[SingleChatInfo], Never> { get } - - func groupMembers(_: GroupMember.Request) -> AnyPublisher<[GroupMember], Never> - - func groups(_: Group.Request) -> AnyPublisher<[Group], Never> - var groupMessages: (Group) -> AnyPublisher<[GroupMessage], Never> { get } - var groupChats: (GroupChatInfo.Request) -> AnyPublisher<[GroupChatInfo], Never> { get } - func deleteMyself() throws func getId(from: Data) -> Data? diff --git a/Sources/Models/Attachment.swift b/Sources/Models/Attachment.swift index 5e4d0689..92eb3c09 100644 --- a/Sources/Models/Attachment.swift +++ b/Sources/Models/Attachment.swift @@ -1,49 +1,49 @@ -//import Foundation -// -//public struct Attachment: Codable, Equatable, Hashable { -// -// public enum Extension: Int64, Codable, CaseIterable { -// case image -// case audio -// -// public static func from(_ string: String) -> Extension? { -// self.allCases.first{ $0.written == string } -// } -// -// public var written: String { -// switch self { -// case .image: -// return "jpeg" -// case .audio: -// return "m4a" -// } -// } -// -// public var writtenExtended: String { -// switch self { -// case .image: -// return "image" -// case .audio: -// return "voice message" -// } -// } -// } -// -// public let data: Data? -// public let name: String -// public var transferId: Data? -// public let _extension: Extension -// public var progress: Float = 0.0 -// -// public init( -// name: String, -// data: Data? = nil, -// transferId: Data? = nil, -// _extension: Extension -// ) { -// self.data = data -// self.name = name -// self._extension = _extension -// self.transferId = transferId -// } -//} +import Foundation + +public struct Attachment: Codable, Equatable, Hashable { + + public enum Extension: Int64, Codable, CaseIterable { + case image + case audio + + public static func from(_ string: String) -> Extension? { + self.allCases.first{ $0.written == string } + } + + public var written: String { + switch self { + case .image: + return "jpeg" + case .audio: + return "m4a" + } + } + + public var writtenExtended: String { + switch self { + case .image: + return "image" + case .audio: + return "voice message" + } + } + } + + public let data: Data? + public let name: String + public var transferId: Data? + public let _extension: Extension + public var progress: Float = 0.0 + + public init( + name: String, + data: Data? = nil, + transferId: Data? = nil, + _extension: Extension + ) { + self.data = data + self.name = name + self._extension = _extension + self.transferId = transferId + } +} diff --git a/Sources/Models/Contact.swift b/Sources/Models/Contact.swift index 754bf91d..1959743e 100644 --- a/Sources/Models/Contact.swift +++ b/Sources/Models/Contact.swift @@ -1,123 +1,123 @@ -//import UIKit -//import DifferenceKit -// -//public protocol IndexableItem { -// var indexedOn: NSString { get } -//} -// -//public class IndexedListCollator<Item: IndexableItem> { -// private final class CollationWrapper: NSObject { -// let value: Any -// @objc let indexedOn: NSString -// -// init(value: Any, indexedOn: NSString) { -// self.value = value -// self.indexedOn = indexedOn -// } -// -// func unwrappedValue<UnwrappedType>() -> UnwrappedType { -// return value as! UnwrappedType -// } -// } -// -// public init() {} -// -// public func sectioned(items: [Item]) -> (sections: [[Item]], collation: UILocalizedIndexedCollation) { -// let collation = UILocalizedIndexedCollation.current() -// let selector = #selector(getter: CollationWrapper.indexedOn) -// -// let wrappedItems = items.map { item in -// CollationWrapper(value: item, indexedOn: item.indexedOn) -// } -// -// let sortedObjects = collation.sortedArray(from: wrappedItems, collationStringSelector: selector) as! [CollationWrapper] -// -// var sections = collation.sectionIndexTitles.map { _ in [Item]() } -// sortedObjects.forEach { item in -// let sectionNumber = collation.section(for: item, collationStringSelector: selector) -// sections[sectionNumber].append(item.unwrappedValue()) -// } -// -// return (sections: sections.filter { !$0.isEmpty }, collation: collation) -// } -//} -// -//public struct Contact: Codable, Hashable, Equatable { -// public enum Request { -// case all -// case failed -// case friends -// case received -// case requested -// case isRecent -// case verificationInProgress -// case withUserId(Data) -// case withUserIds([Data]) -// case withUsername(String) -// } -// -// public enum Status: Int64, Codable { -// case friend -// case stranger -// case verified -// case verificationFailed -// case verificationInProgress -// case requested -// case requesting -// case requestFailed -// case confirming -// case confirmationFailed -// case hidden -// } -// -// public var id: Int64? -// public var photo: Data? -// public let userId: Data -// public var email: String? -// public var phone: String? -// public var status: Status -// public var marshaled: Data -// public var createdAt: Date -// public let username: String -// public var nickname: String? -// public var isRecent: Bool -// -// public init( -// photo: Data?, -// userId: Data, -// email: String?, -// phone: String?, -// status: Status, -// marshaled: Data, -// username: String, -// nickname: String?, -// createdAt: Date, -// isRecent: Bool -// ) { -// self.email = email -// self.phone = phone -// self.photo = photo -// self.status = status -// self.userId = userId -// self.username = username -// self.nickname = nickname -// self.marshaled = marshaled -// self.createdAt = createdAt -// self.isRecent = isRecent -// } -// -// public var differenceIdentifier: Data { userId } -// -// public static var databaseTableName: String { "contacts" } -//} -// -//extension Contact: Differentiable {} -//extension Contact: IndexableItem { -// public var indexedOn: NSString { -// guard let nickname = nickname else { -// return "\(username.first!)" as NSString -// } -// -// return "\(nickname.first!)" as NSString -// } -//} +import UIKit +import DifferenceKit + +public protocol IndexableItem { + var indexedOn: NSString { get } +} + +public class IndexedListCollator<Item: IndexableItem> { + private final class CollationWrapper: NSObject { + let value: Any + @objc let indexedOn: NSString + + init(value: Any, indexedOn: NSString) { + self.value = value + self.indexedOn = indexedOn + } + + func unwrappedValue<UnwrappedType>() -> UnwrappedType { + return value as! UnwrappedType + } + } + + public init() {} + + public func sectioned(items: [Item]) -> (sections: [[Item]], collation: UILocalizedIndexedCollation) { + let collation = UILocalizedIndexedCollation.current() + let selector = #selector(getter: CollationWrapper.indexedOn) + + let wrappedItems = items.map { item in + CollationWrapper(value: item, indexedOn: item.indexedOn) + } + + let sortedObjects = collation.sortedArray(from: wrappedItems, collationStringSelector: selector) as! [CollationWrapper] + + var sections = collation.sectionIndexTitles.map { _ in [Item]() } + sortedObjects.forEach { item in + let sectionNumber = collation.section(for: item, collationStringSelector: selector) + sections[sectionNumber].append(item.unwrappedValue()) + } + + return (sections: sections.filter { !$0.isEmpty }, collation: collation) + } +} + +public struct Contact: Codable, Hashable, Equatable { + public enum Request { + case all + case failed + case friends + case received + case requested + case isRecent + case verificationInProgress + case withUserId(Data) + case withUserIds([Data]) + case withUsername(String) + } + + public enum Status: Int64, Codable { + case friend + case stranger + case verified + case verificationFailed + case verificationInProgress + case requested + case requesting + case requestFailed + case confirming + case confirmationFailed + case hidden + } + + public var id: Int64? + public var photo: Data? + public let userId: Data + public var email: String? + public var phone: String? + public var status: Status + public var marshaled: Data + public var createdAt: Date + public let username: String + public var nickname: String? + public var isRecent: Bool + + public init( + photo: Data?, + userId: Data, + email: String?, + phone: String?, + status: Status, + marshaled: Data, + username: String, + nickname: String?, + createdAt: Date, + isRecent: Bool + ) { + self.email = email + self.phone = phone + self.photo = photo + self.status = status + self.userId = userId + self.username = username + self.nickname = nickname + self.marshaled = marshaled + self.createdAt = createdAt + self.isRecent = isRecent + } + + public var differenceIdentifier: Data { userId } + + public static var databaseTableName: String { "contacts" } +} + +extension Contact: Differentiable {} +extension Contact: IndexableItem { + public var indexedOn: NSString { + guard let nickname = nickname else { + return "\(username.first!)" as NSString + } + + return "\(nickname.first!)" as NSString + } +} diff --git a/Sources/Models/FileTransfer.swift b/Sources/Models/FileTransfer.swift index 8eb06ba2..79fac5d1 100644 --- a/Sources/Models/FileTransfer.swift +++ b/Sources/Models/FileTransfer.swift @@ -1,37 +1,37 @@ -//import Foundation -// -//public struct FileTransfer { -// public enum Request { -// case withTID(Data) -// case withContactId(Data) -// } -// -// public var tid: Data -// public var id: Int64? -// public var contact: Data -// public var fileName: String -// public var fileType: String -// public var isIncoming: Bool -// -// public static var databaseTableName: String { "transfers" } -// -// public init( -// id: Int64? = nil, -// tid: Data, -// contact: Data, -// fileName: String, -// fileType: String, -// isIncoming: Bool -// ) { -// self.id = id -// self.tid = tid -// self.contact = contact -// self.fileName = fileName -// self.fileType = fileType -// self.isIncoming = isIncoming -// } -//} -// -//extension FileTransfer: Codable {} -//extension FileTransfer: Hashable {} -//extension FileTransfer: Equatable {} +import Foundation + +public struct FileTransfer { + public enum Request { + case withTID(Data) + case withContactId(Data) + } + + public var tid: Data + public var id: Int64? + public var contact: Data + public var fileName: String + public var fileType: String + public var isIncoming: Bool + + public static var databaseTableName: String { "transfers" } + + public init( + id: Int64? = nil, + tid: Data, + contact: Data, + fileName: String, + fileType: String, + isIncoming: Bool + ) { + self.id = id + self.tid = tid + self.contact = contact + self.fileName = fileName + self.fileType = fileType + self.isIncoming = isIncoming + } +} + +extension FileTransfer: Codable {} +extension FileTransfer: Hashable {} +extension FileTransfer: Equatable {} diff --git a/Sources/Models/Group.swift b/Sources/Models/Group.swift index 20634688..feda834c 100644 --- a/Sources/Models/Group.swift +++ b/Sources/Models/Group.swift @@ -1,42 +1,42 @@ -//import Foundation -//import KeychainAccess -// -//public struct Group: Codable, Equatable, Hashable { -// public enum Status: Int64, Codable { -// case hidden -// case pending -// case deleting -// case participating -// } -// -// public enum Request { -// case pending -// case accepted -// case withGroupId(Data) -// } -// -// public var id: Int64? -// public var name: String -// public var leader: Data -// public var groupId: Data -// public var status: Status -// public var serialize: Data -// public var createdAt: Date -// public static var databaseTableName: String { "groups" } -// -// public init( -// leader: Data, -// name: String, -// groupId: Data, -// status: Status, -// createdAt: Date, -// serialize: Data -// ) { -// self.name = name -// self.leader = leader -// self.status = status -// self.groupId = groupId -// self.createdAt = createdAt -// self.serialize = serialize -// } -//} +import Foundation +import KeychainAccess + +public struct Group: Codable, Equatable, Hashable { + public enum Status: Int64, Codable { + case hidden + case pending + case deleting + case participating + } + + public enum Request { + case pending + case accepted + case withGroupId(Data) + } + + public var id: Int64? + public var name: String + public var leader: Data + public var groupId: Data + public var status: Status + public var serialize: Data + public var createdAt: Date + public static var databaseTableName: String { "groups" } + + public init( + leader: Data, + name: String, + groupId: Data, + status: Status, + createdAt: Date, + serialize: Data + ) { + self.name = name + self.leader = leader + self.status = status + self.groupId = groupId + self.createdAt = createdAt + self.serialize = serialize + } +} diff --git a/Sources/Models/GroupChatInfo.swift b/Sources/Models/GroupChatInfo.swift index e2d56675..9b39ff6d 100644 --- a/Sources/Models/GroupChatInfo.swift +++ b/Sources/Models/GroupChatInfo.swift @@ -1,22 +1,22 @@ -//import Foundation -// -//public struct GroupChatInfo: Codable, Equatable, Hashable { -// public enum Request { -// case accepted -// case fromGroup(Data) -// } -// -// public var group: Group -// public var members: [GroupMember] -// public var lastMessage: GroupMessage? -// -// public init( -// group: Group, -// members: [GroupMember], -// lastMessage: GroupMessage? = nil -// ) { -// self.group = group -// self.members = members -// self.lastMessage = lastMessage -// } -//} +import Foundation + +public struct GroupChatInfo: Codable, Equatable, Hashable { + public enum Request { + case accepted + case fromGroup(Data) + } + + public var group: Group + public var members: [GroupMember] + public var lastMessage: GroupMessage? + + public init( + group: Group, + members: [GroupMember], + lastMessage: GroupMessage? = nil + ) { + self.group = group + self.members = members + self.lastMessage = lastMessage + } +} diff --git a/Sources/Models/GroupMember.swift b/Sources/Models/GroupMember.swift index c0f7123f..25c619f3 100644 --- a/Sources/Models/GroupMember.swift +++ b/Sources/Models/GroupMember.swift @@ -1,42 +1,42 @@ -//import Foundation -// -//public struct GroupMember { -// public enum Request { -// case all -// case strangers -// case fromGroup(Data) -// case withUserId(Data) -// } -// -// public enum Status: Int64, Codable { -// case usernameSet -// case pendingUsername -// } -// -// public var id: Int64? -// public var userId: Data -// public var groupId: Data -// public var status: Status -// public var username: String -// public var photo: Data? -// -// public init( -// id: Int64? = nil, -// userId: Data, -// groupId: Data, -// status: Status, -// username: String, -// photo: Data? = nil -// ) { -// self.id = id -// self.userId = userId -// self.groupId = groupId -// self.username = username -// self.status = status -// self.photo = photo -// } -//} -// -//extension GroupMember: Codable {} -//extension GroupMember: Hashable {} -//extension GroupMember: Equatable {} +import Foundation + +public struct GroupMember { + public enum Request { + case all + case strangers + case fromGroup(Data) + case withUserId(Data) + } + + public enum Status: Int64, Codable { + case usernameSet + case pendingUsername + } + + public var id: Int64? + public var userId: Data + public var groupId: Data + public var status: Status + public var username: String + public var photo: Data? + + public init( + id: Int64? = nil, + userId: Data, + groupId: Data, + status: Status, + username: String, + photo: Data? = nil + ) { + self.id = id + self.userId = userId + self.groupId = groupId + self.username = username + self.status = status + self.photo = photo + } +} + +extension GroupMember: Codable {} +extension GroupMember: Hashable {} +extension GroupMember: Equatable {} diff --git a/Sources/Models/GroupMessage.swift b/Sources/Models/GroupMessage.swift index 771d4ceb..ffdb6df4 100644 --- a/Sources/Models/GroupMessage.swift +++ b/Sources/Models/GroupMessage.swift @@ -1,56 +1,56 @@ -//import Foundation -// -//public struct GroupMessage: Codable, Equatable, Hashable { -// public enum Request { -// case withUniqueId(Data) -// case id(Int64) -// case sending -// case fromGroup(Data) -// case unreadsFromGroup(Data) -// } -// -// public static var databaseTableName: String { "groupMessages" } -// -// public enum Status: Int64, Codable { -// case sent -// case read -// case failed -// case sending -// case received -// } -// -// public var id: Int64? -// public var uniqueId: Data? -// public var groupId: Data -// public var sender: Data -// public var roundId: Int64? -// public var payload: Payload -// public var status: Status -// public var roundURL: String? -// public var unread: Bool -// public var timestamp: Int -// -// public init( -// id: Int64? = nil, -// sender: Data, -// groupId: Data, -// payload: Payload, -// unread: Bool, -// timestamp: Int = 0, -// uniqueId: Data?, -// status: Status, -// roundId: Int64? = nil, -// roundURL: String? = nil -// ) { -// self.id = id -// self.sender = sender -// self.groupId = groupId -// self.payload = payload -// self.unread = unread -// self.timestamp = timestamp -// self.uniqueId = uniqueId -// self.status = status -// self.roundId = roundId -// self.roundURL = roundURL -// } -//} +import Foundation + +public struct GroupMessage: Codable, Equatable, Hashable { + public enum Request { + case withUniqueId(Data) + case id(Int64) + case sending + case fromGroup(Data) + case unreadsFromGroup(Data) + } + + public static var databaseTableName: String { "groupMessages" } + + public enum Status: Int64, Codable { + case sent + case read + case failed + case sending + case received + } + + public var id: Int64? + public var uniqueId: Data? + public var groupId: Data + public var sender: Data + public var roundId: Int64? + public var payload: Payload + public var status: Status + public var roundURL: String? + public var unread: Bool + public var timestamp: Int + + public init( + id: Int64? = nil, + sender: Data, + groupId: Data, + payload: Payload, + unread: Bool, + timestamp: Int = 0, + uniqueId: Data?, + status: Status, + roundId: Int64? = nil, + roundURL: String? = nil + ) { + self.id = id + self.sender = sender + self.groupId = groupId + self.payload = payload + self.unread = unread + self.timestamp = timestamp + self.uniqueId = uniqueId + self.status = status + self.roundId = roundId + self.roundURL = roundURL + } +} diff --git a/Sources/Models/Message.swift b/Sources/Models/Message.swift index 77ae89db..fec18587 100644 --- a/Sources/Models/Message.swift +++ b/Sources/Models/Message.swift @@ -1,70 +1,70 @@ -//import Foundation -//import DifferenceKit -// -//public struct Message: Codable, Equatable, Hashable { -// public enum Request { -// case sending -// case withUniqueId(Data) -// case withId(Int64) -// case sendingAttachment -// case withContact(Data) -// case unreadsFromContactId(Data) -// case latestOnesFromContactIds([Data]) -// } -// -// public enum Status: Int64, Codable { -// case read -// case sent -// case sending -// case sendingAttachment -// case receivingAttachment -// case received -// case failedToSend -// case timedOut -// } -// -// public var id: Int64? -// public var unread: Bool -// public let sender: Data -// public var roundURL: String? -// public var report: Data? -// public var status: Status -// public let receiver: Data -// public var timestamp: Int -// public var uniqueId: Data? -// public var payload: Payload -// public static var databaseTableName: String { "messages" } -// -// public init ( -// sender: Data, -// receiver: Data, -// payload: Payload, -// unread: Bool, -// timestamp: Int, -// uniqueId: Data?, -// status: Status, -// roundURL: String? = nil -// ) { -// self.sender = sender -// self.unread = unread -// self.status = status -// self.payload = payload -// self.receiver = receiver -// self.uniqueId = uniqueId -// self.timestamp = timestamp -// self.roundURL = roundURL -// } -//} -// -//public extension Message.Status { -// var canReply: Bool { -// switch self { -// case .sent, .received, .read: -// return true -// default: -// return false -// } -// } -//} -// -//extension Message: Differentiable {} +import Foundation +import DifferenceKit + +public struct Message: Codable, Equatable, Hashable { + public enum Request { + case sending + case withUniqueId(Data) + case withId(Int64) + case sendingAttachment + case withContact(Data) + case unreadsFromContactId(Data) + case latestOnesFromContactIds([Data]) + } + + public enum Status: Int64, Codable { + case read + case sent + case sending + case sendingAttachment + case receivingAttachment + case received + case failedToSend + case timedOut + } + + public var id: Int64? + public var unread: Bool + public let sender: Data + public var roundURL: String? + public var report: Data? + public var status: Status + public let receiver: Data + public var timestamp: Int + public var uniqueId: Data? + public var payload: Payload + public static var databaseTableName: String { "messages" } + + public init ( + sender: Data, + receiver: Data, + payload: Payload, + unread: Bool, + timestamp: Int, + uniqueId: Data?, + status: Status, + roundURL: String? = nil + ) { + self.sender = sender + self.unread = unread + self.status = status + self.payload = payload + self.receiver = receiver + self.uniqueId = uniqueId + self.timestamp = timestamp + self.roundURL = roundURL + } +} + +public extension Message.Status { + var canReply: Bool { + switch self { + case .sent, .received, .read: + return true + default: + return false + } + } +} + +extension Message: Differentiable {} diff --git a/Sources/Models/Payload.swift b/Sources/Models/Payload.swift index fac93d27..4fda3b78 100644 --- a/Sources/Models/Payload.swift +++ b/Sources/Models/Payload.swift @@ -1,39 +1,39 @@ -//import Foundation -// -//public struct Payload: Codable, Equatable, Hashable { -// public var text: String -// public var reply: Reply? -// public var attachment: Attachment? -// -// public init(text: String, reply: Reply?, attachment: Attachment?) { -// self.text = text -// self.reply = reply -// self.attachment = attachment -// } -// -// public init(with marshaled: Data) throws { -// let proto = try CMIXText(serializedData: marshaled) -// -// var reply: Reply? -// -// if proto.hasReply { -// reply = Reply( -// messageId: proto.reply.messageID, -// senderId: proto.reply.senderID -// ) -// } -// -// self.init(text: proto.text, reply: reply, attachment: nil) -// } -// -// public func asData() -> Data { -// var protoModel = CMIXText() -// protoModel.text = text -// -// if let reply = reply { -// protoModel.reply = reply.asTextReply() -// } -// -// return try! protoModel.serializedData() -// } -//} +import Foundation + +public struct Payload: Codable, Equatable, Hashable { + public var text: String + public var reply: Reply? + public var attachment: Attachment? + + public init(text: String, reply: Reply?, attachment: Attachment?) { + self.text = text + self.reply = reply + self.attachment = attachment + } + + public init(with marshaled: Data) throws { + let proto = try CMIXText(serializedData: marshaled) + + var reply: Reply? + + if proto.hasReply { + reply = Reply( + messageId: proto.reply.messageID, + senderId: proto.reply.senderID + ) + } + + self.init(text: proto.text, reply: reply, attachment: nil) + } + + public func asData() -> Data { + var protoModel = CMIXText() + protoModel.text = text + + if let reply = reply { + protoModel.reply = reply.asTextReply() + } + + return try! protoModel.serializedData() + } +} diff --git a/Sources/Models/Reply.swift b/Sources/Models/Reply.swift index 6b71cad6..22fcf55a 100644 --- a/Sources/Models/Reply.swift +++ b/Sources/Models/Reply.swift @@ -1,19 +1,19 @@ -//import Foundation -// -//public struct Reply: Codable, Equatable, Hashable { -// public let messageId: Data -// public let senderId: Data -// -// public init(messageId: Data, senderId: Data) { -// self.messageId = messageId -// self.senderId = senderId -// } -// -// func asTextReply() -> TextReply { -// var reply = TextReply() -// reply.messageID = messageId -// reply.senderID = senderId -// -// return reply -// } -//} +import Foundation + +public struct Reply: Codable, Equatable, Hashable { + public let messageId: Data + public let senderId: Data + + public init(messageId: Data, senderId: Data) { + self.messageId = messageId + self.senderId = senderId + } + + func asTextReply() -> TextReply { + var reply = TextReply() + reply.messageID = messageId + reply.senderID = senderId + + return reply + } +} diff --git a/Sources/Models/SingleChatInfo.swift b/Sources/Models/SingleChatInfo.swift index 79fc4ba0..21c7f7d2 100644 --- a/Sources/Models/SingleChatInfo.swift +++ b/Sources/Models/SingleChatInfo.swift @@ -1,18 +1,18 @@ -//import Foundation -// -//public struct SingleChatInfo: Codable, Equatable, Hashable { -// public enum Request { -// case all -// } -// -// public var contact: Contact -// public var lastMessage: Message? -// -// public init( -// contact: Contact, -// lastMessage: Message? -// ) { -// self.contact = contact -// self.lastMessage = lastMessage -// } -//} +import Foundation + +public struct SingleChatInfo: Codable, Equatable, Hashable { + public enum Request { + case all + } + + public var contact: Contact + public var lastMessage: Message? + + public init( + contact: Contact, + lastMessage: Message? + ) { + self.contact = contact + self.lastMessage = lastMessage + } +} diff --git a/Sources/PushFeature/PushHandler.swift b/Sources/PushFeature/PushHandler.swift index bb0b19cd..fcf5e150 100644 --- a/Sources/PushFeature/PushHandler.swift +++ b/Sources/PushFeature/PushHandler.swift @@ -1,7 +1,6 @@ import UIKit import Models import Defaults -import Database import Integration import DependencyInjection diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved index d7628f46..e65586a6 100644 --- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,349 +1,355 @@ { - "object": { - "pins": [ - { - "package": "abseil", - "repositoryURL": "https://github.com/firebase/abseil-cpp-SwiftPM.git", - "state": { - "branch": null, - "revision": "fffc3c2729be5747390ad02d5100291a0d9ad26a", - "version": "0.20200225.4" - } - }, - { - "package": "Alamofire", - "repositoryURL": "https://github.com/Alamofire/Alamofire.git", - "state": { - "branch": null, - "revision": "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864", - "version": "5.5.0" - } - }, - { - "package": "AppAuth", - "repositoryURL": "https://github.com/openid/AppAuth-iOS.git", - "state": { - "branch": null, - "revision": "01131d68346c8ae552961c768d583c715fbe1410", - "version": "1.4.0" - } - }, - { - "package": "BoringSSL-GRPC", - "repositoryURL": "https://github.com/firebase/boringssl-SwiftPM.git", - "state": { - "branch": null, - "revision": "734a8247442fde37df4364c21f6a0085b6a36728", - "version": "0.7.2" - } - }, - { - "package": "ChatLayout", - "repositoryURL": "https://github.com/ekazaev/ChatLayout", - "state": { - "branch": null, - "revision": "d0edb6f3ae716a26842467c540a6bee909b80360", - "version": "1.1.14" - } - }, - { - "package": "combine-schedulers", - "repositoryURL": "https://github.com/pointfreeco/combine-schedulers", - "state": { - "branch": null, - "revision": "4cf088c29a20f52be0f2ca54992b492c54e0076b", - "version": "0.5.3" - } - }, - { - "package": "CwlCatchException", - "repositoryURL": "https://github.com/mattgallagher/CwlCatchException.git", - "state": { - "branch": null, - "revision": "35f9e770f54ce62dd8526470f14c6e137cef3eea", - "version": "2.1.1" - } - }, - { - "package": "CwlPreconditionTesting", - "repositoryURL": "https://github.com/mattgallagher/CwlPreconditionTesting.git", - "state": { - "branch": null, - "revision": "fb7a26374e8570ff5c68142e5c83406d6abae0d8", - "version": "2.0.2" - } - }, - { - "package": "DifferenceKit", - "repositoryURL": "https://github.com/ra1028/DifferenceKit", - "state": { - "branch": null, - "revision": "62745d7780deef4a023a792a1f8f763ec7bf9705", - "version": "1.2.0" - } - }, - { - "package": "FilesProvider", - "repositoryURL": "https://github.com/amosavian/FileProvider.git", - "state": { - "branch": null, - "revision": "abf68a62541a4193c8d106367ddb3648e8ab693f", - "version": "0.26.0" - } - }, - { - "package": "Firebase", - "repositoryURL": "https://github.com/firebase/firebase-ios-sdk.git", - "state": { - "branch": null, - "revision": "08686f04881483d2bc098b2696e674c0ba135e47", - "version": "8.10.0" - } - }, - { - "package": "GoogleAPIClientForREST", - "repositoryURL": "https://github.com/google/google-api-objectivec-client-for-rest", - "state": { - "branch": null, - "revision": "22e0bb02729d60db396e8b90d8189313cd86ba53", - "version": "1.6.0" - } - }, - { - "package": "GoogleAppMeasurement", - "repositoryURL": "https://github.com/google/GoogleAppMeasurement.git", - "state": { - "branch": null, - "revision": "9b2f6aca5b4685c45f9f5481f19bee8e7982c538", - "version": "8.9.1" - } - }, - { - "package": "GoogleDataTransport", - "repositoryURL": "https://github.com/google/GoogleDataTransport.git", - "state": { - "branch": null, - "revision": "15ccdfd25ac55b9239b82809531ff26605e7556e", - "version": "9.1.2" - } - }, - { - "package": "GoogleSignIn", - "repositoryURL": "https://github.com/google/GoogleSignIn-iOS", - "state": { - "branch": null, - "revision": "60ca2bfd218ccb194a746a79b41d9d50eb7e3af0", - "version": "6.1.0" - } - }, - { - "package": "GoogleUtilities", - "repositoryURL": "https://github.com/google/GoogleUtilities.git", - "state": { - "branch": null, - "revision": "b3bb0c5551fb3f80ca939829639ab5b093edd14f", - "version": "7.7.0" - } - }, - { - "package": "GRDB", - "repositoryURL": "https://github.com/groue/GRDB.swift", - "state": { - "branch": null, - "revision": "32b2923e890df320906e64cbd0faca22a8bfda14", - "version": "5.12.0" - } - }, - { - "package": "gRPC", - "repositoryURL": "https://github.com/firebase/grpc-SwiftPM.git", - "state": { - "branch": null, - "revision": "fb405dd2c7901485f7e158b24e3a0a47e4efd8b5", - "version": "1.28.4" - } - }, - { - "package": "GTMSessionFetcher", - "repositoryURL": "https://github.com/google/gtm-session-fetcher.git", - "state": { - "branch": null, - "revision": "bc6a19702ac76ac4e488b68148710eb815f9bc56", - "version": "1.7.0" - } - }, - { - "package": "GTMAppAuth", - "repositoryURL": "https://github.com/google/GTMAppAuth.git", - "state": { - "branch": null, - "revision": "40f4103fb52109032c05599a0c39ad43edbdf80a", - "version": "1.2.2" - } - }, - { - "package": "KeychainAccess", - "repositoryURL": "https://github.com/kishikawakatsumi/KeychainAccess", - "state": { - "branch": null, - "revision": "84e546727d66f1adc5439debad16270d0fdd04e7", - "version": "4.2.2" - } - }, - { - "package": "leveldb", - "repositoryURL": "https://github.com/firebase/leveldb.git", - "state": { - "branch": null, - "revision": "0706abcc6b0bd9cedfbb015ba840e4a780b5159b", - "version": "1.22.2" - } - }, - { - "package": "nanopb", - "repositoryURL": "https://github.com/firebase/nanopb.git", - "state": { - "branch": null, - "revision": "7ee9ef9f627d85cbe1b8c4f49a3ed26eed216c77", - "version": "2.30908.0" - } - }, - { - "package": "Nimble", - "repositoryURL": "https://github.com/Quick/Nimble", - "state": { - "branch": null, - "revision": "c93f16c25af5770f0d3e6af27c9634640946b068", - "version": "9.2.1" - } - }, - { - "package": "Promises", - "repositoryURL": "https://github.com/google/promises.git", - "state": { - "branch": null, - "revision": "611337c330350c9c1823ad6d671e7f936af5ee13", - "version": "2.0.0" - } - }, - { - "package": "Quick", - "repositoryURL": "https://github.com/Quick/Quick", - "state": { - "branch": null, - "revision": "8cce6acd38f965f5baa3167b939f86500314022b", - "version": "3.1.2" - } - }, - { - "package": "Retry", - "repositoryURL": "https://github.com/icanzilb/Retry.git", - "state": { - "branch": null, - "revision": "3beacada357968bcf9e5a2da520abfb374188afe", - "version": "0.6.3" - } - }, - { - "package": "ScrollViewController", - "repositoryURL": "https://github.com/darrarski/ScrollViewController", - "state": { - "branch": null, - "revision": "9a52bb056504bb4766ddb5ac518097dd48736303", - "version": "1.2.0" - } - }, - { - "package": "SnapKit", - "repositoryURL": "https://github.com/SnapKit/SnapKit", - "state": { - "branch": null, - "revision": "d458564516e5676af9c70b4f4b2a9178294f1bc6", - "version": "5.0.1" - } - }, - { - "package": "swift-case-paths", - "repositoryURL": "https://github.com/pointfreeco/swift-case-paths", - "state": { - "branch": null, - "revision": "241301b67d8551c26d8f09bd2c0e52cc49f18007", - "version": "0.8.0" - } - }, - { - "package": "swift-collections", - "repositoryURL": "https://github.com/apple/swift-collections", - "state": { - "branch": null, - "revision": "48254824bb4248676bf7ce56014ff57b142b77eb", - "version": "1.0.2" - } - }, - { - "package": "swift-composable-architecture", - "repositoryURL": "https://github.com/pointfreeco/swift-composable-architecture.git", - "state": { - "branch": null, - "revision": "313dd217dcd1d0478118ec5d15225fd473c1564a", - "version": "0.32.0" - } - }, - { - "package": "swift-custom-dump", - "repositoryURL": "https://github.com/pointfreeco/swift-custom-dump", - "state": { - "branch": null, - "revision": "51698ece74ecf31959d3fa81733f0a5363ef1b4e", - "version": "0.3.0" - } - }, - { - "package": "swift-identified-collections", - "repositoryURL": "https://github.com/pointfreeco/swift-identified-collections", - "state": { - "branch": null, - "revision": "680bf440178a78a627b1c2c64c0855f6523ad5b9", - "version": "0.3.2" - } - }, - { - "package": "SwiftProtobuf", - "repositoryURL": "https://github.com/apple/swift-protobuf", - "state": { - "branch": null, - "revision": "7e2c5f3cbbeea68e004915e3a8961e20bd11d824", - "version": "1.18.0" - } - }, - { - "package": "SwiftyBeaver", - "repositoryURL": "https://github.com/SwiftyBeaver/SwiftyBeaver.git", - "state": { - "branch": null, - "revision": "2c039501d6eeb4d4cd4aec4a8d884ad28862e044", - "version": "1.9.5" - } - }, - { - "package": "SwiftyDropbox", - "repositoryURL": "https://github.com/dropbox/SwiftyDropbox.git", - "state": { - "branch": null, - "revision": "7af87d903be1cf0af0e76e0394d992943055894e", - "version": "8.2.1" - } - }, - { - "package": "xctest-dynamic-overlay", - "repositoryURL": "https://github.com/pointfreeco/xctest-dynamic-overlay", - "state": { - "branch": null, - "revision": "50a70a9d3583fe228ce672e8923010c8df2deddd", - "version": "0.2.1" - } - } - ] - }, - "version": 1 + "pins" : [ + { + "identity" : "abseil-cpp-swiftpm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/abseil-cpp-SwiftPM.git", + "state" : { + "revision" : "fffc3c2729be5747390ad02d5100291a0d9ad26a", + "version" : "0.20200225.4" + } + }, + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864", + "version" : "5.5.0" + } + }, + { + "identity" : "appauth-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/openid/AppAuth-iOS.git", + "state" : { + "revision" : "01131d68346c8ae552961c768d583c715fbe1410", + "version" : "1.4.0" + } + }, + { + "identity" : "boringssl-swiftpm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/boringssl-SwiftPM.git", + "state" : { + "revision" : "734a8247442fde37df4364c21f6a0085b6a36728", + "version" : "0.7.2" + } + }, + { + "identity" : "chatlayout", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ekazaev/ChatLayout", + "state" : { + "revision" : "d0edb6f3ae716a26842467c540a6bee909b80360", + "version" : "1.1.14" + } + }, + { + "identity" : "client-ios-db", + "kind" : "remoteSourceControl", + "location" : "https://git.xx.network/elixxir/client-ios-db.git", + "state" : { + "revision" : "e1b3b1a8d1df6d259c99289e8d09e73fbfa9fe63" + } + }, + { + "identity" : "combine-schedulers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/combine-schedulers", + "state" : { + "revision" : "4cf088c29a20f52be0f2ca54992b492c54e0076b", + "version" : "0.5.3" + } + }, + { + "identity" : "cwlcatchexception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlCatchException.git", + "state" : { + "revision" : "35f9e770f54ce62dd8526470f14c6e137cef3eea", + "version" : "2.1.1" + } + }, + { + "identity" : "cwlpreconditiontesting", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state" : { + "revision" : "fb7a26374e8570ff5c68142e5c83406d6abae0d8", + "version" : "2.0.2" + } + }, + { + "identity" : "differencekit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ra1028/DifferenceKit", + "state" : { + "revision" : "62745d7780deef4a023a792a1f8f763ec7bf9705", + "version" : "1.2.0" + } + }, + { + "identity" : "fileprovider", + "kind" : "remoteSourceControl", + "location" : "https://github.com/amosavian/FileProvider.git", + "state" : { + "revision" : "abf68a62541a4193c8d106367ddb3648e8ab693f", + "version" : "0.26.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk.git", + "state" : { + "revision" : "08686f04881483d2bc098b2696e674c0ba135e47", + "version" : "8.10.0" + } + }, + { + "identity" : "google-api-objectivec-client-for-rest", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/google-api-objectivec-client-for-rest", + "state" : { + "revision" : "22e0bb02729d60db396e8b90d8189313cd86ba53", + "version" : "1.6.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "9b2f6aca5b4685c45f9f5481f19bee8e7982c538", + "version" : "8.9.1" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "15ccdfd25ac55b9239b82809531ff26605e7556e", + "version" : "9.1.2" + } + }, + { + "identity" : "googlesignin-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleSignIn-iOS", + "state" : { + "revision" : "60ca2bfd218ccb194a746a79b41d9d50eb7e3af0", + "version" : "6.1.0" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "b3bb0c5551fb3f80ca939829639ab5b093edd14f", + "version" : "7.7.0" + } + }, + { + "identity" : "grdb.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/groue/GRDB.swift", + "state" : { + "revision" : "e02f2c8abacff2799ed14926edcbf6e76fb9f805", + "version" : "5.25.0" + } + }, + { + "identity" : "grpc-swiftpm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/grpc-SwiftPM.git", + "state" : { + "revision" : "fb405dd2c7901485f7e158b24e3a0a47e4efd8b5", + "version" : "1.28.4" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "bc6a19702ac76ac4e488b68148710eb815f9bc56", + "version" : "1.7.0" + } + }, + { + "identity" : "gtmappauth", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GTMAppAuth.git", + "state" : { + "revision" : "40f4103fb52109032c05599a0c39ad43edbdf80a", + "version" : "1.2.2" + } + }, + { + "identity" : "keychainaccess", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kishikawakatsumi/KeychainAccess", + "state" : { + "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7", + "version" : "4.2.2" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b", + "version" : "1.22.2" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "7ee9ef9f627d85cbe1b8c4f49a3ed26eed216c77", + "version" : "2.30908.0" + } + }, + { + "identity" : "nimble", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Nimble", + "state" : { + "revision" : "c93f16c25af5770f0d3e6af27c9634640946b068", + "version" : "9.2.1" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "611337c330350c9c1823ad6d671e7f936af5ee13", + "version" : "2.0.0" + } + }, + { + "identity" : "quick", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Quick/Quick", + "state" : { + "revision" : "8cce6acd38f965f5baa3167b939f86500314022b", + "version" : "3.1.2" + } + }, + { + "identity" : "retry", + "kind" : "remoteSourceControl", + "location" : "https://github.com/icanzilb/Retry.git", + "state" : { + "revision" : "3beacada357968bcf9e5a2da520abfb374188afe", + "version" : "0.6.3" + } + }, + { + "identity" : "scrollviewcontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/darrarski/ScrollViewController", + "state" : { + "revision" : "9a52bb056504bb4766ddb5ac518097dd48736303", + "version" : "1.2.0" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit", + "state" : { + "revision" : "d458564516e5676af9c70b4f4b2a9178294f1bc6", + "version" : "5.0.1" + } + }, + { + "identity" : "swift-case-paths", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-case-paths", + "state" : { + "revision" : "241301b67d8551c26d8f09bd2c0e52cc49f18007", + "version" : "0.8.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections", + "state" : { + "revision" : "48254824bb4248676bf7ce56014ff57b142b77eb", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-composable-architecture", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-composable-architecture.git", + "state" : { + "revision" : "313dd217dcd1d0478118ec5d15225fd473c1564a", + "version" : "0.32.0" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "51698ece74ecf31959d3fa81733f0a5363ef1b4e", + "version" : "0.3.0" + } + }, + { + "identity" : "swift-identified-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-identified-collections", + "state" : { + "revision" : "680bf440178a78a627b1c2c64c0855f6523ad5b9", + "version" : "0.3.2" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf", + "state" : { + "revision" : "7e2c5f3cbbeea68e004915e3a8961e20bd11d824", + "version" : "1.18.0" + } + }, + { + "identity" : "swiftybeaver", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SwiftyBeaver/SwiftyBeaver.git", + "state" : { + "revision" : "2c039501d6eeb4d4cd4aec4a8d884ad28862e044", + "version" : "1.9.5" + } + }, + { + "identity" : "swiftydropbox", + "kind" : "remoteSourceControl", + "location" : "https://github.com/dropbox/SwiftyDropbox.git", + "state" : { + "revision" : "7af87d903be1cf0af0e76e0394d992943055894e", + "version" : "8.2.1" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "50a70a9d3583fe228ce672e8923010c8df2deddd", + "version" : "0.2.1" + } + } + ], + "version" : 2 } -- GitLab