From aec9a26bf54fee8fdd0a1890a1adcd280508142a Mon Sep 17 00:00:00 2001 From: Rinat Enikeev Date: Fri, 15 Dec 2023 22:47:49 +0200 Subject: [PATCH 1/3] Remove Realm dependency Eliminates dependency on RealmSwift --- Apps/RuuviStation/Intents/target.yml | 3 - .../Classes/Application/AppAssembly.swift | 36 +- .../Classes/Application/AppDelegate.swift | 2 - .../About/Assembly/AboutConfigurator.swift | 1 - .../About/Presenter/AboutPresenter.swift | 12 +- .../Assembly/DashboardModuleFactory.swift | 1 - .../Home/Presenter/DashboardPresenter.swift | 1 - .../Table/SettingsTableConfigurator.swift | 1 - .../Module/Presenter/SettingsPresenter.swift | 1 - .../Submodules/DFU/DFUModuleFactory.swift | 2 - .../DFU/Presenter/DFUPresenter.swift | 4 - .../Submodules/DFU/View/DFUViewModel.swift | 162 +--- .../Sources/Extensions/Errors/RUError.swift | 3 - ...RuuviPersistenceError+LocalizedError.swift | 2 - Apps/RuuviStation/Widgets/target.yml | 3 - Apps/RuuviStation/target.yml | 3 - Modules/RuuviOnboard/target.yml | 1 + .../Sources/RuuviContext/RealmContext.swift | 11 - .../RealmContextFactoryImpl.swift | 7 - .../RuuviContextRealm/RealmContextImpl.swift | 13 - Packages/RuuviContext/target.yml | 3 - .../RuuviTagPropertiesDaemonBTKit.swift | 54 +- .../RuuviMigrationFactoryImpl.swift | 9 - .../toSQLite/MigrationManagerToSQLite.swift | 79 -- .../toVIPER/MigrationManagerToVIPER.swift | 161 ---- Packages/RuuviMigration/target.yml | 3 - .../RuuviTagDataRealm+Extension.swift | 90 --- ...uviTagDataRealm+RuuviTagSensorRecord.swift | 26 - .../RuuviTagDataRealm.swift | 102 --- .../RuuviTagLatestDataRealm+Extension.swift | 90 --- ...LatestDataRealm+RuuviTagSensorRecord.swift | 26 - .../RuuviTagLatestDataRealm.swift | 102 --- .../RuuviTagRealm+RuuviTagSensor.swift | 60 -- .../RuuviOntologyRealm/RuuviTagRealm.swift | 48 -- .../RuuviTagRealmProtocol.swift | 12 - .../SensorSettingsRealm.swift | 49 -- Packages/RuuviOntology/target.yml | 3 - .../RuuviPersistenceError.swift | 1 - .../RuuviPersistenceRealm.swift | 753 ------------------ Packages/RuuviPersistence/target.yml | 3 - .../Sources/RuuviPool/RuuviPoolFactory.swift | 1 - .../RuuviPoolCoordinator.swift | 67 +- .../RuuviPoolFactoryCoordinator.swift | 2 - .../RuuviReactor/RuuviReactorFactory.swift | 4 +- .../RuuviTagLastRecordSubjectCombine.swift | 30 +- .../RuuviTagLatestRecordSubjectCombine.swift | 28 +- .../RuuviTagRecordSubjectCombine.swift | 35 +- .../RuuviTagSubjectCombine.swift | 41 +- .../SensorSettingsCombine.swift | 47 +- .../RuuviReactorFactoryImpl.swift | 8 +- .../RuuviReactorImpl/RuuviReactorImpl.swift | 54 +- Packages/RuuviReactor/target.yml | 3 - .../Sources/RuuviStorage/RuuviStorage.swift | 2 +- .../RuuviStorageCoordinator.swift | 65 +- .../RuuviStorageFactoryCoordinator.swift | 4 +- project.yml | 3 - 56 files changed, 68 insertions(+), 2269 deletions(-) delete mode 100644 Packages/RuuviContext/Sources/RuuviContext/RealmContext.swift delete mode 100644 Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextFactoryImpl.swift delete mode 100644 Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextImpl.swift delete mode 100644 Packages/RuuviMigration/Sources/RuuviMigrationImpl/toSQLite/MigrationManagerToSQLite.swift delete mode 100644 Packages/RuuviMigration/Sources/RuuviMigrationImpl/toVIPER/MigrationManagerToVIPER.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+Extension.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+RuuviTagSensorRecord.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+Extension.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+RuuviTagSensorRecord.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm+RuuviTagSensor.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealmProtocol.swift delete mode 100644 Packages/RuuviOntology/Sources/RuuviOntologyRealm/SensorSettingsRealm.swift delete mode 100644 Packages/RuuviPersistence/Sources/RuuviPersistenceRealm/RuuviPersistenceRealm.swift diff --git a/Apps/RuuviStation/Intents/target.yml b/Apps/RuuviStation/Intents/target.yml index b9118f41b..ca8e03618 100644 --- a/Apps/RuuviStation/Intents/target.yml +++ b/Apps/RuuviStation/Intents/target.yml @@ -50,10 +50,7 @@ targets: - package: Future - package: GRDB - package: Humidity - - package: Realm - package: KeychainAccess - - package: Realm - product: RealmSwift - target: RuuviUser embed: true - target: RuuviCloud diff --git a/Apps/RuuviStation/Sources/Classes/Application/AppAssembly.swift b/Apps/RuuviStation/Sources/Classes/Application/AppAssembly.swift index 841ff4376..5a94d3dda 100644 --- a/Apps/RuuviStation/Sources/Classes/Application/AppAssembly.swift +++ b/Apps/RuuviStation/Sources/Classes/Application/AppAssembly.swift @@ -54,16 +54,9 @@ private final class DfuAssembly: Assembly { private final class MigrationAssembly: Assembly { func assemble(container: Container) { - container.register(RuuviMigration.self, name: "realm") { r in - let localImages = r.resolve(RuuviLocalImages.self)! - let settings = r.resolve(RuuviLocalSettings.self)! - return MigrationManagerToVIPER(localImages: localImages, settings: settings) - } - container.register(RuuviMigrationFactory.self) { r in let settings = r.resolve(RuuviLocalSettings.self)! let idPersistence = r.resolve(RuuviLocalIDs.self)! - let realmContext = r.resolve(RealmContext.self)! let ruuviPool = r.resolve(RuuviPool.self)! let ruuviStorage = r.resolve(RuuviStorage.self)! let ruuviAlertService = r.resolve(RuuviServiceAlert.self)! @@ -71,7 +64,6 @@ private final class MigrationAssembly: Assembly { return RuuviMigrationFactoryImpl( settings: settings, idPersistence: idPersistence, - realmContext: realmContext, ruuviPool: ruuviPool, ruuviStorage: ruuviStorage, ruuviAlertService: ruuviAlertService, @@ -84,16 +76,6 @@ private final class MigrationAssembly: Assembly { private final class PersistenceAssembly: Assembly { // swiftlint:disable:next function_body_length func assemble(container: Container) { - container.register(RealmContextFactory.self) { _ in - let factory = RealmContextFactoryImpl() - return factory - }.inObjectScope(.container) - - container.register(RealmContext.self) { r in - let factory = r.resolve(RealmContextFactory.self)! - return factory.create() - }.inObjectScope(.container) - container.register(RuuviLocalConnections.self) { r in let factory = r.resolve(RuuviLocalFactory.self)! return factory.createLocalConnections() @@ -115,14 +97,12 @@ private final class PersistenceAssembly: Assembly { container.register(RuuviPool.self) { r in let factory = r.resolve(RuuviPoolFactory.self)! - let realm = r.resolve(RuuviPersistence.self, name: "realm")! let sqlite = r.resolve(RuuviPersistence.self, name: "sqlite")! let localIDs = r.resolve(RuuviLocalIDs.self)! let localSettings = r.resolve(RuuviLocalSettings.self)! let localConnections = r.resolve(RuuviLocalConnections.self)! return factory.create( sqlite: sqlite, - realm: realm, idPersistence: localIDs, settings: localSettings, connectionPersistence: localConnections @@ -136,14 +116,10 @@ private final class PersistenceAssembly: Assembly { container.register(RuuviReactor.self) { r in let factory = r.resolve(RuuviReactorFactory.self)! let sqliteContext = r.resolve(SQLiteContext.self)! - let realmContext = r.resolve(RealmContext.self)! let sqltePersistence = r.resolve(RuuviPersistence.self, name: "sqlite")! - let realmPersistence = r.resolve(RuuviPersistence.self, name: "realm")! return factory.create( sqliteContext: sqliteContext, - realmContext: realmContext, - sqlitePersistence: sqltePersistence, - realmPersistence: realmPersistence + sqlitePersistence: sqltePersistence ) }.inObjectScope(.container) @@ -152,11 +128,6 @@ private final class PersistenceAssembly: Assembly { return factory } - container.register(RuuviPersistence.self, name: "realm") { r in - let context = r.resolve(RealmContext.self)! - return RuuviPersistenceRealm(context: context) - }.inObjectScope(.container) - container.register(RuuviPersistence.self, name: "sqlite") { r in let context = r.resolve(SQLiteContext.self)! return RuuviPersistenceSQLite(context: context) @@ -165,8 +136,7 @@ private final class PersistenceAssembly: Assembly { container.register(RuuviStorage.self) { r in let factory = r.resolve(RuuviStorageFactory.self)! let sqlite = r.resolve(RuuviPersistence.self, name: "sqlite")! - let realm = r.resolve(RuuviPersistence.self, name: "realm")! - return factory.create(realm: realm, sqlite: sqlite) + return factory.create(sqlite: sqlite) }.inObjectScope(.container) container.register(RuuviLocalFactory.self) { _ in @@ -294,14 +264,12 @@ private final class DaemonAssembly: Assembly { let ruuviPool = r.resolve(RuuviPool.self)! let foreground = r.resolve(BTForeground.self)! let idPersistence = r.resolve(RuuviLocalIDs.self)! - let realmPersistence = r.resolve(RuuviPersistence.self, name: "realm")! let sqiltePersistence = r.resolve(RuuviPersistence.self, name: "sqlite")! let daemon = RuuviTagPropertiesDaemonBTKit( ruuviPool: ruuviPool, ruuviReactor: ruuviReactor, foreground: foreground, idPersistence: idPersistence, - realmPersistence: realmPersistence, sqiltePersistence: sqiltePersistence ) return daemon diff --git a/Apps/RuuviStation/Sources/Classes/Application/AppDelegate.swift b/Apps/RuuviStation/Sources/Classes/Application/AppDelegate.swift index fecd4b110..3db3614a8 100644 --- a/Apps/RuuviStation/Sources/Classes/Application/AppDelegate.swift +++ b/Apps/RuuviStation/Sources/Classes/Application/AppDelegate.swift @@ -43,8 +43,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { featureToggleService.fetchFeatureToggles() // the order is important - r.resolve(RuuviMigration.self, name: "realm")? - .migrateIfNeeded() r.resolve(SQLiteContext.self)? .database .migrateIfNeeded() diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Assembly/AboutConfigurator.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Assembly/AboutConfigurator.swift index 85bda76f2..67965dd4a 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Assembly/AboutConfigurator.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Assembly/AboutConfigurator.swift @@ -12,7 +12,6 @@ class AboutConfigurator { presenter.view = view presenter.router = router presenter.ruuviStorage = r.resolve(RuuviStorage.self) - presenter.realmContext = r.resolve(RealmContext.self) presenter.sqliteContext = r.resolve(SQLiteContext.self) view.output = presenter } diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Presenter/AboutPresenter.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Presenter/AboutPresenter.swift index 0a4d77cea..b67034fef 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Presenter/AboutPresenter.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/About/Presenter/AboutPresenter.swift @@ -8,7 +8,6 @@ final class AboutPresenter: AboutModuleInput { weak var view: AboutViewInput! var router: AboutRouterInput! var ruuviStorage: RuuviStorage! - var realmContext: RealmContext! var sqliteContext: SQLiteContext! private var viewModel: AboutViewModel { @@ -102,21 +101,12 @@ extension AboutPresenter { } private func obtainDatabaseSize() { - let realmSize = getRealmFileSize() let sqliteSize = getSQLiteFileSize() - let dbSize = ByteCountFormatter().string(fromByteCount: realmSize + sqliteSize) + let dbSize = ByteCountFormatter().string(fromByteCount: sqliteSize) let dbSizeString = RuuviLocalization.About.DatabaseSize.text(dbSize) viewModel.databaseSize.value = dbSizeString } - func getRealmFileSize() -> Int64 { - guard let realmPath = realmContext.main.configuration.fileURL?.relativePath - else { - return 0 - } - return fileSize(at: realmPath) - } - func getSQLiteFileSize() -> Int64 { fileSize(at: sqliteContext.database.dbPath) } diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Assembly/DashboardModuleFactory.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Assembly/DashboardModuleFactory.swift index 5b8a80212..1acdf1d85 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Assembly/DashboardModuleFactory.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Assembly/DashboardModuleFactory.swift @@ -29,7 +29,6 @@ final class DashboardModuleFactoryImpl: DashboardModuleFactory { let presenter = DashboardPresenter() presenter.router = router presenter.view = view - presenter.realmContext = r.resolve(RealmContext.self) presenter.errorPresenter = r.resolve(ErrorPresenter.self) presenter.settings = r.resolve(RuuviLocalSettings.self) presenter.foreground = r.resolve(BTForeground.self) diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Presenter/DashboardPresenter.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Presenter/DashboardPresenter.swift index 43a7a2b1c..b7e738b7b 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Presenter/DashboardPresenter.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Dashboard/Home/Presenter/DashboardPresenter.swift @@ -23,7 +23,6 @@ class DashboardPresenter: DashboardModuleInput { weak var view: DashboardViewInput? var router: DashboardRouterInput! var interactor: DashboardInteractorInput! - var realmContext: RealmContext! var errorPresenter: ErrorPresenter! var settings: RuuviLocalSettings! var foreground: BTForeground! diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Assembly/Table/SettingsTableConfigurator.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Assembly/Table/SettingsTableConfigurator.swift index 3ea9c49f2..1c609a79d 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Assembly/Table/SettingsTableConfigurator.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Assembly/Table/SettingsTableConfigurator.swift @@ -21,7 +21,6 @@ class SettingsTableConfigurator { presenter.ruuviReactor = r.resolve(RuuviReactor.self) presenter.errorPresenter = r.resolve(ErrorPresenter.self) presenter.alertService = r.resolve(RuuviServiceAlert.self) - presenter.realmContext = r.resolve(RealmContext.self) presenter.featureToggleService = r.resolve(FeatureToggleService.self) presenter.ruuviAppSettingsService = r.resolve(RuuviServiceAppSettings.self) presenter.ruuviUser = r.resolve(RuuviUser.self) diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Presenter/SettingsPresenter.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Presenter/SettingsPresenter.swift index 8cd8f70ea..7b107012d 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Presenter/SettingsPresenter.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/Settings/Module/Presenter/SettingsPresenter.swift @@ -17,7 +17,6 @@ class SettingsPresenter: SettingsModuleInput { var errorPresenter: ErrorPresenter! var ruuviReactor: RuuviReactor! var alertService: RuuviServiceAlert! - var realmContext: RealmContext! var featureToggleService: FeatureToggleService! var ruuviAppSettingsService: RuuviServiceAppSettings! var ruuviUser: RuuviUser! diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/DFUModuleFactory.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/DFUModuleFactory.swift index 76880f197..d22327f78 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/DFUModuleFactory.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/DFUModuleFactory.swift @@ -21,7 +21,6 @@ final class DFUModuleFactoryImpl: DFUModuleFactory { interactor.background = r.resolve(BTBackground.self) let foreground = r.resolve(BTForeground.self)! let idPersistence = r.resolve(RuuviLocalIDs.self)! - let realmPersistence = r.resolve(RuuviPersistence.self, name: "realm")! let sqiltePersistence = r.resolve(RuuviPersistence.self, name: "sqlite")! let ruuviPool = r.resolve(RuuviPool.self)! let ruuviStorage = r.resolve(RuuviStorage.self)! @@ -33,7 +32,6 @@ final class DFUModuleFactoryImpl: DFUModuleFactory { ruuviTag: ruuviTag, foreground: foreground, idPersistence: idPersistence, - realmPersistence: realmPersistence, sqiltePersistence: sqiltePersistence, ruuviPool: ruuviPool, ruuviStorage: ruuviStorage, diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/Presenter/DFUPresenter.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/Presenter/DFUPresenter.swift index 7957f59fc..4e625e42e 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/Presenter/DFUPresenter.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/Presenter/DFUPresenter.swift @@ -26,7 +26,6 @@ final class DFUPresenter: DFUModuleInput { private let interactor: DFUInteractorInput private let foreground: BTForeground! private let idPersistence: RuuviLocalIDs - private let realmPersistence: RuuviPersistence private let sqiltePersistence: RuuviPersistence private let ruuviTag: RuuviTagSensor private let ruuviPool: RuuviPool @@ -40,7 +39,6 @@ final class DFUPresenter: DFUModuleInput { ruuviTag: RuuviTagSensor, foreground: BTForeground, idPersistence: RuuviLocalIDs, - realmPersistence: RuuviPersistence, sqiltePersistence: RuuviPersistence, ruuviPool: RuuviPool, ruuviStorage: RuuviStorage, @@ -51,7 +49,6 @@ final class DFUPresenter: DFUModuleInput { self.interactor = interactor self.foreground = foreground self.idPersistence = idPersistence - self.realmPersistence = realmPersistence self.sqiltePersistence = sqiltePersistence self.ruuviTag = ruuviTag self.ruuviPool = ruuviPool @@ -63,7 +60,6 @@ final class DFUPresenter: DFUModuleInput { interactor: interactor, foreground: foreground, idPersistence: idPersistence, - realmPersistence: realmPersistence, sqiltePersistence: sqiltePersistence, ruuviTag: ruuviTag, ruuviPool: ruuviPool, diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift index 6b0fecf59..b4dc6a7e7 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift @@ -23,7 +23,6 @@ final class DFUViewModel: ObservableObject { private let interactor: DFUInteractorInput private let foreground: BTForeground! private let idPersistence: RuuviLocalIDs - private let realmPersistence: RuuviPersistence private let sqiltePersistence: RuuviPersistence private let ruuviTag: RuuviTagSensor private let ruuviPool: RuuviPool @@ -55,7 +54,6 @@ final class DFUViewModel: ObservableObject { interactor: DFUInteractorInput, foreground: BTForeground, idPersistence: RuuviLocalIDs, - realmPersistence: RuuviPersistence, sqiltePersistence: RuuviPersistence, ruuviTag: RuuviTagSensor, ruuviPool: RuuviPool, @@ -67,7 +65,6 @@ final class DFUViewModel: ObservableObject { self.interactor = interactor self.foreground = foreground self.idPersistence = idPersistence - self.realmPersistence = realmPersistence self.sqiltePersistence = sqiltePersistence self.ruuviTag = ruuviTag self.ruuviPool = ruuviPool @@ -111,9 +108,6 @@ final class DFUViewModel: ObservableObject { func storeUpdatedFirmware(currentRelease: CurrentRelease?) { guard ruuviTag.luid != nil else { return } - // If the tag is stored on realm then migration needed - // Usually tags without macId are stored in the realm database - // For tags with macId don't need migration if ruuviTag.macId != nil { guard let currentRelease else { @@ -129,9 +123,7 @@ final class DFUViewModel: ObservableObject { self?.isLoading = false }) } else { - isLoading = true - propertiesDaemon.stop() - startObserving() + assertionFailure() } } @@ -147,158 +139,6 @@ final class DFUViewModel: ObservableObject { .with(firmwareVersion: currentRelease.version)) } - private func startObserving() { - guard let luid = ruuviTag.luid - else { - isLoading = false - return - } - ruuviTagObserveToken?.invalidate() - ruuviTagObserveToken = foreground.observe( - self, - uuid: luid.value, - options: [.callbackQueue(.untouch)] - ) { - [weak self] _, device in - guard let sSelf = self else { return } - if let tag = device.ruuvi?.tag { - guard !sSelf.isMigrating - else { - return - } - sSelf.ruuviTagObserveToken?.invalidate() - sSelf.isMigrating = true - let pair = RuuviTagPropertiesDaemonPair(ruuviTag: sSelf.ruuviTag.any, device: tag) - sSelf.tryToMigrate(pair: pair) - } - } - } - - // MARK: - Migration starts - - @objc private func tryToMigrate(pair: RuuviTagPropertiesDaemonPair) { - if let mac = pair.device.mac { - moveTagToSqlite(mac: mac.mac, pair: pair) - } - } - - /// This method creates the updated instance of the Ruuvi Tag after firmware update. - private func moveTagToSqlite( - mac: MACIdentifier, - pair: RuuviTagPropertiesDaemonPair - ) { - sqiltePersistence.create( - pair.ruuviTag - .with(macId: mac) - .with(isConnectable: true) - .with(version: pair.device.version) - .with(isOwner: true) - ).on(success: { [weak self] _ in - self?.moveLatestRecordToSqlite(mac: mac, pair: pair) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - } - - /// This method fetches the latest record from the Realm and creates the same record to SQLite. - /// If there's no record move to the next step. - private func moveLatestRecordToSqlite( - mac: MACIdentifier, - pair: RuuviTagPropertiesDaemonPair - ) { - realmPersistence.readLatest(pair.ruuviTag).on(success: { [weak self] record in - // If there's no record move to next action - guard let record - else { - self?.moveRecordsHistoryToSqlite(mac: mac, pair: pair) - return - } - self?.sqiltePersistence.createLast(record.with(macId: mac)).on(success: { [weak self] _ in - self?.moveRecordsHistoryToSqlite(mac: mac, pair: pair) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - } - - /// This method fetches the all the records from the Realm and creates the same records to SQLite. - /// If there are no records move to the next step. - private func moveRecordsHistoryToSqlite( - mac: MACIdentifier, - pair: RuuviTagPropertiesDaemonPair - ) { - realmPersistence.readAll(pair.device.uuid).on(success: { [weak self] realmRecords in - guard realmRecords.count > 0 - else { - self?.moveSettingsToSqlite(mac: mac, pair: pair) - return - } - let records = realmRecords.map { $0.with(macId: mac) } - self?.sqiltePersistence.create(records).on(success: { _ in - self?.idPersistence.set(mac: mac, for: pair.device.uuid.luid) - self?.moveSettingsToSqlite(mac: mac, pair: pair) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - } - - /// This method fetches the sensor settings from the Realm and creates the same sensor settings record to SQLite. - /// If there's no record move to the next step. - private func moveSettingsToSqlite( - mac: MACIdentifier, - pair: RuuviTagPropertiesDaemonPair - ) { - realmPersistence.readSensorSettings(pair.ruuviTag.withoutMac()) - .on(success: { [weak self] sensorSettings in - if let withMacSettings = sensorSettings?.with(macId: mac) { - self?.sqiltePersistence.save(sensorSettings: withMacSettings) - .on(success: { _ in - self?.deleteRealmRecords(pair: pair) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - } else { - self?.deleteRealmRecords(pair: pair) - } - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - } - - /// Delete all the records related to the tag on RealmDB. - /// If these delete operations are not completed return migration error because these redundant data - /// will cause unexpected behaviour. - private func deleteRealmRecords(pair: RuuviTagPropertiesDaemonPair) { - realmPersistence.deleteAllRecords(pair.device.uuid).on(success: { [weak self] _ in - self?.realmPersistence.deleteLatest(pair.device.uuid).on(success: { _ in - self?.realmPersistence.delete(pair.ruuviTag.withoutMac()).on(success: { _ in - self?.realmPersistence.deleteOffsetCorrection(ruuviTag: - pair.ruuviTag.withoutMac()).on(completion: { - self?.isMigrating = false - self?.isLoading = false - }) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - }, failure: { [weak self] _ in - self?.notifyMigrationError() - }) - } - - private func notifyMigrationError() { - isMigrating = false - isLoading = false - isMigrationFailed = true - } - // Migration ends func checkBatteryState(completion: @escaping (Bool) -> Void) { diff --git a/Apps/RuuviStation/Sources/Extensions/Errors/RUError.swift b/Apps/RuuviStation/Sources/Extensions/Errors/RUError.swift index 19f152ed1..5a6d296a5 100644 --- a/Apps/RuuviStation/Sources/Extensions/Errors/RUError.swift +++ b/Apps/RuuviStation/Sources/Extensions/Errors/RUError.swift @@ -142,7 +142,6 @@ enum UnexpectedError: Error { case failedToFindRuuviTag case failedToFindLogsForTheTag case viewModelUUIDIsNil - case attemptToReadDataFromRealmWithoutLUID case failedToFindOrGenerateBackgroundImage case bothLuidAndMacAreNil } @@ -162,8 +161,6 @@ extension UnexpectedError: LocalizedError { RuuviLocalization.UnexpectedError.failedToFindLogsForTheTag case .viewModelUUIDIsNil: RuuviLocalization.UnexpectedError.viewModelUUIDIsNil - case .attemptToReadDataFromRealmWithoutLUID: - RuuviLocalization.UnexpectedError.attemptToReadDataFromRealmWithoutLUID case .failedToFindOrGenerateBackgroundImage: RuuviLocalization.UnexpectedError.failedToFindOrGenerateBackgroundImage case .bothLuidAndMacAreNil: diff --git a/Apps/RuuviStation/Sources/Extensions/Errors/RuuviPersistenceError+LocalizedError.swift b/Apps/RuuviStation/Sources/Extensions/Errors/RuuviPersistenceError+LocalizedError.swift index 52fcfc5ae..bae74bf85 100644 --- a/Apps/RuuviStation/Sources/Extensions/Errors/RuuviPersistenceError+LocalizedError.swift +++ b/Apps/RuuviStation/Sources/Extensions/Errors/RuuviPersistenceError+LocalizedError.swift @@ -7,8 +7,6 @@ extension RuuviPersistenceError: LocalizedError { switch self { case let .grdb(error): error.localizedDescription - case let .realm(error): - error.localizedDescription case .failedToFindRuuviTag: RuuviLocalization.RuuviPersistenceError.failedToFindRuuviTag } diff --git a/Apps/RuuviStation/Widgets/target.yml b/Apps/RuuviStation/Widgets/target.yml index e4a7f3b6a..a4f5f9815 100644 --- a/Apps/RuuviStation/Widgets/target.yml +++ b/Apps/RuuviStation/Widgets/target.yml @@ -43,10 +43,7 @@ targets: - package: Future - package: GRDB - package: Humidity - - package: Realm - package: KeychainAccess - - package: Realm - product: RealmSwift - target: RuuviUser embed: true - target: RuuviCloud diff --git a/Apps/RuuviStation/target.yml b/Apps/RuuviStation/target.yml index c1a2e69df..9a7d91114 100644 --- a/Apps/RuuviStation/target.yml +++ b/Apps/RuuviStation/target.yml @@ -28,9 +28,6 @@ targets: - package: KeychainAccess - package: Humidity - package: Future - - package: Realm - - package: Realm - product: RealmSwift - package: FLEX - target: RuuviAnalytics - target: RuuviCloud diff --git a/Modules/RuuviOnboard/target.yml b/Modules/RuuviOnboard/target.yml index 498b7e522..bec6a0ada 100644 --- a/Modules/RuuviOnboard/target.yml +++ b/Modules/RuuviOnboard/target.yml @@ -8,3 +8,4 @@ targets: - Module dependencies: - target: RuuviUser + - target: RuuviLocalization diff --git a/Packages/RuuviContext/Sources/RuuviContext/RealmContext.swift b/Packages/RuuviContext/Sources/RuuviContext/RealmContext.swift deleted file mode 100644 index 5fde7ecd5..000000000 --- a/Packages/RuuviContext/Sources/RuuviContext/RealmContext.swift +++ /dev/null @@ -1,11 +0,0 @@ -import RealmSwift - -public protocol RealmContext { - var bg: Realm! { get } - var main: Realm { get } - var bgWorker: Worker { get } -} - -public protocol RealmContextFactory { - func create() -> RealmContext -} diff --git a/Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextFactoryImpl.swift b/Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextFactoryImpl.swift deleted file mode 100644 index 6dd330878..000000000 --- a/Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextFactoryImpl.swift +++ /dev/null @@ -1,7 +0,0 @@ -public final class RealmContextFactoryImpl: RealmContextFactory { - public init() {} - - public func create() -> RealmContext { - RealmContextImpl() - } -} diff --git a/Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextImpl.swift b/Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextImpl.swift deleted file mode 100644 index 4dfa6f5c3..000000000 --- a/Packages/RuuviContext/Sources/RuuviContextRealm/RealmContextImpl.swift +++ /dev/null @@ -1,13 +0,0 @@ -import RealmSwift - -class RealmContextImpl: RealmContext { - var main: Realm = try! Realm() - var bg: Realm! - var bgWorker: Worker = .init() - - init() { - bgWorker.enqueue { - self.bg = try! Realm() - } - } -} diff --git a/Packages/RuuviContext/target.yml b/Packages/RuuviContext/target.yml index aa7d0c8fa..146bb2151 100644 --- a/Packages/RuuviContext/target.yml +++ b/Packages/RuuviContext/target.yml @@ -11,8 +11,5 @@ targets: - path: Sources name: Context dependencies: - - package: Realm - - package: Realm - product: RealmSwift - package: GRDB - target: RuuviOntology diff --git a/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift b/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift index 085918b73..b96bd0594 100644 --- a/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift +++ b/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift @@ -12,7 +12,6 @@ public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPro private let ruuviReactor: RuuviReactor private let foreground: BTForeground private let idPersistence: RuuviLocalIDs - private let realmPersistence: RuuviPersistence private let sqiltePersistence: RuuviPersistence public init( @@ -20,14 +19,12 @@ public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPro ruuviReactor: RuuviReactor, foreground: BTForeground, idPersistence: RuuviLocalIDs, - realmPersistence: RuuviPersistence, sqiltePersistence: RuuviPersistence ) { self.ruuviPool = ruuviPool self.ruuviReactor = ruuviReactor self.foreground = foreground self.idPersistence = idPersistence - self.realmPersistence = realmPersistence self.sqiltePersistence = sqiltePersistence super.init() } @@ -36,7 +33,6 @@ public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPro private var observeTokens = [ObservationToken]() private var scanTokens = [ObservationToken]() private var ruuviTags = [AnyRuuviTagSensor]() - private var isTransitioningFromRealmToSQLite = false private var processingUUIDs = Set() @objc private class RuuviTagPropertiesDaemonPair: NSObject { @@ -155,55 +151,7 @@ public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPro .on(failure: { [weak self] error in self?.post(error: .ruuviPool(error)) }) - } else { - isTransitioningFromRealmToSQLite = true - // now we need to remove the tag from Realm and add it to SQLite - sqiltePersistence.create( - pair.ruuviTag - .with(macId: mac.mac) - .with(isConnectable: true) - .with(version: pair.device.version) - .with(isOwner: true) - ).on(success: { [weak self] _ in - self?.realmPersistence.readAll(pair.device.uuid).on(success: { realmRecords in - let records = realmRecords.map { $0.with(macId: mac.mac) } - self?.sqiltePersistence.create(records).on(success: { _ in - self?.realmPersistence.deleteAllRecords(pair.device.uuid).on(success: { _ in - self?.idPersistence.set(mac: mac.mac, for: pair.device.uuid.luid) - self?.realmPersistence.delete(pair.ruuviTag.withoutMac()) - .on(success: { [weak self] _ in - self?.realmPersistence.readSensorSettings(pair.ruuviTag.withoutMac()) - .on(success: { [weak self] sensorSettings in - if let withMacSettings = sensorSettings?.with(macId: mac.mac) { - self?.sqiltePersistence.save(sensorSettings: withMacSettings) - .on(success: { _ in - self?.isTransitioningFromRealmToSQLite = false - }, failure: { error in - self?.post(error: .ruuviPersistence(error)) - self?.isTransitioningFromRealmToSQLite = false - }) - } else { - self?.isTransitioningFromRealmToSQLite = false - } - }, failure: { error in - self?.post(error: .ruuviPersistence(error)) - self?.isTransitioningFromRealmToSQLite = false - }) - }, failure: { error in - self?.post(error: .ruuviPersistence(error)) - self?.isTransitioningFromRealmToSQLite = false - }) - }, failure: { error in - self?.post(error: .ruuviPersistence(error)) - self?.isTransitioningFromRealmToSQLite = false - }) - }) - }) - }, failure: { [weak self] error in - self?.post(error: .ruuviPersistence(error)) - self?.isTransitioningFromRealmToSQLite = false - }) - } + } } else if pair.ruuviTag.macId?.value != nil, pair.device.mac == nil { // this is the case when 2.5.9 tag is returning to data format 3 mode // but we have it in sqlite database already diff --git a/Packages/RuuviMigration/Sources/RuuviMigrationImpl/RuuviMigrationFactoryImpl.swift b/Packages/RuuviMigration/Sources/RuuviMigrationImpl/RuuviMigrationFactoryImpl.swift index 56c22b539..5efaa110a 100644 --- a/Packages/RuuviMigration/Sources/RuuviMigrationImpl/RuuviMigrationFactoryImpl.swift +++ b/Packages/RuuviMigration/Sources/RuuviMigrationImpl/RuuviMigrationFactoryImpl.swift @@ -7,7 +7,6 @@ import RuuviStorage public final class RuuviMigrationFactoryImpl: RuuviMigrationFactory { private let settings: RuuviLocalSettings private let idPersistence: RuuviLocalIDs - private let realmContext: RealmContext private let ruuviPool: RuuviPool private let ruuviStorage: RuuviStorage private let ruuviAlertService: RuuviServiceAlert @@ -16,7 +15,6 @@ public final class RuuviMigrationFactoryImpl: RuuviMigrationFactory { public init( settings: RuuviLocalSettings, idPersistence: RuuviLocalIDs, - realmContext: RealmContext, ruuviPool: RuuviPool, ruuviStorage: RuuviStorage, ruuviAlertService: RuuviServiceAlert, @@ -24,7 +22,6 @@ public final class RuuviMigrationFactoryImpl: RuuviMigrationFactory { ) { self.settings = settings self.idPersistence = idPersistence - self.realmContext = realmContext self.ruuviPool = ruuviPool self.ruuviStorage = ruuviStorage self.ruuviAlertService = ruuviAlertService @@ -32,11 +29,6 @@ public final class RuuviMigrationFactoryImpl: RuuviMigrationFactory { } public func createAllOrdered() -> [RuuviMigration] { - let toSQLite = MigrationManagerToSQLite( - idPersistence: idPersistence, - realmContext: realmContext, - ruuviPool: ruuviPool - ) let toAlertService = MigrationManagerAlertService( ruuviStorage: ruuviStorage, ruuviAlertService: ruuviAlertService @@ -59,7 +51,6 @@ public final class RuuviMigrationFactoryImpl: RuuviMigrationFactory { ) let toNetworkPull60 = MigrationManagerToNetworkPull60(settings: settings) return [ - toSQLite, toAlertService, toPrune240, toChartDuration240, diff --git a/Packages/RuuviMigration/Sources/RuuviMigrationImpl/toSQLite/MigrationManagerToSQLite.swift b/Packages/RuuviMigration/Sources/RuuviMigrationImpl/toSQLite/MigrationManagerToSQLite.swift deleted file mode 100644 index 4d66b3df0..000000000 --- a/Packages/RuuviMigration/Sources/RuuviMigrationImpl/toSQLite/MigrationManagerToSQLite.swift +++ /dev/null @@ -1,79 +0,0 @@ -import Foundation -import RealmSwift -import RuuviContext -import RuuviLocal -import RuuviOntology -import RuuviPool - -extension Notification.Name { - static let MigrationManagerToSQLiteDidFinish = Notification.Name("MigrationManagerToSQLite.DidFinish") -} - -class MigrationManagerToSQLite: RuuviMigration { - private let idPersistence: RuuviLocalIDs - private let realmContext: RealmContext - private let ruuviPool: RuuviPool - - init( - idPersistence: RuuviLocalIDs, - realmContext: RealmContext, - ruuviPool: RuuviPool - ) { - self.idPersistence = idPersistence - self.realmContext = realmContext - self.ruuviPool = ruuviPool - } - - @UserDefault("MigrationManagerToSQLite.didMigrateRuuviTagRealmWithMAC", defaultValue: false) - private var didMigrateRuuviTagRealmWithMAC: Bool - - func migrateIfNeeded() { - if !didMigrateRuuviTagRealmWithMAC { - let realmTags = realmContext.main.objects(RuuviTagRealm.self) - let dispatchGroup = DispatchGroup() - realmTags.forEach { - dispatchGroup.enter() - migrate(realmTag: $0, group: dispatchGroup) - } - dispatchGroup.notify(queue: .main) { - NotificationCenter - .default - .post( - name: .MigrationManagerToSQLiteDidFinish, - object: self, - userInfo: nil - ) - } - didMigrateRuuviTagRealmWithMAC = true - } - } - - private func migrate(realmTag: RuuviTagRealm, group: DispatchGroup) { - if let mac = realmTag.mac, !mac.isEmpty { - idPersistence.set(mac: mac.mac, for: realmTag.uuid.luid) - ruuviPool.create(realmTag).on() - var records: [RuuviTagSensorRecord] = [] - for record in realmTag.data { - autoreleasepool { - if let anyRecord = record.any?.with(macId: mac.mac) { - records.append(anyRecord) - } - } - } - ruuviPool.create(records) - .on(completion: { - group.leave() - }) - do { - try realmContext.main.write { - realmContext.main.delete(realmTag.data) - realmContext.main.delete(realmTag) - } - } catch { - print(error.localizedDescription) - } - } else { - group.leave() - } - } -} diff --git a/Packages/RuuviMigration/Sources/RuuviMigrationImpl/toVIPER/MigrationManagerToVIPER.swift b/Packages/RuuviMigration/Sources/RuuviMigrationImpl/toVIPER/MigrationManagerToVIPER.swift deleted file mode 100644 index 46c065c55..000000000 --- a/Packages/RuuviMigration/Sources/RuuviMigrationImpl/toVIPER/MigrationManagerToVIPER.swift +++ /dev/null @@ -1,161 +0,0 @@ -import Foundation -import RealmSwift -import RuuviLocal -import RuuviOntology - -public final class MigrationManagerToVIPER: RuuviMigration { - private let localImages: RuuviLocalImages - private var settings: RuuviLocalSettings - - public init( - localImages: RuuviLocalImages, - settings: RuuviLocalSettings - ) { - self.localImages = localImages - self.settings = settings - } - - public func migrateIfNeeded() { - let config = Realm.Configuration( - schemaVersion: 11, - migrationBlock: { [weak self] migration, oldSchemaVersion in - if oldSchemaVersion < 2 { - self?.from1to2(migration) - } else if oldSchemaVersion < 3 { - self?.from2to3(migration) - } else if oldSchemaVersion < 4 { - self?.from3to4(migration) - } else if oldSchemaVersion < 8 { - self?.deleteRuuviTagData(migration) - } - }, shouldCompactOnLaunch: { totalBytes, usedBytes in - let fiveHundredMegabytes = 500 * 1024 * 1024 - return (totalBytes > fiveHundredMegabytes) && (Double(usedBytes) / Double(totalBytes)) < 0.5 - } - ) - - // Tell Realm to use this new configuration object for the default Realm - Realm.Configuration.defaultConfiguration = config - - do { - _ = try Realm() - } catch { - if let url = Realm.Configuration.defaultConfiguration.fileURL { - do { - try FileManager.default.removeItem(at: url) - } catch { - print(error.localizedDescription) - } - } - } - - if !UserDefaults.standard.bool(forKey: "MigrationManagerToVIPER.useFahrenheit.checked") { - UserDefaults.standard.set(true, forKey: "MigrationManagerToVIPER.useFahrenheit.checked") - let useFahrenheit = UserDefaults.standard.bool(forKey: "useFahrenheit") - settings.temperatureUnit = useFahrenheit ? .fahrenheit : .celsius - } - - if !UserDefaults.standard.bool(forKey: "MigrationManagerToVIPER.hasShownWelcome.checked") { - UserDefaults.standard.set(true, forKey: "MigrationManagerToVIPER.hasShownWelcome.checked") - settings.welcomeShown = UserDefaults.standard.bool(forKey: "hasShownWelcome") - } - - if !UserDefaults.standard.bool(forKey: "MigrationManagerToVIPER.hasShownSwipe.checked") { - UserDefaults.standard.set(true, forKey: "MigrationManagerToVIPER.hasShownSwipe.checked") - let hasShownSwipe = UserDefaults.standard.bool(forKey: "hasShownSwipe") - UserDefaults.standard.set(hasShownSwipe, forKey: "DashboardScrollViewController.hasShownSwipeAlert") - } - } - - // swiftlint:disable:next function_body_length - private func from1to2(_ migration: Migration) { - migration.enumerateObjects(ofType: "RuuviTag") { oldObject, _ in - if let uuid = oldObject?["uuid"] as? String, - let name = oldObject?["name"] as? String, - let version = oldObject?["dataFormat"] as? Int, - let mac = oldObject?["mac"] as? String { - let realName = real(name, mac, uuid) - let ruuviTag = migration.create( - RuuviTagRealm.className(), - value: [ - "uuid": uuid, - "name": realName, - "version": version, - "mac": mac, - ] - ) - - if let temperature = oldObject?["temperature"] as? Double, - let humidity = oldObject?["humidity"] as? Double, - let pressure = oldObject?["pressure"] as? Double, - let accelerationX = oldObject?["accelerationX"] as? Double, - let accelerationY = oldObject?["accelerationY"] as? Double, - let accelerationZ = oldObject?["accelerationZ"] as? Double, - let rssi = oldObject?["rssi"] as? Int, - let voltage = oldObject?["voltage"] as? Double, - let movementCounter = oldObject?["movementCounter"] as? Int, - let measurementSequenceNumber = oldObject?["measurementSequenceNumber"] as? Int, - let txPower = oldObject?["txPower"] as? Int, - let updatedAt = oldObject?["updatedAt"] as? NSDate { - migration.create( - RuuviTagDataRealm.className(), - value: [ - "ruuviTag": ruuviTag, - "date": updatedAt, - "rssi": rssi, - "celsius": temperature, - "humidity": humidity, - "pressure": pressure, - "accelerationX": accelerationX, - "accelerationY": accelerationY, - "accelerationZ": accelerationZ, - "voltage": voltage, - "movementCounter": movementCounter, - "measurementSequenceNumber": measurementSequenceNumber, - "txPower": txPower, - ] - ) - } - } - - if let uuid = oldObject?["uuid"] as? String, let id = oldObject?["defaultBackground"] as? Int { - localImages.setBackground(id, for: uuid.luid) - } - } - } - - private func from2to3(_ migration: Migration) { - migration.enumerateObjects(ofType: RuuviTagDataRealm.className()) { oldObject, newObject in - if let value = oldObject?["celsius"] as? Double { - newObject?["celsius"] = value - } - if let value = oldObject?["humidity"] as? Double { - newObject?["humidity"] = value - } - if let value = oldObject?["pressure"] as? Double { - newObject?["pressure"] = value - } - } - } - - private func from3to4(_ migration: Migration) { - deleteRuuviTagData(migration) - } - - private func deleteRuuviTagData(_ migration: Migration) { - migration.deleteData(forType: RuuviTagDataRealm.className()) - } - - private func real(_ name: String, _ mac: String, _ uuid: String) -> String { - let realName: String = if name.isEmpty { - if mac.isEmpty { - uuid - } else { - mac - } - } else { - name - } - return realName - } -} diff --git a/Packages/RuuviMigration/target.yml b/Packages/RuuviMigration/target.yml index b41702b76..f38790b54 100644 --- a/Packages/RuuviMigration/target.yml +++ b/Packages/RuuviMigration/target.yml @@ -9,9 +9,6 @@ targets: dependencies: - package: Humidity - package: Future - - package: Realm - - package: Realm - product: RealmSwift - target: RuuviOntology - target: RuuviLocal - target: RuuviPool diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+Extension.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+Extension.swift deleted file mode 100644 index d229c82ef..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+Extension.swift +++ /dev/null @@ -1,90 +0,0 @@ -import Foundation -import Humidity -import RealmSwift - -public extension RuuviTagDataRealm { - var unitTemperature: Temperature? { - guard let celsius = celsius.value - else { - return nil - } - return Temperature( - value: celsius, - unit: .celsius - ) - } - - var unitHumidity: Humidity? { - guard let celsius = celsius.value, - let relativeHumidity = humidity.value - else { - return nil - } - return Humidity( - relative: relativeHumidity, - temperature: Temperature(value: celsius, unit: .celsius) - ) - } - - var unitPressure: Pressure? { - guard let pressure = pressure.value - else { - return nil - } - return Pressure( - value: pressure, - unit: .hectopascals - ) - } - - var acceleration: Acceleration? { - guard let accelerationX = accelerationX.value, - let accelerationY = accelerationY.value, - let accelerationZ = accelerationZ.value - else { - return nil - } - return Acceleration( - x: - AccelerationMeasurement( - value: accelerationX, - unit: .metersPerSecondSquared - ), - y: - AccelerationMeasurement( - value: accelerationY, - unit: .metersPerSecondSquared - ), - z: - AccelerationMeasurement( - value: accelerationZ, - unit: .metersPerSecondSquared - ) - ) - } - - var unitVoltage: Voltage? { - guard let voltage = voltage.value else { return nil } - return Voltage(value: voltage, unit: .volts) - } - - var measurement: RuuviMeasurement { - RuuviMeasurement( - luid: ruuviTag?.luid, - macId: ruuviTag?.macId, - measurementSequenceNumber: measurementSequenceNumber.value, - date: date, - rssi: rssi.value, - temperature: unitTemperature, - humidity: unitHumidity, - pressure: unitPressure, - acceleration: acceleration, - voltage: unitVoltage, - movementCounter: movementCounter.value, - txPower: txPower.value, - temperatureOffset: temperatureOffset, - humidityOffset: humidityOffset, - pressureOffset: pressureOffset - ) - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+RuuviTagSensorRecord.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+RuuviTagSensorRecord.swift deleted file mode 100644 index ac97c2c9d..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm+RuuviTagSensorRecord.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import RealmSwift - -public extension RuuviTagDataRealm { - var any: AnyRuuviTagSensorRecord? { - let inner = RuuviTagSensorRecordStruct( - luid: ruuviTag?.uuid.luid, - date: date, - source: source, - macId: ruuviTag?.mac?.mac, - rssi: rssi.value, - temperature: unitTemperature, - humidity: unitHumidity, - pressure: unitPressure, - acceleration: acceleration, - voltage: unitVoltage, - movementCounter: movementCounter.value, - measurementSequenceNumber: measurementSequenceNumber.value, - txPower: txPower.value, - temperatureOffset: temperatureOffset, - humidityOffset: humidityOffset, - pressureOffset: pressureOffset - ) - return AnyRuuviTagSensorRecord(object: inner) - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm.swift deleted file mode 100644 index a40a1e6d0..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagDataRealm.swift +++ /dev/null @@ -1,102 +0,0 @@ -import BTKit -import Foundation -import RealmSwift - -public final class RuuviTagDataRealm: Object { - @objc public dynamic var ruuviTag: RuuviTagRealm? - @objc public dynamic var date: Date = .init() - @objc public dynamic var compoundKey: String = UUID().uuidString - @objc public dynamic var sourceString: String = "unknown" - - // all versions - public let rssi = RealmProperty() - public let celsius = RealmProperty() - public let humidity = RealmProperty() - public let pressure = RealmProperty() - - // v3 & v5 - public let accelerationX = RealmProperty() - public let accelerationY = RealmProperty() - public let accelerationZ = RealmProperty() - public let voltage = RealmProperty() - - // v5 - public let movementCounter = RealmProperty() - public let measurementSequenceNumber = RealmProperty() - public let txPower = RealmProperty() - - @objc public dynamic var temperatureOffset: Double = 0.0 - @objc public dynamic var humidityOffset: Double = 0.0 - @objc public dynamic var pressureOffset: Double = 0.0 - - public var fahrenheit: Double? { - celsius.value?.fahrenheit - } - - public var kelvin: Double? { - celsius.value?.kelvin - } - - public var source: RuuviTagSensorRecordSource { - RuuviTagSensorRecordSource(rawValue: sourceString) ?? .unknown - } - - override public static func primaryKey() -> String? { - "compoundKey" - } - - public convenience init(ruuviTag: RuuviTagRealm, data: RuuviTagProtocol, date: Date) { - self.init(ruuviTag: ruuviTag, data: data) - self.date = date - } - - public convenience init(ruuviTag: RuuviTagRealm, data: RuuviTagProtocol) { - self.init() - self.ruuviTag = ruuviTag - sourceString = data.source.rawValue - rssi.value = data.rssi - celsius.value = data.celsius - humidity.value = data.relativeHumidity - pressure.value = data.hectopascals - accelerationX.value = data.accelerationX - accelerationY.value = data.accelerationY - accelerationZ.value = data.accelerationZ - voltage.value = data.volts - movementCounter.value = data.movementCounter - measurementSequenceNumber.value = data.measurementSequenceNumber - txPower.value = data.txPower - compoundKey = ruuviTag.uuid + "\(date.timeIntervalSince1970)" - } - - public convenience init(ruuviTag: RuuviTagRealm, data: RuuviTagEnvLogFull) { - self.init() - self.ruuviTag = ruuviTag - sourceString = RuuviTagSensorRecordSource.log.rawValue - date = data.date - celsius.value = data.temperature - humidity.value = data.humidity - pressure.value = data.pressure - compoundKey = ruuviTag.uuid + "\(date.timeIntervalSince1970)" - } - - public convenience init(ruuviTag: RuuviTagRealm, record: RuuviTagSensorRecord) { - self.init() - self.ruuviTag = ruuviTag - sourceString = record.source.rawValue - rssi.value = record.rssi - celsius.value = record.temperature?.converted(to: .celsius).value - humidity.value = record.humidity?.value - pressure.value = record.pressure?.converted(to: .hectopascals).value - accelerationX.value = record.acceleration?.x.value - accelerationY.value = record.acceleration?.y.value - accelerationZ.value = record.acceleration?.z.value - voltage.value = record.voltage?.converted(to: .volts).value - movementCounter.value = record.movementCounter - measurementSequenceNumber.value = record.measurementSequenceNumber - txPower.value = record.txPower - compoundKey = record.id - temperatureOffset = record.temperatureOffset - humidityOffset = record.humidityOffset - pressureOffset = record.pressureOffset - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+Extension.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+Extension.swift deleted file mode 100644 index 02e38a3d6..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+Extension.swift +++ /dev/null @@ -1,90 +0,0 @@ -import Foundation -import Humidity -import RealmSwift - -public extension RuuviTagLatestDataRealm { - var unitTemperature: Temperature? { - guard let celsius = celsius.value - else { - return nil - } - return Temperature( - value: celsius, - unit: .celsius - ) - } - - var unitHumidity: Humidity? { - guard let celsius = celsius.value, - let relativeHumidity = humidity.value - else { - return nil - } - return Humidity( - relative: relativeHumidity, - temperature: Temperature(value: celsius, unit: .celsius) - ) - } - - var unitPressure: Pressure? { - guard let pressure = pressure.value - else { - return nil - } - return Pressure( - value: pressure, - unit: .hectopascals - ) - } - - var acceleration: Acceleration? { - guard let accelerationX = accelerationX.value, - let accelerationY = accelerationY.value, - let accelerationZ = accelerationZ.value - else { - return nil - } - return Acceleration( - x: - AccelerationMeasurement( - value: accelerationX, - unit: .metersPerSecondSquared - ), - y: - AccelerationMeasurement( - value: accelerationY, - unit: .metersPerSecondSquared - ), - z: - AccelerationMeasurement( - value: accelerationZ, - unit: .metersPerSecondSquared - ) - ) - } - - var unitVoltage: Voltage? { - guard let voltage = voltage.value else { return nil } - return Voltage(value: voltage, unit: .volts) - } - - var measurement: RuuviMeasurement { - RuuviMeasurement( - luid: ruuviTag?.luid, - macId: ruuviTag?.macId, - measurementSequenceNumber: measurementSequenceNumber.value, - date: date, - rssi: rssi.value, - temperature: unitTemperature, - humidity: unitHumidity, - pressure: unitPressure, - acceleration: acceleration, - voltage: unitVoltage, - movementCounter: movementCounter.value, - txPower: txPower.value, - temperatureOffset: temperatureOffset, - humidityOffset: humidityOffset, - pressureOffset: pressureOffset - ) - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+RuuviTagSensorRecord.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+RuuviTagSensorRecord.swift deleted file mode 100644 index 0ef08ad04..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm+RuuviTagSensorRecord.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import RealmSwift - -public extension RuuviTagLatestDataRealm { - var any: AnyRuuviTagSensorRecord? { - let inner = RuuviTagSensorRecordStruct( - luid: ruuviTag?.uuid.luid, - date: date, - source: source, - macId: ruuviTag?.mac?.mac, - rssi: rssi.value, - temperature: unitTemperature, - humidity: unitHumidity, - pressure: unitPressure, - acceleration: acceleration, - voltage: unitVoltage, - movementCounter: movementCounter.value, - measurementSequenceNumber: measurementSequenceNumber.value, - txPower: txPower.value, - temperatureOffset: temperatureOffset, - humidityOffset: humidityOffset, - pressureOffset: pressureOffset - ) - return AnyRuuviTagSensorRecord(object: inner) - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm.swift deleted file mode 100644 index 6df825b7b..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagLatestDataRealm.swift +++ /dev/null @@ -1,102 +0,0 @@ -import BTKit -import Foundation -import RealmSwift - -public final class RuuviTagLatestDataRealm: Object { - @objc public dynamic var uuid: String = "" - @objc public dynamic var ruuviTag: RuuviTagRealm? - @objc public dynamic var date: Date = .init() - @objc public dynamic var sourceString: String = "unknown" - - // all versions - public let rssi = RealmProperty() - public let celsius = RealmProperty() - public let humidity = RealmProperty() - public let pressure = RealmProperty() - - // v3 & v5 - public let accelerationX = RealmProperty() - public let accelerationY = RealmProperty() - public let accelerationZ = RealmProperty() - public let voltage = RealmProperty() - - // v5 - public let movementCounter = RealmProperty() - public let measurementSequenceNumber = RealmProperty() - public let txPower = RealmProperty() - - @objc public dynamic var temperatureOffset: Double = 0.0 - @objc public dynamic var humidityOffset: Double = 0.0 - @objc public dynamic var pressureOffset: Double = 0.0 - - public var fahrenheit: Double? { - celsius.value?.fahrenheit - } - - public var kelvin: Double? { - celsius.value?.kelvin - } - - public var source: RuuviTagSensorRecordSource { - RuuviTagSensorRecordSource(rawValue: sourceString) ?? .unknown - } - - override public static func primaryKey() -> String? { - "uuid" - } - - public convenience init(ruuviTag: RuuviTagRealm, data: RuuviTagProtocol, date: Date) { - self.init(ruuviTag: ruuviTag, data: data) - self.date = date - } - - public convenience init(ruuviTag: RuuviTagRealm, data: RuuviTagProtocol) { - self.init() - uuid = ruuviTag.uuid - self.ruuviTag = ruuviTag - sourceString = data.source.rawValue - rssi.value = data.rssi - celsius.value = data.celsius - humidity.value = data.relativeHumidity - pressure.value = data.hectopascals - accelerationX.value = data.accelerationX - accelerationY.value = data.accelerationY - accelerationZ.value = data.accelerationZ - voltage.value = data.volts - movementCounter.value = data.movementCounter - measurementSequenceNumber.value = data.measurementSequenceNumber - txPower.value = data.txPower - } - - public convenience init(ruuviTag: RuuviTagRealm, data: RuuviTagEnvLogFull) { - self.init() - self.ruuviTag = ruuviTag - sourceString = RuuviTagSensorRecordSource.log.rawValue - date = data.date - celsius.value = data.temperature - humidity.value = data.humidity - pressure.value = data.pressure - uuid = ruuviTag.uuid - } - - public convenience init(ruuviTag: RuuviTagRealm, record: RuuviTagSensorRecord) { - self.init() - self.ruuviTag = ruuviTag - sourceString = record.source.rawValue - rssi.value = record.rssi - celsius.value = record.temperature?.converted(to: .celsius).value - humidity.value = record.humidity?.value - pressure.value = record.pressure?.converted(to: .hectopascals).value - accelerationX.value = record.acceleration?.x.value - accelerationY.value = record.acceleration?.y.value - accelerationZ.value = record.acceleration?.z.value - voltage.value = record.voltage?.converted(to: .volts).value - movementCounter.value = record.movementCounter - measurementSequenceNumber.value = record.measurementSequenceNumber - txPower.value = record.txPower - uuid = record.uuid - temperatureOffset = record.temperatureOffset - humidityOffset = record.humidityOffset - pressureOffset = record.pressureOffset - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm+RuuviTagSensor.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm+RuuviTagSensor.swift deleted file mode 100644 index 114fdade2..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm+RuuviTagSensor.swift +++ /dev/null @@ -1,60 +0,0 @@ -import Foundation -import RealmSwift - -extension RuuviTagRealm: RuuviTagSensor { - public var luid: LocalIdentifier? { - uuid.luid - } - - public var macId: MACIdentifier? { - mac?.mac - } - - public var any: AnyRuuviTagSensor { - AnyRuuviTagSensor( - object: RuuviTagSensorStruct( - version: version, - firmwareVersion: firmwareVersion, - luid: luid, - macId: macId, - isConnectable: isConnectable, - name: name, - isClaimed: isClaimed, - isOwner: isOwner, - owner: owner, - ownersPlan: ownersPlan, - isCloudSensor: isCloudSensor, - canShare: canShare, - sharedTo: sharedTo - ) - ) - } - - public var isClaimed: Bool { - false - } - - public var owner: String? { - nil - } - - public var ownersPlan: String? { - nil - } - - public var isCloudSensor: Bool? { - false - } - - public var firmwareVersion: String? { - nil - } - - public var canShare: Bool { - false - } - - public var sharedTo: [String] { - [] - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm.swift deleted file mode 100644 index be4652124..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealm.swift +++ /dev/null @@ -1,48 +0,0 @@ -import BTKit -import Foundation -import RealmSwift - -public final class RuuviTagRealm: Object, RuuviTagRealmProtocol { - @objc public dynamic var uuid: String = "" - @objc public dynamic var name: String = "" - @objc public dynamic var mac: String? - @objc public dynamic var version: Int = 0 - @objc public dynamic var isConnectable: Bool = false - @objc public dynamic var isOwner: Bool = true - - public let data = LinkingObjects(fromType: RuuviTagDataRealm.self, property: "ruuviTag") - - override public static func primaryKey() -> String { - "uuid" - } - - public required convenience init(mac: String) { - self.init() - uuid = UUID().uuidString - self.mac = mac - name = mac - version = 5 - isConnectable = true - isOwner = true - } - - public required convenience init(ruuviTag: RuuviTagProtocol, name: String) { - self.init() - uuid = ruuviTag.uuid - self.name = name - mac = ruuviTag.mac - version = ruuviTag.version - isConnectable = ruuviTag.isConnectable - isOwner = ruuviTag.isOwner - } - - public required convenience init(ruuviTag: RuuviTagSensor) { - self.init() - uuid = ruuviTag.id - name = ruuviTag.name - mac = ruuviTag.macId?.value - version = ruuviTag.version - isConnectable = ruuviTag.isConnectable - isOwner = ruuviTag.isOwner - } -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealmProtocol.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealmProtocol.swift deleted file mode 100644 index 6656954ff..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/RuuviTagRealmProtocol.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Foundation -import RealmSwift - -public protocol RuuviTagRealmProtocol: Object { - var uuid: String { get set } - var name: String { get set } - var mac: String? { get set } - var version: Int { get set } - var isConnectable: Bool { get set } - var data: LinkingObjects { get } - init(ruuviTag: RuuviTagProtocol, name: String) -} diff --git a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/SensorSettingsRealm.swift b/Packages/RuuviOntology/Sources/RuuviOntologyRealm/SensorSettingsRealm.swift deleted file mode 100644 index 090afd652..000000000 --- a/Packages/RuuviOntology/Sources/RuuviOntologyRealm/SensorSettingsRealm.swift +++ /dev/null @@ -1,49 +0,0 @@ -import Foundation -import RealmSwift - -public class SensorSettingsRealm: Object { - @objc public dynamic var luid: String? - @objc public dynamic var macId: String? - - public let temperatureOffset = RealmProperty() - @objc public dynamic var temperatureOffsetDate: Date? - - public let humidityOffset = RealmProperty() - @objc public dynamic var humidityOffsetDate: Date? - - public let pressureOffset = RealmProperty() - @objc public dynamic var pressureOffsetDate: Date? - - public convenience init(ruuviTag: RuuviTagSensor) { - self.init() - luid = ruuviTag.luid?.value - macId = ruuviTag.macId?.value - } - - public convenience init(settings: SensorSettings) { - self.init() - luid = settings.luid?.value - macId = settings.macId?.value - temperatureOffset.value = settings.temperatureOffset - temperatureOffsetDate = settings.temperatureOffsetDate - humidityOffset.value = settings.humidityOffset - humidityOffsetDate = settings.humidityOffsetDate - pressureOffset.value = settings.pressureOffset - pressureOffsetDate = settings.pressureOffsetDate - } -} - -public extension SensorSettingsRealm { - var sensorSettings: SensorSettings { - SensorSettingsStruct( - luid: luid?.luid, - macId: macId?.mac, - temperatureOffset: temperatureOffset.value, - temperatureOffsetDate: temperatureOffsetDate, - humidityOffset: humidityOffset.value, - humidityOffsetDate: humidityOffsetDate, - pressureOffset: pressureOffset.value, - pressureOffsetDate: pressureOffsetDate - ) - } -} diff --git a/Packages/RuuviOntology/target.yml b/Packages/RuuviOntology/target.yml index 52fc3e669..e4c8a4e34 100644 --- a/Packages/RuuviOntology/target.yml +++ b/Packages/RuuviOntology/target.yml @@ -13,7 +13,4 @@ targets: dependencies: - package: Humidity - package: BTKit - - package: Realm - - package: Realm - product: RealmSwift - package: GRDB diff --git a/Packages/RuuviPersistence/Sources/RuuviPersistence/RuuviPersistenceError.swift b/Packages/RuuviPersistence/Sources/RuuviPersistence/RuuviPersistenceError.swift index a5e25d302..a6ad5a1fc 100644 --- a/Packages/RuuviPersistence/Sources/RuuviPersistence/RuuviPersistenceError.swift +++ b/Packages/RuuviPersistence/Sources/RuuviPersistence/RuuviPersistenceError.swift @@ -2,6 +2,5 @@ import Foundation public enum RuuviPersistenceError: Error { case grdb(Error) - case realm(Error) case failedToFindRuuviTag } diff --git a/Packages/RuuviPersistence/Sources/RuuviPersistenceRealm/RuuviPersistenceRealm.swift b/Packages/RuuviPersistence/Sources/RuuviPersistenceRealm/RuuviPersistenceRealm.swift deleted file mode 100644 index 3ec363bc3..000000000 --- a/Packages/RuuviPersistence/Sources/RuuviPersistenceRealm/RuuviPersistenceRealm.swift +++ /dev/null @@ -1,753 +0,0 @@ -// swiftlint:disable file_length -import BTKit -import Foundation -import Future -import RealmSwift -import RuuviContext -import RuuviOntology -#if canImport(FirebaseCrashlytics) // TODO: @rinat eliminate - import FirebaseCrashlytics -#endif - -// swiftlint:disable type_body_length -public class RuuviPersistenceRealm: RuuviPersistence { - private let context: RealmContext - - public init(context: RealmContext) { - self.context = context - } - - public func create(_ ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - assert(ruuviTag.macId == nil) - assert(ruuviTag.luid != nil) - context.bgWorker.enqueue { - do { - let realmTag = RuuviTagRealm(ruuviTag: ruuviTag) - try self.context.bg.write { - self.context.bg.add(realmTag, update: .error) - } - promise.succeed(value: true) - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func update(_ ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - assert(ruuviTag.macId == nil) - assert(ruuviTag.luid != nil) - context.bgWorker.enqueue { - do { - let realmTag = RuuviTagRealm(ruuviTag: ruuviTag) - try self.context.bg.write { - self.context.bg.add(realmTag, update: .modified) - } - promise.succeed(value: true) - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func delete(_ ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - assert(ruuviTag.macId == nil) - assert(ruuviTag.luid != nil) - context.bgWorker.enqueue { - do { - if let realmTag = self.context.bg.object( - ofType: RuuviTagRealm.self, - forPrimaryKey: ruuviTag.luid?.value ?? ruuviTag.id - ) { - try self.context.bg.write { - self.context.bg.delete(realmTag) - } - promise.succeed(value: true) - } else { - promise.fail(error: .failedToFindRuuviTag) - } - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func deleteAllRecords(_ ruuviTagId: String) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - do { - let data = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@", ruuviTagId) - try self.context.bg.write { - self.context.bg.delete(data) - } - promise.succeed(value: true) - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func deleteAllRecords(_ ruuviTagId: String, before date: Date) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - do { - let data = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@ AND date < %@", ruuviTagId, date) - try self.context.bg.write { - self.context.bg.delete(data) - } - promise.succeed(value: true) - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func create(_ record: RuuviTagSensorRecord) -> Future { - let promise = Promise() - assert(record.macId == nil) - context.bgWorker.enqueue { - do { - if let ruuviTag = self.context.bg.object( - ofType: RuuviTagRealm.self, - forPrimaryKey: record.luid?.value ?? record.id - ) { - let data = RuuviTagDataRealm(ruuviTag: ruuviTag, record: record) - try self.context.bg.write { - self.context.bg.add(data, update: .all) - } - promise.succeed(value: true) - } else { - promise.fail(error: .failedToFindRuuviTag) - } - } catch { - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func createLast(_ record: RuuviTagSensorRecord) -> Future { - let promise = Promise() - assert(record.macId == nil) - context.bgWorker.enqueue { - do { - if let ruuviTag = self.context.bg.object( - ofType: RuuviTagRealm.self, - forPrimaryKey: record.luid?.value ?? record.id - ) { - let data = RuuviTagLatestDataRealm(ruuviTag: ruuviTag, record: record) - try self.context.bg.write { - self.context.bg.add(data, update: .all) - } - promise.succeed(value: true) - } else { - promise.fail(error: .failedToFindRuuviTag) - } - } catch { - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func updateLast(_ record: RuuviTagSensorRecord) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - do { - if let ruuviTag = self.context.bg.object( - ofType: RuuviTagRealm.self, - forPrimaryKey: record.luid?.value ?? record.id - ) { - let data = RuuviTagLatestDataRealm(ruuviTag: ruuviTag, record: record) - try self.context.bg.write { - self.context.bg.add(data, update: .modified) - } - promise.succeed(value: true) - } else { - promise.fail(error: .failedToFindRuuviTag) - } - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func deleteLatest(_ ruuviTagId: String) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - do { - let data = self.context.bg.objects(RuuviTagLatestDataRealm.self) - .filter("ruuviTag.uuid == %@", ruuviTagId) - try self.context.bg.write { - self.context.bg.delete(data) - } - promise.succeed(value: true) - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func create(_ records: [RuuviTagSensorRecord]) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - do { - var failed = false - for record in records { - assert(record.macId == nil) - let extractedExpr: RuuviTagRealm? = self.context.bg - .object( - ofType: RuuviTagRealm.self, - forPrimaryKey: record.luid?.value ?? record.id - ) - if let ruuviTag = extractedExpr { - let data = RuuviTagDataRealm(ruuviTag: ruuviTag, record: record) - try self.context.bg.write { - self.context.bg.add(data, update: .all) - } - } else { - failed = true - } - } - if failed { - promise.fail(error: .failedToFindRuuviTag) - } else { - promise.succeed(value: true) - } - } catch { - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func readOne(_ ruuviTagId: String) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - if let ruuviTagRealm = self.context.bg.object(ofType: RuuviTagRealm.self, forPrimaryKey: ruuviTagId) { - let result = self.constructRuuviTagSensorStruct(from: ruuviTagRealm) - promise.succeed(value: result) - } else { - promise.fail(error: .failedToFindRuuviTag) - } - } - return promise.future - } - - public func readAll() -> Future<[AnyRuuviTagSensor], RuuviPersistenceError> { - let promise = Promise<[AnyRuuviTagSensor], RuuviPersistenceError>() - context.bgWorker.enqueue { - let realmEntities = self.context.bg.objects(RuuviTagRealm.self) - let result: [AnyRuuviTagSensor] = realmEntities.map { ruuviTagRealm in - self.constructRuuviTagSensorStruct(from: ruuviTagRealm) - } - promise.succeed(value: result) - } - return promise.future - } - - public func readAll(_ ruuviTagId: String) -> Future<[RuuviTagSensorRecord], RuuviPersistenceError> { - let promise = Promise<[RuuviTagSensorRecord], RuuviPersistenceError>() - context.bgWorker.enqueue { - let realmRecords = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@", ruuviTagId) - .sorted(byKeyPath: "date") - let result: [RuuviTagSensorRecord] = realmRecords.map { realmRecord in - self.constructRecordStruct( - from: realmRecord, - luid: realmRecord.ruuviTag?.luid, - sequenceNumber: realmRecord.measurementSequenceNumber.value - ) - } - promise.succeed(value: result) - } - return promise.future - } - - public func readAll( - _ ruuviTagId: String, - with interval: TimeInterval - ) -> Future<[RuuviTagSensorRecord], RuuviPersistenceError> { - let promise = Promise<[RuuviTagSensorRecord], RuuviPersistenceError>() - context.bgWorker.enqueue { - let ruuviTagDataRealms = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@", ruuviTagId) - .sorted(byKeyPath: "date") - var results: [RuuviTagSensorRecord] = [] - var previousDate = ruuviTagDataRealms.first?.date ?? Date() - for tagDataRealm in ruuviTagDataRealms { - autoreleasepool { - guard tagDataRealm.date >= previousDate.addingTimeInterval(interval) - else { - return - } - previousDate = tagDataRealm.date - results.append( - self.constructRecordStruct( - from: tagDataRealm, - luid: tagDataRealm.ruuviTag?.luid, - sequenceNumber: tagDataRealm.measurementSequenceNumber.value - ) - ) - } - } - promise.succeed(value: results) - } - return promise.future - } - - public func readAll( - _ ruuviTagId: String, - after date: Date - ) -> Future<[RuuviTagSensorRecord], RuuviPersistenceError> { - let promise = Promise<[RuuviTagSensorRecord], RuuviPersistenceError>() - context.bgWorker.enqueue { - let realmRecords = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@ AND date > %@", ruuviTagId, date) - .sorted(byKeyPath: "date") - var results: [RuuviTagSensorRecord] = [] - var previousDate = realmRecords.first?.date ?? Date() - for realmRecord in realmRecords { - autoreleasepool { - guard realmRecord.date >= previousDate - else { - return - } - previousDate = realmRecord.date - results.append( - self.constructRecordStruct( - from: realmRecord, - luid: realmRecord.ruuviTag?.luid, - sequenceNumber: realmRecord.measurementSequenceNumber.value - ) - ) - } - } - promise.succeed(value: results) - } - return promise.future - } - - public func read( - _ ruuviTagId: String, - after date: Date, - with interval: TimeInterval - ) -> Future<[RuuviTagSensorRecord], RuuviPersistenceError> { - let promise = Promise<[RuuviTagSensorRecord], RuuviPersistenceError>() - context.bgWorker.enqueue { - let realmRecords = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@ AND date > %@", ruuviTagId, date) - .sorted(byKeyPath: "date") - var results: [RuuviTagSensorRecord] = [] - var previousDate = realmRecords.first?.date ?? Date() - for realmRecord in realmRecords { - autoreleasepool { - guard realmRecord.date >= previousDate.addingTimeInterval(interval) - else { - return - } - previousDate = realmRecord.date - results.append( - self.constructRecordStruct( - from: realmRecord, - luid: realmRecord.ruuviTag?.luid, - sequenceNumber: realmRecord.measurementSequenceNumber.value - ) - ) - } - } - promise.succeed(value: results) - } - return promise.future - } - - public func readDownsampled( - _: String, - after _: Date, - with _: Int, - pick _: Double - ) -> Future<[RuuviTagSensorRecord], RuuviPersistenceError> { - let promise = Promise<[RuuviTagSensorRecord], RuuviPersistenceError>() - // No need to implement since the RealmDB will be removed in the future. - return promise.future - } - - public func readLast( - _ ruuviTagId: String, - from: TimeInterval - ) -> Future<[RuuviTagSensorRecord], RuuviPersistenceError> { - let promise = Promise<[RuuviTagSensorRecord], RuuviPersistenceError>() - context.bgWorker.enqueue { - let realmRecords = self.context.bg - .objects(RuuviTagDataRealm.self) - .filter( - "ruuviTag.uuid == %@ AND date > %@", - ruuviTagId, - Date(timeIntervalSince1970: from) - ) - .sorted(byKeyPath: "date") - let result: [RuuviTagSensorRecord] = realmRecords.map { record in - self.constructRecordStruct( - from: record, - luid: record.ruuviTag?.luid, - sequenceNumber: record.measurementSequenceNumber.value - ) - } - promise.succeed(value: result) - } - return promise.future - } - - public func readLast(_ ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - guard ruuviTag.macId == nil, - let luid = ruuviTag.luid - else { - promise.succeed(value: nil) - return promise.future - } - context.bgWorker.enqueue { - if let lastRecord = self.context.bg.objects(RuuviTagDataRealm.self) - .filter("ruuviTag.uuid == %@", luid.value) - .sorted(byKeyPath: "date", ascending: false) - .first { - let sequenceNumber = lastRecord.measurementSequenceNumber.value - let lastRecordResult = self.constructRecordStruct( - from: lastRecord, - luid: luid, - sequenceNumber: sequenceNumber - ) - promise.succeed(value: lastRecordResult) - } else { - promise.succeed(value: nil) - } - } - return promise.future - } - - public func readLatest(_ ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - guard ruuviTag.macId == nil, - let luid = ruuviTag.luid - else { - promise.succeed(value: nil) - return promise.future - } - context.bgWorker.enqueue { - if let lastRecord = self.context.bg.objects(RuuviTagLatestDataRealm.self) - .filter("ruuviTag.uuid == %@", luid.value) - .sorted(byKeyPath: "date", ascending: false) - .first { - let sequenceNumber = lastRecord.measurementSequenceNumber.value - let lastRecordResult = self.constructRecordStruct( - from: lastRecord, - luid: luid, - sequenceNumber: sequenceNumber - ) - promise.succeed(value: lastRecordResult) - } else { - promise.succeed(value: nil) - } - } - return promise.future - } - - public func getStoredTagsCount() -> Future { - let promise = Promise() - context.bgWorker.enqueue { - let tagsCount = self.context.bg.objects(RuuviTagRealm.self).count - promise.succeed(value: tagsCount) - } - return promise.future - } - - public func getStoredMeasurementsCount() -> Future { - let promise = Promise() - context.bgWorker.enqueue { - let tagsCount = self.context.bg.objects(RuuviTagDataRealm.self).count - promise.succeed(value: tagsCount) - } - return promise.future - } - - public func readSensorSettings(_ ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - guard ruuviTag.macId == nil, - ruuviTag.luid != nil - else { - promise.fail(error: .failedToFindRuuviTag) - return promise.future - } - context.bgWorker.enqueue { - if let record = self.context.bg.objects(SensorSettingsRealm.self) - .first(where: { - ($0.luid != nil && $0.luid == ruuviTag.luid?.value) - || ($0.macId != nil && $0.macId == ruuviTag.macId?.value) - }) { - promise.succeed(value: record.sensorSettings) - } else { - promise.succeed(value: nil) - } - } - return promise.future - } - - public func save( - sensorSettings: SensorSettings - ) -> Future { - let promise = Promise() - context.bgWorker.enqueue { - do { - let sensorSettingsRealm = SensorSettingsRealm(settings: sensorSettings) - try self.context.bg.write { - self.context.bg.add(sensorSettingsRealm, update: .all) - } - promise.succeed(value: sensorSettings) - } catch { - promise.fail(error: .grdb(error)) - } - } - return promise.future - } - - public func updateOffsetCorrection( - type: OffsetCorrectionType, - with value: Double?, - of ruuviTag: RuuviTagSensor, - lastOriginalRecord _: RuuviTagSensorRecord? - ) -> Future { - let promise = Promise() - assert(ruuviTag.macId == nil) - assert(ruuviTag.luid != nil) - context.bgWorker.enqueue { - do { - if let record = self.context.bg.objects(SensorSettingsRealm.self) - .first(where: { - ($0.luid != nil && $0.luid == ruuviTag.luid?.value) - || ($0.macId != nil && $0.macId == ruuviTag.macId?.value) - }) { - try self.context.bg.write { - switch type { - case .humidity: - record.humidityOffset.value = value - record.humidityOffsetDate = value == nil ? nil : Date() - case .pressure: - record.pressureOffset.value = value - record.pressureOffsetDate = value == nil ? nil : Date() - default: - record.temperatureOffset.value = value - record.temperatureOffsetDate = value == nil ? nil : Date() - } - } - promise.succeed(value: record.sensorSettings) - } else { - let sensorSettingsRealm = SensorSettingsRealm(ruuviTag: ruuviTag) - switch type { - case .humidity: - sensorSettingsRealm.humidityOffset.value = value - sensorSettingsRealm.humidityOffsetDate = value == nil ? nil : Date() - case .pressure: - sensorSettingsRealm.pressureOffset.value = value - sensorSettingsRealm.pressureOffsetDate = value == nil ? nil : Date() - default: - sensorSettingsRealm.temperatureOffset.value = value - sensorSettingsRealm.temperatureOffsetDate = value == nil ? nil : Date() - } - try self.context.bg.write { - self.context.bg.add(sensorSettingsRealm, update: .error) - } - promise.succeed(value: sensorSettingsRealm.sensorSettings) - } - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func deleteOffsetCorrection(ruuviTag: RuuviTagSensor) -> Future { - let promise = Promise() - assert(ruuviTag.macId == nil) - assert(ruuviTag.luid != nil) - context.bgWorker.enqueue { - do { - if let sensorSettingRealm = self.context.bg.objects(SensorSettingsRealm.self) - .first(where: { - ($0.luid != nil && $0.luid == ruuviTag.luid?.value) - || ($0.macId != nil && $0.macId == ruuviTag.macId?.value) - }) { - try self.context.bg.write { - self.context.bg.delete(sensorSettingRealm) - } - promise.succeed(value: true) - } else { - promise.fail(error: .failedToFindRuuviTag) - } - } catch { - self.reportToCrashlytics(error: error) - promise.fail(error: .realm(error)) - } - } - return promise.future - } - - public func cleanupDBSpace() -> Future { - let promise = Promise() - // No op for realmDB since this will be deprecated soon. - return promise.future - } - - // MARK: - Queued cloud requests - - @discardableResult - public func readQueuedRequests() -> Future<[RuuviCloudQueuedRequest], RuuviPersistenceError> { - let promise = Promise<[RuuviCloudQueuedRequest], RuuviPersistenceError>() - // No op for realmDB since this will be deprecated soon. - return promise.future - } - - @discardableResult - public func readQueuedRequests( - for _: String - ) -> Future<[RuuviCloudQueuedRequest], RuuviPersistenceError> { - let promise = Promise<[RuuviCloudQueuedRequest], RuuviPersistenceError>() - // No op for realmDB since this will be deprecated soon. - return promise.future - } - - @discardableResult - public func readQueuedRequests( - for _: RuuviCloudQueuedRequestType - ) -> Future<[RuuviCloudQueuedRequest], RuuviPersistenceError> { - let promise = Promise<[RuuviCloudQueuedRequest], RuuviPersistenceError>() - // No op for realmDB since this will be deprecated soon. - return promise.future - } - - @discardableResult - public func createQueuedRequest( - _: RuuviCloudQueuedRequest - ) -> Future { - let promise = Promise() - // No op for realmDB since this will be deprecated soon. - return promise.future - } - - @discardableResult - public func deleteQueuedRequest( - _: RuuviCloudQueuedRequest - ) -> Future { - let promise = Promise() - // No op for realmDB since this will be deprecated soon. - return promise.future - } - - @discardableResult - public func deleteQueuedRequests() -> Future { - let promise = Promise() - // No op for realmDB since this will be deprecated soon. - return promise.future - } -} - -// MARK: - Private - -extension RuuviPersistenceRealm { - func reportToCrashlytics(error: Error, method: String = #function, line: Int = #line) { - #if canImport(FirebaseCrashlytics) - Crashlytics.crashlytics().log("\(method)(line: \(line)") - Crashlytics.crashlytics().record(error: error) - #endif - } - - private func constructRuuviTagSensorStruct(from ruuviTagRealm: RuuviTagRealm) -> AnyRuuviTagSensor { - RuuviTagSensorStruct( - version: ruuviTagRealm.version, - firmwareVersion: ruuviTagRealm.firmwareVersion, - luid: ruuviTagRealm.uuid.luid, - macId: ruuviTagRealm.mac?.mac, - isConnectable: ruuviTagRealm.isConnectable, - name: ruuviTagRealm.name, - isClaimed: false, - isOwner: ruuviTagRealm.isOwner, - owner: ruuviTagRealm.owner, - ownersPlan: ruuviTagRealm.ownersPlan, - isCloudSensor: ruuviTagRealm.isCloudSensor, - canShare: ruuviTagRealm.canShare, - sharedTo: ruuviTagRealm.sharedTo - ).any - } - - private func constructRecordStruct( - from lastRecord: RuuviTagDataRealm, - luid: LocalIdentifier?, - sequenceNumber: Int? - ) -> RuuviTagSensorRecordStruct { - let lastRecordResult = RuuviTagSensorRecordStruct( - luid: luid, - date: lastRecord.date, - source: lastRecord.source, - macId: nil, - rssi: lastRecord.rssi.value, - temperature: lastRecord.unitTemperature, - humidity: lastRecord.unitHumidity, - pressure: lastRecord.unitPressure, - acceleration: lastRecord.acceleration, - voltage: lastRecord.unitVoltage, - movementCounter: lastRecord.movementCounter.value, - measurementSequenceNumber: sequenceNumber, - txPower: lastRecord.txPower.value, - temperatureOffset: lastRecord.temperatureOffset, - humidityOffset: lastRecord.humidityOffset, - pressureOffset: lastRecord.pressureOffset - ) - return lastRecordResult - } - - private func constructRecordStruct( - from lastRecord: RuuviTagLatestDataRealm, - luid: LocalIdentifier, - sequenceNumber: Int? - ) -> RuuviTagSensorRecordStruct { - let lastRecordResult = RuuviTagSensorRecordStruct( - luid: luid, - date: lastRecord.date, - source: lastRecord.source, - macId: nil, - rssi: lastRecord.rssi.value, - temperature: lastRecord.unitTemperature, - humidity: lastRecord.unitHumidity, - pressure: lastRecord.unitPressure, - acceleration: lastRecord.acceleration, - voltage: lastRecord.unitVoltage, - movementCounter: lastRecord.movementCounter.value, - measurementSequenceNumber: sequenceNumber, - txPower: lastRecord.txPower.value, - temperatureOffset: lastRecord.temperatureOffset, - humidityOffset: lastRecord.humidityOffset, - pressureOffset: lastRecord.pressureOffset - ) - return lastRecordResult - } -} - -// swiftlint:enable file_length type_body_length diff --git a/Packages/RuuviPersistence/target.yml b/Packages/RuuviPersistence/target.yml index 12a583477..392446f67 100644 --- a/Packages/RuuviPersistence/target.yml +++ b/Packages/RuuviPersistence/target.yml @@ -13,9 +13,6 @@ targets: dependencies: - package: Humidity - package: Future - - package: Realm - - package: Realm - product: RealmSwift - package: GRDB - target: RuuviOntology - target: RuuviContext diff --git a/Packages/RuuviPool/Sources/RuuviPool/RuuviPoolFactory.swift b/Packages/RuuviPool/Sources/RuuviPool/RuuviPoolFactory.swift index ad33593b1..26b4f9c4c 100644 --- a/Packages/RuuviPool/Sources/RuuviPool/RuuviPoolFactory.swift +++ b/Packages/RuuviPool/Sources/RuuviPool/RuuviPoolFactory.swift @@ -5,7 +5,6 @@ import RuuviPersistence public protocol RuuviPoolFactory { func create( sqlite: RuuviPersistence, - realm: RuuviPersistence, idPersistence: RuuviLocalIDs, settings: RuuviLocalSettings, connectionPersistence: RuuviLocalConnections diff --git a/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift b/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift index ed66fc45d..bb1dfe111 100644 --- a/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift +++ b/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift @@ -7,20 +7,17 @@ import RuuviPersistence // swiftlint:disable:next type_body_length final class RuuviPoolCoordinator: RuuviPool { private var sqlite: RuuviPersistence - private var realm: RuuviPersistence private var idPersistence: RuuviLocalIDs private var settings: RuuviLocalSettings private var connectionPersistence: RuuviLocalConnections init( sqlite: RuuviPersistence, - realm: RuuviPersistence, idPersistence: RuuviLocalIDs, settings: RuuviLocalSettings, connectionPersistence: RuuviLocalConnections ) { self.sqlite = sqlite - self.realm = realm self.idPersistence = idPersistence self.settings = settings self.connectionPersistence = connectionPersistence @@ -40,11 +37,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.create(ruuviTag).on(success: { result in - promise.succeed(value: result) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } if let macId = ruuviTag.macId, let luid = ruuviTag.luid { idPersistence.set(mac: macId, for: luid) @@ -62,11 +55,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.update(ruuviTag).on(success: { success in - promise.succeed(value: success) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } if let macId = ruuviTag.macId, let luid = ruuviTag.luid { idPersistence.set(mac: macId, for: luid) @@ -91,14 +80,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.delete(ruuviTag).on(success: { [weak self] success in - if let luid = ruuviTag.luid { - self?.connectionPersistence.setKeepConnection(false, for: luid) - } - promise.succeed(value: success) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } @@ -119,11 +101,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.create(record).on(success: { success in - promise.succeed(value: success) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } @@ -144,11 +122,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.createLast(record).on(success: { success in - promise.succeed(value: success) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } @@ -169,11 +143,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.updateLast(record).on(success: { success in - promise.succeed(value: success) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } @@ -181,8 +151,7 @@ final class RuuviPoolCoordinator: RuuviPool { func deleteLast(_ ruuviTagId: String) -> Future { let promise = Promise() let sqliteOperation = sqlite.deleteLatest(ruuviTagId) - let realmOpearion = realm.deleteLatest(ruuviTagId) - Future.zip(sqliteOperation, realmOpearion).on(success: { _ in + sqliteOperation.on(success: { _ in promise.succeed(value: true) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) @@ -193,10 +162,8 @@ final class RuuviPoolCoordinator: RuuviPool { func create(_ records: [RuuviTagSensorRecord]) -> Future { let promise = Promise() let sqliteRecords = records.filter { $0.macId != nil } - let realmRecords = records.filter { $0.macId == nil } let sqliteOperation = sqlite.create(sqliteRecords) - let realmOpearion = realm.create(realmRecords) - Future.zip(sqliteOperation, realmOpearion).on(success: { _ in + sqliteOperation.on(success: { _ in promise.succeed(value: true) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) @@ -207,9 +174,8 @@ final class RuuviPoolCoordinator: RuuviPool { func deleteAllRecords(_ ruuviTagId: String) -> Future { let promise = Promise() let sqliteOperation = sqlite.deleteAllRecords(ruuviTagId) - let realmOpearion = realm.deleteAllRecords(ruuviTagId) let cleanUpOperation = sqlite.cleanupDBSpace() - Future.zip(sqliteOperation, realmOpearion, cleanUpOperation).on(success: { _ in + Future.zip(sqliteOperation, cleanUpOperation).on(success: { _ in promise.succeed(value: true) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) @@ -220,9 +186,8 @@ final class RuuviPoolCoordinator: RuuviPool { func deleteAllRecords(_ ruuviTagId: String, before date: Date) -> Future { let promise = Promise() let sqliteOperation = sqlite.deleteAllRecords(ruuviTagId, before: date) - let realmOpearion = realm.deleteAllRecords(ruuviTagId, before: date) let cleanUpOperation = sqlite.cleanupDBSpace() - Future.zip(sqliteOperation, realmOpearion, cleanUpOperation).on(success: { _ in + Future.zip(sqliteOperation, cleanUpOperation).on(success: { _ in promise.succeed(value: true) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) @@ -261,17 +226,7 @@ final class RuuviPoolCoordinator: RuuviPool { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.updateOffsetCorrection( - type: type, - with: value, - of: ruuviTag, - lastOriginalRecord: record - ) - .on(success: { settings in - promise.succeed(value: settings) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } diff --git a/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolFactoryCoordinator.swift b/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolFactoryCoordinator.swift index 61e316c53..b32dae449 100644 --- a/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolFactoryCoordinator.swift +++ b/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolFactoryCoordinator.swift @@ -7,14 +7,12 @@ public final class RuuviPoolFactoryCoordinator: RuuviPoolFactory { public func create( sqlite: RuuviPersistence, - realm: RuuviPersistence, idPersistence: RuuviLocalIDs, settings: RuuviLocalSettings, connectionPersistence: RuuviLocalConnections ) -> RuuviPool { RuuviPoolCoordinator( sqlite: sqlite, - realm: realm, idPersistence: idPersistence, settings: settings, connectionPersistence: connectionPersistence diff --git a/Packages/RuuviReactor/Sources/RuuviReactor/RuuviReactorFactory.swift b/Packages/RuuviReactor/Sources/RuuviReactor/RuuviReactorFactory.swift index 50c6c931b..db8e26cb8 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactor/RuuviReactorFactory.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactor/RuuviReactorFactory.swift @@ -5,8 +5,6 @@ import RuuviPersistence public protocol RuuviReactorFactory { func create( sqliteContext: SQLiteContext, - realmContext: RealmContext, - sqlitePersistence: RuuviPersistence, - realmPersistence: RuuviPersistence + sqlitePersistence: RuuviPersistence ) -> RuuviReactor } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift index 337ebac55..1625d63cf 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift @@ -1,7 +1,6 @@ import Combine import Foundation import GRDB -import RealmSwift import RuuviContext import RuuviOntology @@ -9,26 +8,19 @@ final class RuuviTagLastRecordSubjectCombine { var isServing: Bool = false private var sqlite: SQLiteContext - private var realm: RealmContext private var luid: LocalIdentifier? private var macId: MACIdentifier? let subject = PassthroughSubject() - private var ruuviTagDataRealmToken: NotificationToken? private var ruuviTagDataTransactionObserver: TransactionObserver? - deinit { - ruuviTagDataRealmToken?.invalidate() - } - + init( luid: LocalIdentifier?, macId: MACIdentifier?, - sqlite: SQLiteContext, - realm: RealmContext + sqlite: SQLiteContext ) { self.sqlite = sqlite - self.realm = realm self.luid = luid self.macId = macId } @@ -49,23 +41,5 @@ final class RuuviTagLastRecordSubjectCombine { self?.subject.send(lastRecord) } } - let results = realm.main.objects(RuuviTagDataRealm.self) - .filter( - "ruuviTag.uuid == %@ || ruuviTag.mac == %@", - luid?.value ?? "invalid", - macId?.value ?? "invalid" - ) - .sorted(byKeyPath: "date") - ruuviTagDataRealmToken = results.observe { [weak self] change in - guard let sSelf = self else { return } - switch change { - case let .update(records, _, _, _): - if let lastRecord = records.last?.any { - sSelf.subject.send(lastRecord) - } - default: - break - } - } } } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLatestRecordSubjectCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLatestRecordSubjectCombine.swift index a31ef4622..d01e141ea 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLatestRecordSubjectCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLatestRecordSubjectCombine.swift @@ -1,7 +1,6 @@ import Combine import Foundation import GRDB -import RealmSwift import RuuviContext import RuuviOntology @@ -9,26 +8,19 @@ final class RuuviTagLatestRecordSubjectCombine { var isServing: Bool = false private var sqlite: SQLiteContext - private var realm: RealmContext private var luid: LocalIdentifier? private var macId: MACIdentifier? let subject = PassthroughSubject() - private var ruuviTagDataRealmToken: NotificationToken? private var ruuviTagDataTransactionObserver: TransactionObserver? - deinit { - ruuviTagDataRealmToken?.invalidate() - } init( luid: LocalIdentifier?, macId: MACIdentifier?, - sqlite: SQLiteContext, - realm: RealmContext + sqlite: SQLiteContext ) { self.sqlite = sqlite - self.realm = realm self.luid = luid self.macId = macId } @@ -49,23 +41,5 @@ final class RuuviTagLatestRecordSubjectCombine { self?.subject.send(lastRecord) } } - let results = realm.main.objects(RuuviTagLatestDataRealm.self) - .filter( - "ruuviTag.uuid == %@ || ruuviTag.mac == %@", - luid?.value ?? "invalid", - macId?.value ?? "invalid" - ) - .sorted(byKeyPath: "date") - ruuviTagDataRealmToken = results.observe { [weak self] change in - guard let sSelf = self else { return } - switch change { - case let .update(records, _, _, _): - if let lastRecord = records.last?.any { - sSelf.subject.send(lastRecord) - } - default: - break - } - } } } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagRecordSubjectCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagRecordSubjectCombine.swift index 93d7f8c72..a5762a1ed 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagRecordSubjectCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagRecordSubjectCombine.swift @@ -1,7 +1,6 @@ import Combine import Foundation import GRDB -import RealmSwift import RuuviContext import RuuviOntology @@ -9,27 +8,19 @@ final class RuuviTagRecordSubjectCombine { var isServing: Bool = false private var sqlite: SQLiteContext - private var realm: RealmContext private var luid: LocalIdentifier? private var macId: MACIdentifier? let subject = PassthroughSubject<[AnyRuuviTagSensorRecord], Never>() - private var ruuviTagDataRealmToken: NotificationToken? - private var ruuviTagDataRealmCache = [AnyRuuviTagSensorRecord]() private var ruuviTagDataTransactionObserver: TransactionObserver? - deinit { - ruuviTagDataRealmToken?.invalidate() - } init( luid: LocalIdentifier?, macId: MACIdentifier?, - sqlite: SQLiteContext, - realm: RealmContext + sqlite: SQLiteContext ) { self.sqlite = sqlite - self.realm = realm self.luid = luid self.macId = macId } @@ -49,29 +40,5 @@ final class RuuviTagRecordSubjectCombine { [weak self] records in self?.subject.send(records.map(\.any)) } - - let results = realm.main.objects(RuuviTagDataRealm.self) - .filter( - "ruuviTag.uuid == %@ || ruuviTag.mac == %@", - luid?.value ?? "invalid", - macId?.value ?? "invalid" - ) - .sorted(byKeyPath: "date") - ruuviTagDataRealmCache = results.compactMap(\.any) - ruuviTagDataRealmToken = results.observe { [weak self] change in - guard let sSelf = self else { return } - switch change { - case let .initial(records): - if records.count > 0 { - sSelf.subject.send(records.compactMap(\.any)) - } - case let .update(records, _, _, _): - if records.count > 0 { - sSelf.subject.send(records.compactMap(\.any)) - } - default: - break - } - } } } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift index f5ae07566..32c4613cd 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift @@ -1,30 +1,21 @@ import Combine import Foundation import GRDB -import RealmSwift import RuuviContext import RuuviOntology final class RuuviTagSubjectCombine { var sqlite: SQLiteContext - var realm: RealmContext let insertSubject = PassthroughSubject() let updateSubject = PassthroughSubject() let deleteSubject = PassthroughSubject() private var ruuviTagController: FetchedRecordsController - private var ruuviTagsRealmToken: NotificationToken? - private var ruuviTagRealmCache = [AnyRuuviTagSensor]() - - deinit { - ruuviTagsRealmToken?.invalidate() - } // swiftlint:disable:next cyclomatic_complexity function_body_length - init(sqlite: SQLiteContext, realm: RealmContext) { + init(sqlite: SQLiteContext) { self.sqlite = sqlite - self.realm = realm let request = RuuviTagSQLite.order(RuuviTagSQLite.versionColumn) ruuviTagController = try! FetchedRecordsController(sqlite.database.dbPool, request: request) @@ -49,35 +40,5 @@ final class RuuviTagSubjectCombine { break } }) - - DispatchQueue.main.async { [weak self] in - guard let sSelf = self else { return } - let results = sSelf.realm.main.objects(RuuviTagRealm.self) - sSelf.ruuviTagRealmCache = results.map(\.struct.any) - sSelf.ruuviTagsRealmToken = results.observe { [weak self] change in - guard let sSelf = self else { return } - switch change { - case let .update(ruuviSensors, deletions, insertions, modifications): - for del in deletions { - sSelf.deleteSubject.send(sSelf.ruuviTagRealmCache[del].struct.any) - } - sSelf.ruuviTagRealmCache = sSelf.ruuviTagRealmCache - .enumerated() - .filter { !deletions.contains($0.offset) } - .map(\.element) - for ins in insertions { - sSelf.insertSubject.send(ruuviSensors[ins].struct.any) - // TODO: test if ok with multiple - sSelf.ruuviTagRealmCache.insert(ruuviSensors[ins].struct.any, at: ins) - } - for mod in modifications { - sSelf.updateSubject.send(ruuviSensors[mod].struct.any) - sSelf.ruuviTagRealmCache[mod] = ruuviSensors[mod].struct.any - } - default: - break - } - } - } } } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift index 6fa2d6ab8..43a1f6284 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift @@ -1,7 +1,6 @@ import Combine import Foundation import GRDB -import RealmSwift import RuuviContext import RuuviOntology @@ -9,31 +8,22 @@ final class SensorSettingsCombine { var luid: LocalIdentifier? var macId: MACIdentifier? var sqlite: SQLiteContext - var realm: RealmContext let insertSubject = PassthroughSubject() let updateSubject = PassthroughSubject() let deleteSubject = PassthroughSubject() private var ruuviTagController: FetchedRecordsController - private var ruuviTagsRealmToken: NotificationToken? - private var ruuviTagRealmCache = [SensorSettings]() - - deinit { - ruuviTagsRealmToken?.invalidate() - } // swiftlint:disable:next cyclomatic_complexity function_body_length init( luid: LocalIdentifier?, macId: MACIdentifier?, - sqlite: SQLiteContext, - realm: RealmContext + sqlite: SQLiteContext ) { self.luid = luid self.macId = macId self.sqlite = sqlite - self.realm = realm let request = SensorSettingsSQLite .filter( @@ -56,40 +46,5 @@ final class SensorSettingsCombine { break } }) - - DispatchQueue.main.async { [weak self] in - guard let sSelf = self else { return } - let results = sSelf.realm.main.objects(SensorSettingsRealm.self) - .filter( - "luid == %@ || macId == %@", - luid?.value ?? "invalid", - macId?.value ?? "invalid" - ) - sSelf.ruuviTagRealmCache = results.map(\.sensorSettings) - sSelf.ruuviTagsRealmToken = results.observe { [weak self] change in - guard let sSelf = self else { return } - switch change { - case let .update(sensorSettings, deletions, insertions, modifications): - for del in deletions { - sSelf.deleteSubject.send(sSelf.ruuviTagRealmCache[del]) - } - sSelf.ruuviTagRealmCache = sSelf.ruuviTagRealmCache - .enumerated() - .filter { !deletions.contains($0.offset) } - .map(\.element) - for ins in insertions { - sSelf.insertSubject.send(sensorSettings[ins].sensorSettings) - // TODO: test if ok with multiple - sSelf.ruuviTagRealmCache.insert(sensorSettings[ins].sensorSettings, at: ins) - } - for mod in modifications { - sSelf.updateSubject.send(sensorSettings[mod].sensorSettings) - sSelf.ruuviTagRealmCache[mod] = sensorSettings[mod].sensorSettings - } - default: - break - } - } - } } } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorFactoryImpl.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorFactoryImpl.swift index cfa55b8f2..dcf974125 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorFactoryImpl.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorFactoryImpl.swift @@ -7,15 +7,11 @@ public final class RuuviReactorFactoryImpl: RuuviReactorFactory { public func create( sqliteContext: SQLiteContext, - realmContext: RealmContext, - sqlitePersistence: RuuviPersistence, - realmPersistence: RuuviPersistence + sqlitePersistence: RuuviPersistence ) -> RuuviReactor { RuuviReactorImpl( sqliteContext: sqliteContext, - realmContext: realmContext, - sqlitePersistence: sqlitePersistence, - realmPersistence: realmPersistence + sqlitePersistence: sqlitePersistence ) } } diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorImpl.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorImpl.swift index 9d3cf3ec8..4428c1521 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorImpl.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorImpl.swift @@ -7,28 +7,20 @@ import RuuviPersistence class RuuviReactorImpl: RuuviReactor { typealias SQLiteEntity = RuuviTagSQLite - typealias RealmEntity = RuuviTagRealm private let sqliteContext: SQLiteContext - private let realmContext: RealmContext private let sqlitePersistence: RuuviPersistence - private let realmPersistence: RuuviPersistence init( sqliteContext: SQLiteContext, - realmContext: RealmContext, - sqlitePersistence: RuuviPersistence, - realmPersistence: RuuviPersistence + sqlitePersistence: RuuviPersistence ) { self.sqliteContext = sqliteContext - self.realmContext = realmContext self.sqlitePersistence = sqlitePersistence - self.realmPersistence = realmPersistence } private lazy var entityCombine = RuuviTagSubjectCombine( - sqlite: sqliteContext, - realm: realmContext + sqlite: sqliteContext ) private lazy var recordCombines = [String: RuuviTagRecordSubjectCombine]() private lazy var lastRecordCombines = [String: RuuviTagLastRecordSubjectCombine]() @@ -46,8 +38,7 @@ class RuuviReactorImpl: RuuviReactor { let combine = RuuviTagRecordSubjectCombine( luid: luid, macId: nil, - sqlite: sqliteContext, - realm: realmContext + sqlite: sqliteContext ) recordCombines[luid.value] = combine recordCombine = combine @@ -65,10 +56,9 @@ class RuuviReactorImpl: RuuviReactor { func observe(_ block: @escaping (RuuviReactorChange) -> Void) -> RuuviReactorToken { let sqliteOperation = sqlitePersistence.readAll() - let realmOperation = realmPersistence.readAll() - Future.zip(realmOperation, sqliteOperation) - .on(success: { realmEntities, sqliteEntities in - let combinedValues = sqliteEntities + realmEntities + sqliteOperation + .on(success: { sqliteEntities in + let combinedValues = sqliteEntities block(.initial(combinedValues)) }, failure: { error in block(.error(.ruuviPersistence(error))) @@ -95,11 +85,11 @@ class RuuviReactorImpl: RuuviReactor { _ block: @escaping (RuuviReactorChange) -> Void ) -> RuuviReactorToken { let sqliteOperation = sqlitePersistence.readLast(ruuviTag) - let realmOperation = realmPersistence.readLast(ruuviTag) - Future.zip(realmOperation, sqliteOperation).on(success: { realmRecord, sqliteRecord in - let result = [realmRecord, sqliteRecord].compactMap { $0?.any }.last - block(.update(result)) - }) + sqliteOperation + .on(success: { sqliteRecord in + let result = [sqliteRecord].compactMap { $0?.any }.last + block(.update(result)) + }) var recordCombine: RuuviTagLastRecordSubjectCombine if let combine = lastRecordCombines[ruuviTag.id] { recordCombine = combine @@ -107,8 +97,7 @@ class RuuviReactorImpl: RuuviReactor { let combine = RuuviTagLastRecordSubjectCombine( luid: ruuviTag.luid, macId: ruuviTag.macId, - sqlite: sqliteContext, - realm: realmContext + sqlite: sqliteContext ) lastRecordCombines[ruuviTag.id] = combine recordCombine = combine @@ -129,9 +118,8 @@ class RuuviReactorImpl: RuuviReactor { _ block: @escaping (RuuviReactorChange) -> Void ) -> RuuviReactorToken { let sqliteOperation = sqlitePersistence.readLatest(ruuviTag) - let realmOperation = realmPersistence.readLatest(ruuviTag) - Future.zip(realmOperation, sqliteOperation).on(success: { realmRecord, sqliteRecord in - let result = [realmRecord, sqliteRecord].compactMap { $0?.any }.last + sqliteOperation.on(success: { sqliteRecord in + let result = [sqliteRecord].compactMap { $0?.any }.last block(.update(result)) }) var recordCombine: RuuviTagLatestRecordSubjectCombine @@ -141,8 +129,7 @@ class RuuviReactorImpl: RuuviReactor { let combine = RuuviTagLatestRecordSubjectCombine( luid: ruuviTag.luid, macId: ruuviTag.macId, - sqlite: sqliteContext, - realm: realmContext + sqlite: sqliteContext ) latestRecordCombines[ruuviTag.id] = combine recordCombine = combine @@ -162,15 +149,11 @@ class RuuviReactorImpl: RuuviReactor { _ ruuviTag: RuuviTagSensor, _ block: @escaping (RuuviReactorChange) -> Void ) -> RuuviReactorToken { - sqlitePersistence.readSensorSettings(ruuviTag).on { [weak self] sqliteRecord in + sqlitePersistence.readSensorSettings(ruuviTag).on { sqliteRecord in if let sensorSettings = sqliteRecord { block(.update(sensorSettings)) } else { - self?.realmPersistence.readSensorSettings(ruuviTag).on(success: { realmRecord in - if let sensorSettings = realmRecord { - block(.update(sensorSettings)) - } - }) + assertionFailure() } } var sensorSettingsCombine: SensorSettingsCombine @@ -180,8 +163,7 @@ class RuuviReactorImpl: RuuviReactor { let combine = SensorSettingsCombine( luid: ruuviTag.luid, macId: ruuviTag.macId, - sqlite: sqliteContext, - realm: realmContext + sqlite: sqliteContext ) sensorSettingsCombines[ruuviTag.id] = combine sensorSettingsCombine = combine diff --git a/Packages/RuuviReactor/target.yml b/Packages/RuuviReactor/target.yml index 409ac880d..b98d45b15 100644 --- a/Packages/RuuviReactor/target.yml +++ b/Packages/RuuviReactor/target.yml @@ -14,9 +14,6 @@ targets: - package: Humidity - package: Future - package: GRDB - - package: Realm - - package: Realm - product: RealmSwift - target: RuuviOntology - target: RuuviPersistence - target: RuuviContext diff --git a/Packages/RuuviStorage/Sources/RuuviStorage/RuuviStorage.swift b/Packages/RuuviStorage/Sources/RuuviStorage/RuuviStorage.swift index 06d9e8f2e..01db4246e 100644 --- a/Packages/RuuviStorage/Sources/RuuviStorage/RuuviStorage.swift +++ b/Packages/RuuviStorage/Sources/RuuviStorage/RuuviStorage.swift @@ -41,5 +41,5 @@ public protocol RuuviStorage { } public protocol RuuviStorageFactory { - func create(realm: RuuviPersistence, sqlite: RuuviPersistence) -> RuuviStorage + func create(sqlite: RuuviPersistence) -> RuuviStorage } diff --git a/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageCoordinator.swift b/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageCoordinator.swift index 62a9d441e..088d87f9b 100644 --- a/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageCoordinator.swift +++ b/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageCoordinator.swift @@ -5,15 +5,12 @@ import RuuviPersistence final class RuuviStorageCoordinator: RuuviStorage { private let sqlite: RuuviPersistence - private let realm: RuuviPersistence - init(sqlite: RuuviPersistence, realm: RuuviPersistence) { + init(sqlite: RuuviPersistence) { self.sqlite = sqlite - self.realm = realm } func readOne(_ ruuviTagId: String) -> Future { - // TODO: @rinat respect realm let promise = Promise() sqlite.readOne(ruuviTagId).on(success: { sensor in promise.succeed(value: sensor) @@ -26,9 +23,8 @@ final class RuuviStorageCoordinator: RuuviStorage { func readAll(_ ruuviTagId: String) -> Future<[RuuviTagSensorRecord], RuuviStorageError> { let promise = Promise<[RuuviTagSensorRecord], RuuviStorageError>() let sqliteOperation = sqlite.readAll(ruuviTagId) - let realmOperation = realm.readAll(ruuviTagId) - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -38,10 +34,9 @@ final class RuuviStorageCoordinator: RuuviStorage { func readAll() -> Future<[AnyRuuviTagSensor], RuuviStorageError> { let promise = Promise<[AnyRuuviTagSensor], RuuviStorageError>() let sqliteOperation = sqlite.readAll() - let realmOperation = realm.readAll() - Future.zip(sqliteOperation, realmOperation) - .on(success: { sqliteEntities, realmEntities in - let combinedValues = sqliteEntities + realmEntities + sqliteOperation + .on(success: { sqliteEntities in + let combinedValues = sqliteEntities promise.succeed(value: combinedValues.map(\.any)) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) @@ -52,9 +47,8 @@ final class RuuviStorageCoordinator: RuuviStorage { func readAll(_ id: String, after date: Date) -> Future<[RuuviTagSensorRecord], RuuviStorageError> { let promise = Promise<[RuuviTagSensorRecord], RuuviStorageError>() let sqliteOperation = sqlite.readAll(id, after: date) - let realmOperation = realm.readAll(id, after: date) - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -68,9 +62,8 @@ final class RuuviStorageCoordinator: RuuviStorage { ) -> Future<[RuuviTagSensorRecord], RuuviStorageError> { let promise = Promise<[RuuviTagSensorRecord], RuuviStorageError>() let sqliteOperation = sqlite.read(id, after: date, with: interval) - let realmOperation = realm.read(id, after: date, with: interval) - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -104,9 +97,8 @@ final class RuuviStorageCoordinator: RuuviStorage { ) -> Future<[RuuviTagSensorRecord], RuuviStorageError> { let promise = Promise<[RuuviTagSensorRecord], RuuviStorageError>() let sqliteOperation = sqlite.readAll(id, with: interval) - let realmOperation = realm.readAll(id, with: interval) - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -116,9 +108,8 @@ final class RuuviStorageCoordinator: RuuviStorage { func readLast(_ id: String, from: TimeInterval) -> Future<[RuuviTagSensorRecord], RuuviStorageError> { let promise = Promise<[RuuviTagSensorRecord], RuuviStorageError>() let sqliteOperation = sqlite.readLast(id, from: from) - let realmOperation = realm.readLast(id, from: from) - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -134,11 +125,7 @@ final class RuuviStorageCoordinator: RuuviStorage { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.readLast(ruuviTag).on(success: { record in - promise.succeed(value: record) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } @@ -152,11 +139,7 @@ final class RuuviStorageCoordinator: RuuviStorage { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.readLatest(ruuviTag).on(success: { record in - promise.succeed(value: record) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } @@ -164,9 +147,8 @@ final class RuuviStorageCoordinator: RuuviStorage { func getStoredTagsCount() -> Future { let promise = Promise() let sqliteOperation = sqlite.getStoredTagsCount() - let realmOperation = realm.getStoredTagsCount() - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -196,9 +178,8 @@ final class RuuviStorageCoordinator: RuuviStorage { func getStoredMeasurementsCount() -> Future { let promise = Promise() let sqliteOperation = sqlite.getStoredMeasurementsCount() - let realmOperation = realm.getStoredMeasurementsCount() - Future.zip(sqliteOperation, realmOperation).on(success: { sqliteEntities, realmEntities in - promise.succeed(value: sqliteEntities + realmEntities) + sqliteOperation.on(success: { sqliteEntities in + promise.succeed(value: sqliteEntities) }, failure: { error in promise.fail(error: .ruuviPersistence(error)) }) @@ -214,11 +195,7 @@ final class RuuviStorageCoordinator: RuuviStorage { promise.fail(error: .ruuviPersistence(error)) }) } else { - realm.readSensorSettings(ruuviTag).on(success: { settings in - promise.succeed(value: settings) - }, failure: { error in - promise.fail(error: .ruuviPersistence(error)) - }) + assertionFailure() } return promise.future } diff --git a/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageFactoryCoordinator.swift b/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageFactoryCoordinator.swift index c141fcb6e..61931b19d 100644 --- a/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageFactoryCoordinator.swift +++ b/Packages/RuuviStorage/Sources/RuuviStorageCoordinator/RuuviStorageFactoryCoordinator.swift @@ -4,7 +4,7 @@ import RuuviPersistence public final class RuuviStorageFactoryCoordinator: RuuviStorageFactory { public init() {} - public func create(realm: RuuviPersistence, sqlite: RuuviPersistence) -> RuuviStorage { - RuuviStorageCoordinator(sqlite: sqlite, realm: realm) + public func create(sqlite: RuuviPersistence) -> RuuviStorage { + RuuviStorageCoordinator(sqlite: sqlite) } } diff --git a/project.yml b/project.yml index f40535fbd..849459e17 100644 --- a/project.yml +++ b/project.yml @@ -123,9 +123,6 @@ packages: KeychainAccess: url: https://github.com/kishikawakatsumi/KeychainAccess from: 4.2.1 - Realm: - url: https://github.com/realm/realm-cocoa - from: 10.8.0 GRDB: url: https://github.com/groue/GRDB.swift from: 4.14.0 From c4dc63571ae1981db441a8c39ac30a60ec77417b Mon Sep 17 00:00:00 2001 From: Rinat Enikeev Date: Sat, 16 Dec 2023 00:45:21 +0200 Subject: [PATCH 2/3] fix linker --- Apps/RuuviStation/Intents/target.yml | 1 - .../Sources/NotificationService.swift | 2 +- Apps/RuuviStation/NotificationService/target.yml | 4 +++- Apps/RuuviStation/Widgets/target.yml | 1 - Apps/RuuviStation/target.yml | 4 +++- Packages/RuuviDFU/target.yml | 1 + project.yml | 16 +++------------- 7 files changed, 11 insertions(+), 18 deletions(-) diff --git a/Apps/RuuviStation/Intents/target.yml b/Apps/RuuviStation/Intents/target.yml index ca8e03618..513f57399 100644 --- a/Apps/RuuviStation/Intents/target.yml +++ b/Apps/RuuviStation/Intents/target.yml @@ -27,7 +27,6 @@ targets: PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station.intents" Debug: CODE_SIGN_STYLE: Automatic - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries Release: EXCLUDED_SOURCE_FILE_NAMES: "FLEX*" CODE_SIGN_IDENTITY: "iPhone Distribution" diff --git a/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift b/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift index 537d14b17..652a6ac6c 100644 --- a/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift +++ b/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift @@ -148,7 +148,7 @@ extension NotificationService { private func localized(value: String) -> String { let languageUDKey = "SettingsUserDegaults.languageUDKey" guard let languageCode = notificationServiceAppGroup?.string(forKey: languageUDKey), - let bundle = Bundle.main.path( + let bundle = Bundle.main.path( //TODO: @rinat make it working forResource: languageCode, ofType: "lproj" ), diff --git a/Apps/RuuviStation/NotificationService/target.yml b/Apps/RuuviStation/NotificationService/target.yml index 9e36cde40..78a600716 100644 --- a/Apps/RuuviStation/NotificationService/target.yml +++ b/Apps/RuuviStation/NotificationService/target.yml @@ -21,13 +21,15 @@ targets: Alpha: CODE_SIGN_IDENTITY: "iPhone Distribution" PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station.pnservice" + # OTHER_LDFLAGS: -ld_classic Debug: CODE_SIGN_STYLE: Automatic - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries + # OTHER_LDFLAGS: -ld_classic Release: EXCLUDED_SOURCE_FILE_NAMES: "FLEX*" CODE_SIGN_IDENTITY: "iPhone Distribution" PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station.pnservice" + # OTHER_LDFLAGS: -ld_classic sources: - path: Sources name: NotificationService diff --git a/Apps/RuuviStation/Widgets/target.yml b/Apps/RuuviStation/Widgets/target.yml index a4f5f9815..c8684c466 100644 --- a/Apps/RuuviStation/Widgets/target.yml +++ b/Apps/RuuviStation/Widgets/target.yml @@ -23,7 +23,6 @@ targets: PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station.widgets" Debug: CODE_SIGN_STYLE: Automatic - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries Release: CODE_SIGN_IDENTITY: "iPhone Distribution" PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station.widgets" diff --git a/Apps/RuuviStation/target.yml b/Apps/RuuviStation/target.yml index 9a7d91114..3995585c7 100644 --- a/Apps/RuuviStation/target.yml +++ b/Apps/RuuviStation/target.yml @@ -92,13 +92,15 @@ targets: Alpha: CODE_SIGN_IDENTITY: "iPhone Distribution" PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station" + OTHER_LDFLAGS: -ld_classic Debug: CODE_SIGN_STYLE: Automatic - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries + OTHER_LDFLAGS: -ld_classic Release: EXCLUDED_SOURCE_FILE_NAMES: "FLEX*" CODE_SIGN_IDENTITY: "iPhone Distribution" PROVISIONING_PROFILE_SPECIFIER: "match AdHoc com.ruuvi.station" + OTHER_LDFLAGS: -ld_classic postCompileScripts: - path: ../../scripts/build/lint.sh name: Lint diff --git a/Packages/RuuviDFU/target.yml b/Packages/RuuviDFU/target.yml index 20cd7d52d..747227eb2 100644 --- a/Packages/RuuviDFU/target.yml +++ b/Packages/RuuviDFU/target.yml @@ -8,3 +8,4 @@ targets: name: DFU dependencies: - package: NordicDFU + - target: RuuviLocalization diff --git a/project.yml b/project.yml index 849459e17..47bd9a3ae 100644 --- a/project.yml +++ b/project.yml @@ -40,10 +40,7 @@ targetTemplates: CFBundlePackageType: $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString: "$(MARKETING_VERSION)" CFBundleVersion: $(CURRENT_PROJECT_VERSION) - MERGEABLE_LIBRARY: true - configs: - Debug: - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries + MERGEABLE_LIBRARY: false Module: name: "${target_name}" type: framework @@ -62,10 +59,7 @@ targetTemplates: CFBundlePackageType: $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString: "$(MARKETING_VERSION)" CFBundleVersion: $(CURRENT_PROJECT_VERSION) - MERGEABLE_LIBRARY: true - configs: - Debug: - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries + MERGEABLE_LIBRARY: false CommonFramework: name: "${target_name}" type: framework @@ -84,11 +78,7 @@ targetTemplates: CFBundlePackageType: $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString: "$(MARKETING_VERSION)" CFBundleVersion: $(CURRENT_PROJECT_VERSION) - MERGEABLE_LIBRARY: true - configs: - Debug: - OTHER_LDFLAGS: -Xlinker -no_warn_duplicate_libraries - + MERGEABLE_LIBRARY: false packages: BTKit: url: https://github.com/ruuvi/BTKit From f704bc5e3ec04a0ed92e04d707c213bebd99db12 Mon Sep 17 00:00:00 2001 From: Rinat Enikeev Date: Sat, 16 Dec 2023 00:47:27 +0200 Subject: [PATCH 3/3] fix warnings [linter] --- .../NotificationService/Sources/NotificationService.swift | 2 +- .../TagSettings/Submodules/DFU/View/DFUViewModel.swift | 1 - .../Properties/RuuviTagPropertiesDaemonBTKit.swift | 4 +--- .../Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift | 1 - .../RuuviTagLastRecordSubjectCombine.swift | 2 +- .../RuuviReactorCombine/RuuviTagSubjectCombine.swift | 1 - .../RuuviReactorCombine/SensorSettingsCombine.swift | 1 - 7 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift b/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift index 652a6ac6c..537d14b17 100644 --- a/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift +++ b/Apps/RuuviStation/NotificationService/Sources/NotificationService.swift @@ -148,7 +148,7 @@ extension NotificationService { private func localized(value: String) -> String { let languageUDKey = "SettingsUserDegaults.languageUDKey" guard let languageCode = notificationServiceAppGroup?.string(forKey: languageUDKey), - let bundle = Bundle.main.path( //TODO: @rinat make it working + let bundle = Bundle.main.path( forResource: languageCode, ofType: "lproj" ), diff --git a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift index b4dc6a7e7..dbd4243e3 100644 --- a/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift +++ b/Apps/RuuviStation/Sources/Classes/Presentation/Modules/TagSettings/Submodules/DFU/View/DFUViewModel.swift @@ -11,7 +11,6 @@ import RuuviPool import RuuviPresenters import RuuviStorage -// swiftlint:disable:next type_body_length final class DFUViewModel: ObservableObject { @Published private(set) var state: State = .idle @Published var downloadProgress: Double = 0 diff --git a/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift b/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift index b96bd0594..3c88f654e 100644 --- a/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift +++ b/Packages/RuuviDaemon/Sources/RuuviDaemonRuuviTag/Properties/RuuviTagPropertiesDaemonBTKit.swift @@ -6,7 +6,6 @@ import RuuviPersistence import RuuviPool import RuuviReactor -// swiftlint:disable:next type_body_length public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPropertiesDaemon { private let ruuviPool: RuuviPool private let ruuviReactor: RuuviReactor @@ -138,7 +137,6 @@ public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPro } } - // swiftlint:disable:next function_body_length @objc private func tryToUpdate(pair: RuuviTagPropertiesDaemonPair) { if let mac = pair.device.mac, mac != pair.ruuviTag.macId?.value { // this is the case when data format 3 tag (2.5.9) changes format @@ -151,7 +149,7 @@ public final class RuuviTagPropertiesDaemonBTKit: RuuviDaemonWorker, RuuviTagPro .on(failure: { [weak self] error in self?.post(error: .ruuviPool(error)) }) - } + } } else if pair.ruuviTag.macId?.value != nil, pair.device.mac == nil { // this is the case when 2.5.9 tag is returning to data format 3 mode // but we have it in sqlite database already diff --git a/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift b/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift index bb1dfe111..1651f8991 100644 --- a/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift +++ b/Packages/RuuviPool/Sources/RuuviPoolCoordinator/RuuviPoolCoordinator.swift @@ -4,7 +4,6 @@ import RuuviLocal import RuuviOntology import RuuviPersistence -// swiftlint:disable:next type_body_length final class RuuviPoolCoordinator: RuuviPool { private var sqlite: RuuviPersistence private var idPersistence: RuuviLocalIDs diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift index 1625d63cf..316049575 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagLastRecordSubjectCombine.swift @@ -14,7 +14,7 @@ final class RuuviTagLastRecordSubjectCombine { let subject = PassthroughSubject() private var ruuviTagDataTransactionObserver: TransactionObserver? - + init( luid: LocalIdentifier?, macId: MACIdentifier?, diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift index 32c4613cd..eb62bac27 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/RuuviTagSubjectCombine.swift @@ -13,7 +13,6 @@ final class RuuviTagSubjectCombine { private var ruuviTagController: FetchedRecordsController - // swiftlint:disable:next cyclomatic_complexity function_body_length init(sqlite: SQLiteContext) { self.sqlite = sqlite diff --git a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift index 43a1f6284..7a897bb29 100644 --- a/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift +++ b/Packages/RuuviReactor/Sources/RuuviReactorImpl/RuuviReactorCombine/SensorSettingsCombine.swift @@ -15,7 +15,6 @@ final class SensorSettingsCombine { private var ruuviTagController: FetchedRecordsController - // swiftlint:disable:next cyclomatic_complexity function_body_length init( luid: LocalIdentifier?, macId: MACIdentifier?,