81 lines
2.1 KiB
Swift
81 lines
2.1 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) 2025 Jellyfin & Jellyfin Contributors
|
|
//
|
|
|
|
import CoreStore
|
|
import Factory
|
|
import Foundation
|
|
import JellyfinAPI
|
|
import Logging
|
|
|
|
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
|
|
|
|
extension Container {
|
|
var dataStore: Factory<DataStack> { self { SwiftfinStore.dataStack }.singleton }
|
|
}
|
|
|
|
enum SwiftfinStore {
|
|
|
|
/// Namespace for V1 objects
|
|
enum V1 {}
|
|
|
|
/// Namespace for V2 objects
|
|
enum V2 {}
|
|
|
|
/// Namespace for state objects
|
|
enum State {}
|
|
|
|
private static let logger = Logger.swiftfin()
|
|
}
|
|
|
|
// 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):
|
|
logger.error("Failed creating datastack with: \(error.localizedDescription)")
|
|
continuation.resume(throwing: JellyfinAPIError("Failed creating datastack with: \(error.localizedDescription)"))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|