jellyflood/Shared/SwiftfinStore/SwiftfinStore.swift

78 lines
2.0 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//
import CoreStore
import Factory
import Foundation
import JellyfinAPI
typealias AnyStoredData = SwiftfinStore.V2.AnyData
typealias ServerModel = SwiftfinStore.V2.StoredServer
typealias UserModel = SwiftfinStore.V2.StoredUser
typealias ServerState = SwiftfinStore.State.Server
typealias UserState = SwiftfinStore.State.User
// MARK: Namespaces
enum SwiftfinStore {
/// Namespace for V1 objects
enum V1 {}
/// Namespace for V2 objects
enum V2 {}
/// Namespace for state objects
enum State {}
}
// MARK: dataStack
// TODO: cleanup
extension SwiftfinStore {
static let dataStack: DataStack = {
DataStack(
V1.schema,
V2.schema,
migrationChain: ["V1", "V2"]
)
}()
private static let storage: SQLiteStore = {
SQLiteStore(
fileName: "Swiftfin.sqlite",
migrationMappingProviders: [Mappings.userV1_V2]
)
}()
static func requiresMigration() throws -> Bool {
try dataStack.requiredMigrationsForStorage(storage).isNotEmpty
}
static func setupDataStack() async throws {
try await withCheckedThrowingContinuation { continuation in
_ = dataStack.addStorage(storage) { result in
switch result {
case .success:
continuation.resume()
case let .failure(error):
LogManager.service().error("Failed creating datastack with: \(error.localizedDescription)")
continuation.resume(throwing: JellyfinAPIError("Failed creating datastack with: \(error.localizedDescription)"))
}
}
}
}
static let service = Factory<DataStack>(scope: .singleton) {
SwiftfinStore.dataStack
}
}