diff --git a/Sources/PodiumRequestsClient/Endpoints/Endpoints+Interval.swift b/Sources/PodiumRequestsClient/Endpoints/Endpoints+Interval.swift new file mode 100644 index 0000000..afac6e3 --- /dev/null +++ b/Sources/PodiumRequestsClient/Endpoints/Endpoints+Interval.swift @@ -0,0 +1,26 @@ +// +// Endpoints+Intervale.swift +// PodiumRequestsClient +// +// Created by Raphael Lecoq on 1/5/26. +// + +import Foundation + +extension Endpoints { + enum Interval { + /// Get all interval updates for a specific session. + /// - Parameters: + /// - sessionKey The unique session key to get all the interval updates. + case getAll(sessionKey: Int) + } +} + +extension Endpoints.Interval: PodiumEndpoint { + var path: String { + switch self { + case .getAll(let sessionKey): + "/sessions/\(sessionKey)/intervals" + } + } +} diff --git a/Sources/PodiumRequestsClient/Models/Domains/IntervalDomain.swift b/Sources/PodiumRequestsClient/Models/Domains/IntervalDomain.swift new file mode 100644 index 0000000..dd56dc9 --- /dev/null +++ b/Sources/PodiumRequestsClient/Models/Domains/IntervalDomain.swift @@ -0,0 +1,15 @@ +// +// IntervalDomain.swift +// PodiumRequestsClient +// +// Created by Raphael Lecoq on 1/5/26. +// + +import Foundation + +struct IntervalDomain: Decodable { + let date: Date + let driver: Int + let interval: Float + let leader: Float +} diff --git a/Sources/PodiumRequestsClient/Models/Entities/IntervalModel.swift b/Sources/PodiumRequestsClient/Models/Entities/IntervalModel.swift new file mode 100644 index 0000000..0256132 --- /dev/null +++ b/Sources/PodiumRequestsClient/Models/Entities/IntervalModel.swift @@ -0,0 +1,22 @@ +// +// IntervalModel.swift +// PodiumRequestsClient +// +// Created by Raphael Lecoq on 1/5/26. +// + +import Foundation + +public struct IntervalModel: Equatable { + let date: Date + let driver: Int + let interval: Float + let leader: Float + + public init(date: Date, driver: Int, interval: Float, leader: Float) { + self.date = date + self.driver = driver + self.interval = interval + self.leader = leader + } +} diff --git a/Sources/PodiumRequestsClient/Models/Mappers/IntervalMapper.swift b/Sources/PodiumRequestsClient/Models/Mappers/IntervalMapper.swift new file mode 100644 index 0000000..b784b2c --- /dev/null +++ b/Sources/PodiumRequestsClient/Models/Mappers/IntervalMapper.swift @@ -0,0 +1,23 @@ +// +// IntervalMapper.swift +// PodiumRequestsClient +// +// Created by Raphael Lecoq on 1/5/26. +// + +import Foundation + +enum IntervalMapper { + /// Maps an `IntervalDomain` instance to an `IntervalModel` instance. + /// + /// - Parameter domain: The domain model representing interval data to map from. + /// - Returns: An `IntervalModel` created from the given domain model, with all relevant properties converted accordingly. + static func map(from domain: IntervalDomain) -> IntervalModel { + IntervalModel( + date: domain.date, + driver: domain.driver, + interval: domain.interval, + leader: domain.leader + ) + } +} diff --git a/Sources/PodiumRequestsClient/RequestsClient.swift b/Sources/PodiumRequestsClient/RequestsClient.swift index c5f951a..22943fc 100644 --- a/Sources/PodiumRequestsClient/RequestsClient.swift +++ b/Sources/PodiumRequestsClient/RequestsClient.swift @@ -253,6 +253,19 @@ public final class RequestsClient: Sendable { return domain.map { WeatherMapper.map(from: $0) } } + + public func getAllIntervals( + sessionKey: Int, + chunk: Chunk? = nil + ) async throws -> [IntervalModel] { + let domain = try await request( + endpoint: Endpoints.Interval.getAll(sessionKey: sessionKey), + type: [IntervalDomain].self, + chunk: chunk + ) + + return domain.map { IntervalMapper.map(from: $0) } + } } extension RequestsClient {