diff options
author | Shav Kinderlehrer <[email protected]> | 2023-12-12 17:09:15 -0500 |
---|---|---|
committer | Shav Kinderlehrer <[email protected]> | 2023-12-12 17:09:15 -0500 |
commit | fbb37567460b689f01eb8a8717b9ac8673652c28 (patch) | |
tree | b6517179cb849732efb8660edfa9899456420d3b /Jel/Controllers | |
parent | 02fc87fe2588cdca5188cf1a6d338ce83de65a43 (diff) | |
download | jel-fbb37567460b689f01eb8a8717b9ac8673652c28.tar.gz jel-fbb37567460b689f01eb8a8717b9ac8673652c28.zip |
Implement signIn flow
Diffstat (limited to 'Jel/Controllers')
-rw-r--r-- | Jel/Controllers/AuthStateController.swift | 2 | ||||
-rw-r--r-- | Jel/Controllers/JellyfinClientController.swift | 66 |
2 files changed, 61 insertions, 7 deletions
diff --git a/Jel/Controllers/AuthStateController.swift b/Jel/Controllers/AuthStateController.swift index 1629556..93dbee3 100644 --- a/Jel/Controllers/AuthStateController.swift +++ b/Jel/Controllers/AuthStateController.swift @@ -14,6 +14,8 @@ class AuthStateController: ObservableObject { private let defaults = UserDefaults.standard + static let shared = AuthStateController() + init(loggedIn: Bool = false, serverUrl: URL? = nil, authToken: String? = nil) { self.loggedIn = loggedIn self.serverUrl = serverUrl diff --git a/Jel/Controllers/JellyfinClientController.swift b/Jel/Controllers/JellyfinClientController.swift index 343efe1..b50157e 100644 --- a/Jel/Controllers/JellyfinClientController.swift +++ b/Jel/Controllers/JellyfinClientController.swift @@ -9,22 +9,74 @@ import Foundation import Get import JellyfinKit -class JellyfinClientController { - let api: APIClient +struct AuthHeaders: Codable { + var Client: String + var Device: String + var DeviceId: String + var Version: String + var Token: String +} + +enum JellyfinClientError: Error { + case badResponseCode +} + +extension AuthHeaders { + func format() -> String { + return "MediaBrowser Client=\(self.Client), Device=\(self.Device), DeviceId=\(self.DeviceId), Version=\(self.Version), Token=\(self.Token)" + } +} + +class JellyfinClientController: ObservableObject { + private var api: APIClient + + private var authHeaders: AuthHeaders + private var authState: AuthStateController - init(serverUrl: URL) { - self.api = APIClient( - baseURL: serverUrl - ) + init(authHeaders: AuthHeaders, serverUrl: URL? = nil, authState: AuthStateController = AuthStateController.shared) { + self.authHeaders = authHeaders + self.authState = authState + + self.api = APIClient(baseURL: serverUrl) + self.setUrl(url: serverUrl) + } + + func setToken(token: String) { + self.authHeaders.Token = token + } + + func setUrl(url: URL?) { + if url == nil { + return + } + + self.api = APIClient(baseURL: url, { + $0.sessionConfiguration.httpAdditionalHeaders = ["Authorization": self.authHeaders.format()] + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .iso8601withFractionalSeconds + $0.decoder = decoder + }) } func isJellyfinServer() async -> Bool { let request = Paths.getPublicUsers do { - try await api.send(request) + let res = try await api.send(request) + if res.statusCode != 200 { + throw JellyfinClientError.badResponseCode + } } catch { return false } return true } + + func signIn(username: String, pw: String) async throws { + let request = Paths.authenticateUserByName(AuthenticateUserByName(pw: pw, username: username)) + let res = try await self.api.send(request) + self.authState.loggedIn = true + self.authState.authToken = res.value.accessToken + self.authState.save() + } } |