123 lines
3.7 KiB
Swift
123 lines
3.7 KiB
Swift
//
|
|
// EmployeeService.swift
|
|
// EmployeeDirectory
|
|
//
|
|
// Created by Matt Bruce on 1/20/25.
|
|
//
|
|
import Foundation
|
|
|
|
/// These are the testing URL Endpoints for different states
|
|
internal enum EmployeeServiceMode: String, CaseIterable {
|
|
case production
|
|
case malformed
|
|
case empty
|
|
|
|
public var service: EmployeeServiceProtocol {
|
|
switch self {
|
|
case .production:
|
|
return EmployeeService.shared
|
|
case .malformed:
|
|
return EmployeeMalformedService.shared
|
|
case .empty:
|
|
return EmployeeEmptyService.shared
|
|
}
|
|
}
|
|
|
|
/// Enpoint in which to grabe employees from.
|
|
public var endpoint: String {
|
|
switch self {
|
|
case .production:
|
|
return "https://s3.amazonaws.com/sq-mobile-interview/employees.json"
|
|
case .malformed:
|
|
return "https://s3.amazonaws.com/sq-mobile-interview/employees_malformed.json"
|
|
case .empty:
|
|
return "https://s3.amazonaws.com/sq-mobile-interview/employees_empty.json"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// Service Layer for Employees
|
|
public class EmployeeService: EmployeeServiceProtocol {
|
|
public enum EmployeeServiceError: Error {
|
|
case error
|
|
//case LoadError
|
|
//case other(Error)
|
|
}
|
|
// MARK: - Properties
|
|
public static let shared = EmployeeService() // Default shared instance
|
|
|
|
// MARK: - Initializer
|
|
|
|
public init() {}
|
|
|
|
// MARK: - Public Methods
|
|
|
|
/// This will get a list of all employees
|
|
/// - Parameter serviceMode: Mode in which to hit.
|
|
/// - Returns: An Employees struct
|
|
public func getEmployees() async throws -> Employees {
|
|
var employees: Employees
|
|
let cache = EmployeeCacheService.shared
|
|
do {
|
|
employees = try cache.load()
|
|
return employees
|
|
} catch {
|
|
if let networkFound = try? await fetchNetworkEmployees() {
|
|
employees = networkFound
|
|
return employees
|
|
}
|
|
}
|
|
throw EmployeeServiceError.error
|
|
}
|
|
|
|
public func fetchNetworkEmployees() async throws -> Employees {
|
|
var employees: Employees
|
|
if let networkFound = try? await NetworkService.shared.fetchData(from: EmployeeServiceMode.production.endpoint, as: Employees.self) {
|
|
employees = networkFound
|
|
try? EmployeeCacheService.shared.save(from: employees)
|
|
return employees
|
|
} else {
|
|
throw EmployeeServiceError.error
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Service Layer for Employees
|
|
public class EmployeeMalformedService: EmployeeServiceProtocol {
|
|
// MARK: - Properties
|
|
public static let shared = EmployeeMalformedService() // Default shared instance
|
|
|
|
// MARK: - Initializer
|
|
|
|
public init() {}
|
|
|
|
// MARK: - Public Methods
|
|
|
|
/// This will get a list of all employees
|
|
/// - Parameter serviceMode: Mode in which to hit.
|
|
/// - Returns: An Employees struct
|
|
public func getEmployees() async throws -> Employees {
|
|
return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.malformed.endpoint, as: Employees.self)
|
|
}
|
|
}
|
|
|
|
/// Service Layer for Employees
|
|
public class EmployeeEmptyService: EmployeeServiceProtocol {
|
|
// MARK: - Properties
|
|
public static let shared = EmployeeEmptyService() // Default shared instance
|
|
|
|
// MARK: - Initializer
|
|
|
|
public init() {}
|
|
|
|
// MARK: - Public Methods
|
|
|
|
/// This will get a list of all employees
|
|
/// - Parameter serviceMode: Mode in which to hit.
|
|
/// - Returns: An Employees struct
|
|
public func getEmployees() async throws -> Employees {
|
|
return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.empty.endpoint, as: Employees.self)
|
|
}
|
|
}
|