Skip to content

Commit

Permalink
feat: add blocked terms endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
LosFarmosCTL committed Jan 30, 2024
1 parent e39e981 commit 04a0577
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 0 deletions.
23 changes: 23 additions & 0 deletions Sources/Twitch/API/Endpoints/Moderation/Helix+addBlockedTerm.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import Foundation

#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

extension Helix {
public func addBlockedTerm(inChannel broadcasterID: String, text: String) async throws
-> BlockedTerm
{
let queryItems = self.makeQueryItems(
("broadcaster_id", broadcasterID), ("moderator_id", self.authenticatedUserId))

let (rawResponse, result): (_, HelixData<BlockedTerm>?) = try await self.request(
.post("moderation/blocked_terms"), with: queryItems, jsonBody: ["text": text])

guard let term = result?.data.first else {
throw HelixError.invalidResponse(rawResponse: rawResponse)
}

return term
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import Foundation

#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

extension Helix {
public func getBlockedTerms(
inChannel broadcasterID: String, limit: Int? = nil, after cursor: String? = nil
) async throws -> (terms: [BlockedTerm], cursor: String?) {
let queryItems = self.makeQueryItems(
("broadcaster_id", broadcasterID), ("moderator_id", self.authenticatedUserId),
("first", limit.map(String.init)), ("after", cursor))

let (rawResponse, result): (_, HelixData<BlockedTerm>?) = try await self.request(
.get("moderation/blocked_terms"), with: queryItems)

guard let result else { throw HelixError.invalidResponse(rawResponse: rawResponse) }

return (result.data, result.pagination?.cursor)
}
}

public struct BlockedTerm: Decodable {
let broadcasterID: String
let moderatorID: String

let id: String
let text: String

let createdAt: Date
let updatedAt: Date

let expiresAt: Date?

enum CodingKeys: String, CodingKey {
case broadcasterID = "broadcaster_id"
case moderatorID = "moderator_id"

case id, text

case createdAt = "created_at"
case updatedAt = "updated_at"

case expiresAt = "expires_at"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import Foundation

#if canImport(FoundationNetworking)
import FoundationNetworking
#endif

extension Helix {
public func removeBlockedTerm(inChannel broadcasterID: String, termId: String)
async throws
{
let queryItems = self.makeQueryItems(
("broadcaster_id", broadcasterID), ("moderator_id", self.authenticatedUserId),
("id", termId))

(_, _) =
try await self.request(.delete("moderation/blocked_terms"), with: queryItems)
as (_, HelixData<BlockedTerm>?)
}
}
58 changes: 58 additions & 0 deletions Tests/TwitchTests/API/Endpoints/ModerationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -172,4 +172,62 @@ final class ModerationTests: XCTestCase {

await fulfillment(of: [completionExpectation], timeout: 2.0)
}

func testGetBlockedTerms() async throws {
let url = URL(
string:
"https://api.twitch.tv/helix/moderation/blocked_terms?broadcaster_id=5678&moderator_id=1234"
)!

Mock(
url: url, contentType: .json, statusCode: 200,
data: [.get: MockedData.getBlockedTermsJSON]
).register()

let (terms, cursor) = try await helix.getBlockedTerms(inChannel: "5678")

XCTAssertEqual(cursor, "eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6I")

XCTAssertEqual(terms.count, 1)
XCTAssertEqual(terms.first?.text, "A phrase I'm not fond of")
XCTAssertNil(terms.first?.expiresAt)
}

func testAddBlockedTerm() async throws {
let url = URL(
string:
"https://api.twitch.tv/helix/moderation/blocked_terms?broadcaster_id=5678&moderator_id=1234"
)!

Mock(
url: url, contentType: .json, statusCode: 200,
data: [.post: MockedData.getBlockedTermsJSON]
).register()

let term = try await helix.addBlockedTerm(
inChannel: "5678", text: "A phrase I'm not fond of")

XCTAssertEqual(term.broadcasterID, "5678")
XCTAssertEqual(term.moderatorID, "1234")
XCTAssertEqual(term.text, "A phrase I'm not fond of")
XCTAssertNil(term.expiresAt)
}

func testRemoveBlockedTerm() async throws {
let url = URL(
string:
"https://api.twitch.tv/helix/moderation/blocked_terms?broadcaster_id=5678&moderator_id=1234&id=9876"
)!

var request = URLRequest(url: url)
request.httpMethod = "DELETE"

var mock = Mock(request: request, statusCode: 204)
let completionExpectation = expectationForCompletingMock(&mock)
mock.register()

try await helix.removeBlockedTerm(inChannel: "5678", termId: "9876")

await fulfillment(of: [completionExpectation], timeout: 2.0)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"data": [
{
"broadcaster_id": "5678",
"moderator_id": "1234",
"id": "520e4d4e-0cda-49c7-821e-e5ef4f88c2f2",
"text": "A phrase I'm not fond of",
"created_at": "2021-09-29T19:45:37Z",
"updated_at": "2021-09-29T19:45:37Z",
"expires_at": null
}
],
"pagination": {
"cursor": "eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6I"
}
}
2 changes: 2 additions & 0 deletions Tests/TwitchTests/API/MockedData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ public final class MockedData {
forResource: "getBannedUsers", withExtension: "json")!.data
public static let banUserJSON: Data = Bundle.module.url(
forResource: "banUser", withExtension: "json")!.data
public static let getBlockedTermsJSON: Data = Bundle.module.url(
forResource: "getBlockedTerms", withExtension: "json")!.data

public static let searchCategoriesJSON: Data = Bundle.module.url(
forResource: "searchCategories", withExtension: "json")!.data
Expand Down

0 comments on commit 04a0577

Please sign in to comment.