jellyflood/Shared/Singleton/ServerEnvironment.swift

64 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 2021 Aiden Vigue & Jellyfin Contributors
*/
import Combine
import CoreData
import Foundation
import JellyfinAPI
final class ServerEnvironment {
static let current = ServerEnvironment()
fileprivate(set) var server: Server!
init() {
let serverRequest: NSFetchRequest<Server> = Server.fetchRequest()
let servers = try? PersistenceController.shared.container.viewContext.fetch(serverRequest)
if servers?.count != 0 {
server = servers?.first
JellyfinAPI.basePath = server.baseURI!
}
}
func create(with uri: String) -> AnyPublisher<Server, Error> {
var uri = uri
if !uri.contains("http") {
uri = "https://" + uri
}
if uri.last == "/" {
uri = String(uri.dropLast())
}
JellyfinAPI.basePath = uri
return SystemAPI.getPublicSystemInfo()
.map { response in
let server = Server(context: PersistenceController.shared.container.viewContext)
server.baseURI = uri
server.name = response.serverName
server.server_id = response.id
return server
}
.handleEvents(receiveOutput: { [unowned self] response in
server = response
_ = try? PersistenceController.shared.container.viewContext.save()
}).eraseToAnyPublisher()
}
func reset() {
JellyfinAPI.basePath = ""
server = nil
let serverRequest: NSFetchRequest<NSFetchRequestResult> = Server.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: serverRequest)
// coredata will theoretically never throw
_ = try? PersistenceController.shared.container.viewContext.execute(deleteRequest)
}
}