From 3adddfa3f08783274b625f498b0720fd1d6aced9 Mon Sep 17 00:00:00 2001 From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com> Date: Thu, 4 Jan 2018 12:24:32 -0500 Subject: [PATCH] contacts: save profile in database This patch saves profile to database when contact request is accepted. Change-Id: I6a43e63d5c9bbeed4e2c3900ec155adcd74fd098 Reviewed-by: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> --- Ring/Ring/Account/VCardUtils.swift | 19 ++++++++++++++ .../DBHelpers/ProfileDataHelper.swift | 25 +++++++++++++++++++ Ring/Ring/Database/DBManager.swift | 11 ++++++++ .../ContactRequestsViewModel.swift | 10 +------- .../Conversation/ConversationViewModel.swift | 24 +++++++++++------- Ring/Ring/Services/ContactsService.swift | 13 +++++++++- 6 files changed, 83 insertions(+), 19 deletions(-) diff --git a/Ring/Ring/Account/VCardUtils.swift b/Ring/Ring/Account/VCardUtils.swift index a3506b48d..9a360b1e3 100644 --- a/Ring/Ring/Account/VCardUtils.swift +++ b/Ring/Ring/Account/VCardUtils.swift @@ -105,4 +105,23 @@ class VCardUtils { return path } } + + class func getName(from vCard: CNContact?) -> String { + guard let vCard = vCard else { + return "" + } + var name = "" + + if !vCard.givenName.isEmpty { + name = vCard.givenName + } + + if !vCard.familyName.isEmpty { + if !name.isEmpty { + name += " " + } + name += vCard.familyName + } + return name + } } diff --git a/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift b/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift index 4d31d444e..01a181904 100644 --- a/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift +++ b/Ring/Ring/Database/DBHelpers/ProfileDataHelper.swift @@ -136,4 +136,29 @@ final class ProfileDataHelper { } return nil } + + func insertOrUpdateProfile(item: Profile) throws { + guard let dataBase = RingDB.instance.ringDB else { + throw DataAccessError.datastoreConnectionError + } + try dataBase.transaction { + let selectQuery = table.filter(uri == item.uri) + let rows = try dataBase.run(selectQuery.update(alias <- item.alias, + photo <- item.photo, + status <- item.status)) + if rows > 0 { + return + } + let insertQuery = table.insert(uri <- item.uri, + alias <- item.alias, + photo <- item.photo, + type <- item.type, + status <- item.status) + let rowId = try dataBase.run(insertQuery) + guard rowId > 0 else { + throw DataAccessError.databaseError + } + return + } + } } diff --git a/Ring/Ring/Database/DBManager.swift b/Ring/Ring/Database/DBManager.swift index f2f88ed6d..6d740524f 100644 --- a/Ring/Ring/Database/DBManager.swift +++ b/Ring/Ring/Database/DBManager.swift @@ -413,6 +413,17 @@ class DBManager { return self.interactionHepler.insertIfNotExist(item: interaction) } + func createOrUpdateRingProfile(profileUri: String, alias: String?, image: String?, status: ProfileStatus) -> Bool { + let profile = Profile(defaultID, profileUri, alias, image, ProfileType.ring.rawValue, + status.rawValue) + do { + try self.profileHepler.insertOrUpdateProfile(item: profile) + } catch { + return false + } + return true + } + private func getProfile(for profileUri: String, createIfNotExists: Bool) throws -> Profile? { if let profile = try self.profileHepler.selectProfile(accountURI: profileUri) { return profile diff --git a/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift b/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift index 9ef1b7173..7590991ee 100644 --- a/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift +++ b/Ring/Ring/Features/ContactRequests/ContactRequestsViewModel.swift @@ -79,15 +79,7 @@ class ContactRequestsViewModel: Stateable, ViewModel { self.presenceService.subscribeBuddy(withAccountId: (self.accountsService.currentAccount?.id)!, withUri: item.contactRequest.ringId, withFlag: true) - - if let vCard = item.contactRequest.vCard { - let saveVCardCompleted = self.contactsService.saveVCard(vCard: vCard, forContactWithRingId: item.contactRequest.ringId) - return Observable<Void>.zip(acceptCompleted, saveVCardCompleted) { _, _ in - return - } - } else { - return acceptCompleted.asObservable() - } + return acceptCompleted.asObservable() } func discard(withItem item: ContactRequestItem) -> Observable<Void> { diff --git a/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift b/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift index 7c9ed1669..28dff0467 100644 --- a/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift +++ b/Ring/Ring/Features/Conversations/Conversation/ConversationViewModel.swift @@ -81,15 +81,21 @@ class ConversationViewModel: ViewModel { let contact = self.contactsService.contact(withRingId: contactRingId) - self.contactsService.loadVCard(forContactWithRingId: contactRingId) - .subscribe(onSuccess: { vCard in - guard let imageData = vCard.imageData else { - self.log.warning("vCard for ringId: \(contactRingId) has no image") - return - } - self.profileImageData = imageData - }) - .disposed(by: self.disposeBag) + if let profile = conversation.value.participantProfile, let photo = profile.photo { + if let data = NSData(base64Encoded: photo, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) as Data? { + self.profileImageData = data + } + } else { + self.contactsService.loadVCard(forContactWithRingId: contactRingId) + .subscribe(onSuccess: { vCard in + guard let imageData = vCard.imageData else { + self.log.warning("vCard for ringId: \(contactRingId) has no image") + return + } + self.profileImageData = imageData + }) + .disposed(by: self.disposeBag) + } // invite and block buttons if let contact = contact { diff --git a/Ring/Ring/Services/ContactsService.swift b/Ring/Ring/Services/ContactsService.swift index 12cad8912..34b51cb0c 100644 --- a/Ring/Ring/Services/ContactsService.swift +++ b/Ring/Ring/Services/ContactsService.swift @@ -43,6 +43,7 @@ class ContactsService { fileprivate let responseStream = PublishSubject<ServiceEvent>() var sharedResponseStream: Observable<ServiceEvent> + let dbManager = DBManager(profileHepler: ProfileDataHelper(), conversationHelper: ConversationDataHelper(), interactionHepler: InteractionDataHelper()) init(withContactsAdapter contactsAdapter: ContactsAdapter) { self.contactsAdapter = contactsAdapter @@ -105,6 +106,16 @@ class ContactsService { let success = self.contactsAdapter.acceptTrustRequest(fromContact: contactRequest.ringId, withAccountId: account.id) if success { + var stringImage: String? + if let vCard = contactRequest.vCard, let image = vCard.imageData { + stringImage = image.base64EncodedString() + } + let name = VCardUtils.getName(from: contactRequest.vCard) + _ = self.dbManager + .createOrUpdateRingProfile(profileUri: contactRequest.ringId, + alias: name, + image: stringImage, + status: ProfileStatus.trusted) var event = ServiceEvent(withEventType: .contactAdded) event.addEventInput(.accountId, value: account.id) event.addEventInput(.state, value: true) @@ -202,7 +213,7 @@ extension ContactsService: ContactsAdapterDelegate { vCard = nil log.error("Unable to parse the vCard :\(error)") } - + //Update trust request list if self.contactRequest(withRingId: senderAccount) == nil { let contactRequest = ContactRequestModel(withRingId: senderAccount, -- GitLab