Improved the GetUserUseCase use case by moving some logic to this use case.

This commit is contained in:
Javier Cicchelli 2022-12-18 16:12:09 +01:00
parent 76814cfe8b
commit c25ca4cf0f

View File

@ -10,22 +10,76 @@ import APIService
import DataModels import DataModels
import DependencyInjection import DependencyInjection
import Dependencies import Dependencies
import KeychainStorage
public struct GetUserUseCase { public actor GetUserUseCase {
// MARK: Dependencies // MARK: Properties
@Dependency(\.apiService) private var apiService private let apiService: APIService
private var account: Account?
// MARK: Initialisers // MARK: Initialisers
public init() {} public init(
apiService: APIService,
account: Account?
) {
self.apiService = apiService
self.account = account
}
// MARK: Functions // MARK: Functions
public func callAsFunction() async throws -> User {
guard let account else { throw GetUserError .accountNotFound }
return try await getUser(
username: account.username,
password: account.password
)
}
public func callAsFunction( public func callAsFunction(
username: String, username: String,
password: String password: String
) async throws -> User {
let user = try await getUser(
username: username,
password: password
)
account = .init(
username: username,
password: password
)
return user
}
}
// MARK: - Initialisers
public extension GetUserUseCase {
init() {
@Dependency(\.apiService) var apiService
@KeychainStorage(key: .KeychainStorage.account) var account: Account?
self.init(
apiService: apiService,
account: account
)
}
}
// MARK: - Helpers
private extension GetUserUseCase {
func getUser(
username: String,
password: String
) async throws -> User { ) async throws -> User {
let me = try await apiService.getUser( let me = try await apiService.getUser(
credentials: .init( credentials: .init(
@ -46,5 +100,10 @@ public struct GetUserUseCase {
) )
) )
} }
}
// MARK: - Errors
public enum GetUserError: Error {
case accountNotFound
} }