79 lines
3.2 KiB
Swift
79 lines
3.2 KiB
Swift
//
|
|
// MockEmployeeService.swift
|
|
// EmployeeDirectory
|
|
//
|
|
// Created by Matt Bruce on 1/21/25.
|
|
//
|
|
import Foundation
|
|
|
|
public class MockEmployeeService: EmployeeServiceProtocol {
|
|
// MARK: - Properties
|
|
public static let shared = MockEmployeeService() // Default shared instance
|
|
private var employees: Employees
|
|
private var sortField: EmployeeSortField = .fullName
|
|
private var sortOrder: EmployeeSortOrder = .ascending
|
|
|
|
// MARK: - Initializer
|
|
|
|
public init() {
|
|
let jsonFileName = "localTest"
|
|
guard let url = Bundle.main.url(forResource: jsonFileName, withExtension: "json"),
|
|
let data = try? Data(contentsOf: url),
|
|
let localData = try? JSONDecoder().decode(Employees.self, from: data) else {
|
|
employees = .init(employees: [], total: 0, page: 0, perPage: 0)
|
|
return
|
|
}
|
|
employees = localData
|
|
}
|
|
|
|
public func getEmployees(_ serviceMode: EmployeeServiceMode) async throws -> Employees {
|
|
return employees
|
|
}
|
|
|
|
public func getEmployees(_ serviceMode: EmployeeServiceMode = .production,
|
|
page: Int, perPage: Int,
|
|
sortField: EmployeeSortField = .fullName,
|
|
sortOrder: EmployeeSortOrder = .ascending) async throws -> Employees {
|
|
|
|
if sortField != self.sortField || sortOrder != self.sortOrder {
|
|
employees = .init(employees: employees.employees.sorted(by: sortField, with: sortOrder),
|
|
total: employees.employees.count,
|
|
page: page,
|
|
perPage: perPage)
|
|
self.sortField = sortField
|
|
self.sortOrder = sortOrder
|
|
}
|
|
|
|
let totalUsers = employees.employees.count
|
|
let startIndex = (page - 1) * perPage
|
|
let endIndex = min(startIndex + perPage, totalUsers)
|
|
|
|
guard startIndex < totalUsers else {
|
|
return .init(employees: [], total: totalUsers, page: page, perPage: perPage) // Return empty if out of bounds
|
|
}
|
|
let paginatedUsers = Array(employees.employees[startIndex..<endIndex])
|
|
return .init(employees: paginatedUsers, total: totalUsers, page: page, perPage: perPage)
|
|
}
|
|
}
|
|
|
|
extension Array where Element == Employee {
|
|
func sorted(by field: EmployeeSortField, with option: EmployeeSortOrder) -> [Employee] {
|
|
switch field {
|
|
case .fullName:
|
|
return option == .ascending
|
|
? sorted { $0.fullName < $1.fullName }
|
|
: sorted { $0.fullName > $1.fullName }
|
|
|
|
case .team:
|
|
return option == .ascending
|
|
? sorted { $0.team < $1.team || ($0.team == $1.team && $0.fullName < $1.fullName) }
|
|
: sorted { $0.team > $1.team || ($0.team == $1.team && $0.fullName < $1.fullName) }
|
|
|
|
case .employeeType:
|
|
return option == .ascending
|
|
? sorted { $0.employeeType.rawValue < $1.employeeType.rawValue || ($0.employeeType.rawValue == $1.employeeType.rawValue && $0.fullName < $1.fullName) }
|
|
: sorted { $0.employeeType.rawValue > $1.employeeType.rawValue || ($0.employeeType.rawValue == $1.employeeType.rawValue && $0.fullName < $1.fullName) }
|
|
}
|
|
}
|
|
}
|