From b4a0795c41bd543815939b91f5129993fe20c738 Mon Sep 17 00:00:00 2001 From: LosFarmosCTL <80157503+LosFarmosCTL@users.noreply.github.com> Date: Thu, 25 Jan 2024 04:33:45 +0100 Subject: [PATCH] feat: implement startCommercial endpoint --- .../API/Endpoints/Ads/StartCommercial.swift | 21 +++++++++++++------ Sources/Twitch/API/Endpoints/HelixData.swift | 2 +- Sources/Twitch/API/Helix.swift | 10 +++++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Sources/Twitch/API/Endpoints/Ads/StartCommercial.swift b/Sources/Twitch/API/Endpoints/Ads/StartCommercial.swift index a6fbdb8..0552bfc 100644 --- a/Sources/Twitch/API/Endpoints/Ads/StartCommercial.swift +++ b/Sources/Twitch/API/Endpoints/Ads/StartCommercial.swift @@ -6,17 +6,26 @@ import Foundation extension Helix { public func startCommercial(broadcasterId: String, length: Int) async throws - -> Commercial? + -> Commercial { - var queryItems = [URLQueryItem]() - queryItems.append(URLQueryItem(name: "broadcaster_id", value: broadcasterId)) - queryItems.append(URLQueryItem(name: "length", value: String(length))) + return try await self.request( + .post("channels/commercial"), + jsonBody: StartCommercialRequestBody(broadcasterId: broadcasterId, length: length) + ).first! + } +} + +private struct StartCommercialRequestBody: Encodable { + let broadcasterId: String + let length: Int - return try await self.request(.get("channels"), with: queryItems).first + enum CodingKeys: String, CodingKey { + case broadcasterId = "broadcaster_id" + case length } } -public struct Commercial: Codable { +public struct Commercial: Decodable { let length: Int let message: String let retryAfter: Int diff --git a/Sources/Twitch/API/Endpoints/HelixData.swift b/Sources/Twitch/API/Endpoints/HelixData.swift index 10e493e..ff982cf 100644 --- a/Sources/Twitch/API/Endpoints/HelixData.swift +++ b/Sources/Twitch/API/Endpoints/HelixData.swift @@ -1 +1 @@ -internal struct HelixData: Codable where T: Codable { let data: [T] } +internal struct HelixData: Decodable where T: Decodable { let data: [T] } diff --git a/Sources/Twitch/API/Helix.swift b/Sources/Twitch/API/Helix.swift index b8676f3..c8c8aef 100644 --- a/Sources/Twitch/API/Helix.swift +++ b/Sources/Twitch/API/Helix.swift @@ -17,8 +17,9 @@ public final class Helix { self.session = urlSession ?? URLSession(configuration: .default) } - internal func request( - _ request: HelixRequest, with queryItems: [URLQueryItem]? = nil + internal func request( + _ request: HelixRequest, with queryItems: [URLQueryItem]? = nil, + jsonBody: Encodable? = nil ) async throws -> [T] { let (method, endpoint) = request.unwrap() @@ -36,6 +37,11 @@ public final class Helix { urlRequest.httpMethod = method urlRequest.allHTTPHeaderFields = try? authentication.httpHeaders() + if let jsonBody { + urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") + urlRequest.httpBody = try JSONEncoder().encode(jsonBody) + } + let data = try await self.send(urlRequest) let result = try? JSONDecoder().decode(HelixData.self, from: data).data