From e776e6944d4e2b1b2ac94ffd2ef8d45daeb1669e Mon Sep 17 00:00:00 2001 From: Alfonso Grillo Date: Tue, 13 Dec 2022 14:19:55 +0100 Subject: [PATCH] Delete old devices in account data --- .../MatrixSDK/UserSessionsDataProvider.swift | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift index a5c90d65d..5f1273329 100644 --- a/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift +++ b/RiotSwiftUI/Modules/UserSessions/UserSessionsOverview/Service/MatrixSDK/UserSessionsDataProvider.swift @@ -37,7 +37,16 @@ class UserSessionsDataProvider: UserSessionsDataProviderProtocol { } func devices(completion: @escaping (MXResponse<[MXDevice]>) -> Void) { - session.matrixRestClient.devices(completion: completion) + session.matrixRestClient.devices { [weak self] response in + switch response { + case .success(let devices): + self?.deleteAccountDataIfNeeded(deviceList: devices) + case .failure: + break + } + + completion(response) + } } func device(withDeviceId deviceId: String, ofUser userId: String) -> MXDeviceInfo? { @@ -66,3 +75,22 @@ class UserSessionsDataProvider: UserSessionsDataProviderProtocol { return try await service.isServiceAvailable() } } + +private extension UserSessionsDataProvider { + func deleteAccountDataIfNeeded(deviceList: [MXDevice]) { + let deviceAccountDataKeys = Set( + session + .accountData + .allAccountDataEvents() + .map(\.key) + .filter { $0.hasPrefix(kMXAccountDataTypeClientInformation) } + ) + + let expectedDeviceAccountDataKeys = Set(deviceList.map { "\(kMXAccountDataTypeClientInformation).\($0.deviceId)" }) + let obsoletedDeviceAccountDataKeys = deviceAccountDataKeys.subtracting(expectedDeviceAccountDataKeys) + + for accountDataKey in obsoletedDeviceAccountDataKeys { + session.deleteAccountData(withType: accountDataKey, success: {}, failure: { _ in }) + } + } +}