Signal-iOS/SignalServiceKit/src/Contacts/AnyThreadFinder.swift
Matthew Chen 86b8eb08b8 Remove YapDatabase.
Apply asset from design.

Fix rebase breakage.
2021-03-25 11:41:16 -03:00

66 lines
2.6 KiB
Swift

//
// Copyright (c) 2021 Open Whisper Systems. All rights reserved.
//
import Foundation
@objc
public class AnyContactThreadFinder: NSObject {
let grdbAdapter = GRDBContactThreadFinder()
}
// MARK: -
public extension AnyContactThreadFinder {
@objc(contactThreadForAddress:transaction:)
func contactThread(for address: SignalServiceAddress, transaction: SDSAnyReadTransaction) -> TSContactThread? {
switch transaction.readTransaction {
case .grdbRead(let transaction):
return grdbAdapter.contactThread(for: address, transaction: transaction)
}
}
@objc(contactThreadForUUID:transaction:)
func contactThreadForUUID(_ uuid: UUID?, transaction: SDSAnyReadTransaction) -> TSContactThread? {
switch transaction.readTransaction {
case .grdbRead(let transaction):
return grdbAdapter.contactThreadForUUID(uuid, transaction: transaction)
}
}
@objc(contactThreadForPhoneNumber:transaction:)
func contactThreadForPhoneNumber(_ phoneNumber: String?, transaction: SDSAnyReadTransaction) -> TSContactThread? {
switch transaction.readTransaction {
case .grdbRead(let transaction):
return grdbAdapter.contactThreadForPhoneNumber(phoneNumber, transaction: transaction)
}
}
}
// MARK: -
@objc
class GRDBContactThreadFinder: NSObject {
func contactThread(for address: SignalServiceAddress, transaction: GRDBReadTransaction) -> TSContactThread? {
if let thread = contactThreadForUUID(address.uuid, transaction: transaction) {
return thread
} else if let thread = contactThreadForPhoneNumber(address.phoneNumber, transaction: transaction) {
return thread
} else {
return nil
}
}
fileprivate func contactThreadForUUID(_ uuid: UUID?, transaction: GRDBReadTransaction) -> TSContactThread? {
guard let uuidString = uuid?.uuidString else { return nil }
let sql = "SELECT * FROM \(ThreadRecord.databaseTableName) WHERE \(threadColumn: .contactUUID) = ?"
return TSContactThread.grdbFetchOne(sql: sql, arguments: [uuidString], transaction: transaction) as? TSContactThread
}
fileprivate func contactThreadForPhoneNumber(_ phoneNumber: String?, transaction: GRDBReadTransaction) -> TSContactThread? {
guard let phoneNumber = phoneNumber else { return nil }
let sql = "SELECT * FROM \(ThreadRecord.databaseTableName) WHERE \(threadColumn: .contactPhoneNumber) = ?"
return TSContactThread.grdbFetchOne(sql: sql, arguments: [phoneNumber], transaction: transaction) as? TSContactThread
}
}