diff --git a/EmployeeDirectory/Protocols/EmployeeServiceProtocol.swift b/EmployeeDirectory/Protocols/EmployeeServiceProtocol.swift index 809baf2..3737c61 100644 --- a/EmployeeDirectory/Protocols/EmployeeServiceProtocol.swift +++ b/EmployeeDirectory/Protocols/EmployeeServiceProtocol.swift @@ -10,7 +10,6 @@ public protocol EmployeeServiceProtocol { /// This will get a list of all employees - /// - Parameter serviceMode: Mode in which to hit. /// - Returns: An Employees struct - func getEmployees(_ serviceMode: EmployeeServiceMode) async throws -> Employees + func getEmployees() async throws -> Employees } diff --git a/EmployeeDirectory/Services/EmployeeService.swift b/EmployeeDirectory/Services/EmployeeService.swift index 3104502..27b9780 100644 --- a/EmployeeDirectory/Services/EmployeeService.swift +++ b/EmployeeDirectory/Services/EmployeeService.swift @@ -7,11 +7,22 @@ import Foundation /// These are the testing URL Endpoints for different states -public enum EmployeeServiceMode: String, CaseIterable { +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 { @@ -39,7 +50,45 @@ public class EmployeeService: EmployeeServiceProtocol { /// This will get a list of all employees /// - Parameter serviceMode: Mode in which to hit. /// - Returns: An Employees struct - public func getEmployees(_ serviceMode: EmployeeServiceMode = .production) async throws -> Employees { - return try await NetworkService.shared.fetchData(from: serviceMode.endpoint, as: Employees.self) + public func getEmployees() async throws -> Employees { + return try await NetworkService.shared.fetchData(from: EmployeeServiceMode.production.endpoint, as: Employees.self) + } +} + +/// 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) } } diff --git a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift index 76d130e..c1d1914 100644 --- a/EmployeeDirectory/ViewControllers/EmployeesViewController.swift +++ b/EmployeeDirectory/ViewControllers/EmployeesViewController.swift @@ -158,6 +158,6 @@ extension EmployeesViewController { case 2: selectedMode = .empty default: return } - viewModel.changeMode(to: selectedMode) + viewModel.changeService(to: selectedMode.service) } } diff --git a/EmployeeDirectory/ViewModels/EmployeesViewModel.swift b/EmployeeDirectory/ViewModels/EmployeesViewModel.swift index 796b422..ab34896 100644 --- a/EmployeeDirectory/ViewModels/EmployeesViewModel.swift +++ b/EmployeeDirectory/ViewModels/EmployeesViewModel.swift @@ -11,7 +11,7 @@ import Foundation /// specifically with the EmployeesViewController. @MainActor public class EmployeesViewModel: ObservableObject { - private var serviceMode: EmployeeServiceMode = .production + private var employeeService: EmployeeServiceProtocol = EmployeeService() @Published public private(set) var employees: [Employee] = [] @Published public private(set) var errorMessage: String? = nil @@ -27,7 +27,7 @@ public class EmployeesViewModel: ObservableObject { Task { do { // Fetch employees using the async method - let wrapper = try await EmployeeService.shared.getEmployees(serviceMode) + let wrapper = try await employeeService.getEmployees() // Update published properties employees = wrapper.employees @@ -43,8 +43,8 @@ public class EmployeesViewModel: ObservableObject { } - public func changeMode(to mode: EmployeeServiceMode) { - serviceMode = mode + public func changeService(to employeeService: EmployeeServiceProtocol) { + self.employeeService = employeeService fetchEmployees() } }