some marks on sessionmanager

This commit is contained in:
Ethan Pippin 2021-12-30 15:20:47 -07:00
parent 45a93b9de5
commit 4e2af9ec7f
1 changed files with 16 additions and 1 deletions

View File

@ -20,12 +20,16 @@ typealias CurrentLogin = (server: SwiftfinStore.State.Server, user: SwiftfinStor
// MARK: NewSessionManager // MARK: NewSessionManager
final class SessionManager { final class SessionManager {
// MARK: currentLogin // MARK: currentLogin
private(set) var currentLogin: CurrentLogin! private(set) var currentLogin: CurrentLogin!
// MARK: main // MARK: main
static let main = SessionManager() static let main = SessionManager()
// MARK: init
private init() { private init() {
if let lastUserID = SwiftfinStore.Defaults.suite[.lastServerUserID], if let lastUserID = SwiftfinStore.Defaults.suite[.lastServerUserID],
let user = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredUser>(), let user = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredUser>(),
@ -40,11 +44,13 @@ final class SessionManager {
} }
} }
// MARK: fetchServers
func fetchServers() -> [SwiftfinStore.State.Server] { func fetchServers() -> [SwiftfinStore.State.Server] {
let servers = try! SwiftfinStore.dataStack.fetchAll(From<SwiftfinStore.Models.StoredServer>()) let servers = try! SwiftfinStore.dataStack.fetchAll(From<SwiftfinStore.Models.StoredServer>())
return servers.map({ $0.state }) return servers.map({ $0.state })
} }
// MARK: fetchUsers
func fetchUsers(for server: SwiftfinStore.State.Server) -> [SwiftfinStore.State.User] { func fetchUsers(for server: SwiftfinStore.State.Server) -> [SwiftfinStore.State.User] {
guard let storedServer = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredServer>(), guard let storedServer = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredServer>(),
Where<SwiftfinStore.Models.StoredServer>("id == %@", server.id)) Where<SwiftfinStore.Models.StoredServer>("id == %@", server.id))
@ -52,6 +58,7 @@ final class SessionManager {
return storedServer.users.map({ $0.state }).sorted(by: { $0.username < $1.username }) return storedServer.users.map({ $0.state }).sorted(by: { $0.username < $1.username })
} }
// MARK: connectToServer publisher
// Connects to a server at the given uri, storing if successful // Connects to a server at the given uri, storing if successful
func connectToServer(with uri: String) -> AnyPublisher<SwiftfinStore.State.Server, Error> { func connectToServer(with uri: String) -> AnyPublisher<SwiftfinStore.State.Server, Error> {
var uriComponents = URLComponents(string: uri) ?? URLComponents() var uriComponents = URLComponents(string: uri) ?? URLComponents()
@ -104,6 +111,7 @@ final class SessionManager {
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
// MARK: addURIToServer publisher
func addURIToServer(server: SwiftfinStore.State.Server, uri: String) -> AnyPublisher<SwiftfinStore.State.Server, Error> { func addURIToServer(server: SwiftfinStore.State.Server, uri: String) -> AnyPublisher<SwiftfinStore.State.Server, Error> {
return Just(server) return Just(server)
.tryMap { server -> (SwiftfinStore.Models.StoredServer, UnsafeDataTransaction) in .tryMap { server -> (SwiftfinStore.Models.StoredServer, UnsafeDataTransaction) in
@ -129,6 +137,7 @@ final class SessionManager {
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
// MARK: setServerCurrentURI publisher
func setServerCurrentURI(server: SwiftfinStore.State.Server, uri: String) -> AnyPublisher<SwiftfinStore.State.Server, Error> { func setServerCurrentURI(server: SwiftfinStore.State.Server, uri: String) -> AnyPublisher<SwiftfinStore.State.Server, Error> {
return Just(server) return Just(server)
.tryMap { server -> (SwiftfinStore.Models.StoredServer, UnsafeDataTransaction) in .tryMap { server -> (SwiftfinStore.Models.StoredServer, UnsafeDataTransaction) in
@ -158,6 +167,7 @@ final class SessionManager {
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
// MARK: loginUser publisher
// Logs in a user with an associated server, storing if successful // Logs in a user with an associated server, storing if successful
func loginUser(server: SwiftfinStore.State.Server, username: String, password: String) -> AnyPublisher<SwiftfinStore.State.User, Error> { func loginUser(server: SwiftfinStore.State.Server, username: String, password: String) -> AnyPublisher<SwiftfinStore.State.User, Error> {
setAuthHeader(with: "") setAuthHeader(with: "")
@ -174,7 +184,7 @@ final class SessionManager {
guard let username = response.user?.name, guard let username = response.user?.name,
let id = response.user?.id else { throw JellyfinAPIError("Missing user data from network call") } let id = response.user?.id else { throw JellyfinAPIError("Missing user data from network call") }
newUser.username = username newUser.username = username
newUser.id = id newUser.id = id
newUser.appleTVID = "" newUser.appleTVID = ""
@ -217,6 +227,7 @@ final class SessionManager {
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
// MARK: loginUser
func loginUser(server: SwiftfinStore.State.Server, user: SwiftfinStore.State.User) { func loginUser(server: SwiftfinStore.State.Server, user: SwiftfinStore.State.User) {
JellyfinAPI.basePath = server.currentURI JellyfinAPI.basePath = server.currentURI
SwiftfinStore.Defaults.suite[.lastServerUserID] = user.id SwiftfinStore.Defaults.suite[.lastServerUserID] = user.id
@ -225,6 +236,7 @@ final class SessionManager {
SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignIn, object: nil) SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignIn, object: nil)
} }
// MARK: logout
func logout() { func logout() {
currentLogin = nil currentLogin = nil
JellyfinAPI.basePath = "" JellyfinAPI.basePath = ""
@ -233,6 +245,7 @@ final class SessionManager {
SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignOut, object: nil) SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didSignOut, object: nil)
} }
// MARK: purge
func purge() { func purge() {
// Delete all servers // Delete all servers
let servers = fetchServers() let servers = fetchServers()
@ -247,12 +260,14 @@ final class SessionManager {
SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didPurge, object: nil) SwiftfinNotificationCenter.main.post(name: SwiftfinNotificationCenter.Keys.didPurge, object: nil)
} }
// MARK: delete user
func delete(user: SwiftfinStore.State.User) { func delete(user: SwiftfinStore.State.User) {
guard let storedUser = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredUser>(), guard let storedUser = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredUser>(),
[Where<SwiftfinStore.Models.StoredUser>("id == %@", user.id)]) else { fatalError("No stored user for state user?")} [Where<SwiftfinStore.Models.StoredUser>("id == %@", user.id)]) else { fatalError("No stored user for state user?")}
_delete(user: storedUser, transaction: nil) _delete(user: storedUser, transaction: nil)
} }
// MARK: delete server
func delete(server: SwiftfinStore.State.Server) { func delete(server: SwiftfinStore.State.Server) {
guard let storedServer = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredServer>(), guard let storedServer = try? SwiftfinStore.dataStack.fetchOne(From<SwiftfinStore.Models.StoredServer>(),
[Where<SwiftfinStore.Models.StoredServer>("id == %@", server.id)]) else { fatalError("No stored server for state server?")} [Where<SwiftfinStore.Models.StoredServer>("id == %@", server.id)]) else { fatalError("No stored server for state server?")}