diff --git a/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTimelinesReverseChronologicalRequestV2.swift b/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTimelinesReverseChronologicalRequestV2.swift new file mode 100644 index 00000000..405abab9 --- /dev/null +++ b/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTimelinesReverseChronologicalRequestV2.swift @@ -0,0 +1,78 @@ +import Foundation + +/// https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological +open class GetUsersTimelinesReverseChronologicalRequestV2: TwitterAPIRequest { + + public let id: String + public let endTime: Date? + public let exclude: Set? + public let expansions: Set? + public let maxResults: Int? + public let mediaFields: Set? + public let paginationToken: String? + public let placeFields: Set? + public let pollFields: Set? + public let sinceID: String? + public let startTime: Date? + public let tweetFields: Set? + public let untilID: String? + public let userFields: Set? + + public var method: HTTPMethod { + return .get + } + + public var path: String { + return "/2/users/\(id)/timelines/reverse_chronological" + } + + open var parameters: [String: Any] { + var p = [String: Any]() + endTime?.bind(param: &p, for: "end_time") + exclude?.bind(param: &p) + expansions?.bind(param: &p) + maxResults.map { p["max_results"] = $0 } + mediaFields?.bind(param: &p) + paginationToken.map { p["pagination_token"] = $0 } + placeFields?.bind(param: &p) + pollFields?.bind(param: &p) + sinceID.map { p["since_id"] = $0 } + startTime?.bind(param: &p, for: "start_time") + tweetFields?.bind(param: &p) + untilID.map { p["until_id"] = $0 } + userFields?.bind(param: &p) + return p + } + + public init( + id: String, + endTime: Date? = .none, + exclude: Set? = .none, + expansions: Set? = .none, + maxResults: Int? = .none, + mediaFields: Set? = .none, + paginationToken: String? = .none, + placeFields: Set? = .none, + pollFields: Set? = .none, + sinceID: String? = .none, + startTime: Date? = .none, + tweetFields: Set? = .none, + untilID: String? = .none, + userFields: Set? = .none + ) { + self.id = id + self.endTime = endTime + self.exclude = exclude + self.expansions = expansions + self.maxResults = maxResults + self.mediaFields = mediaFields + self.paginationToken = paginationToken + self.placeFields = placeFields + self.pollFields = pollFields + self.sinceID = sinceID + self.startTime = startTime + self.tweetFields = tweetFields + self.untilID = untilID + self.userFields = userFields + } +} diff --git a/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTweetsRequestV2.swift b/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTweetsRequestV2.swift index 6e9ce37d..62b49d71 100644 --- a/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTweetsRequestV2.swift +++ b/Sources/TwitterAPIKit/APIv2/Timeline/Requests/GetUsersTweetsRequestV2.swift @@ -3,17 +3,9 @@ import Foundation /// https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets open class GetUsersTweetsRequestV2: TwitterAPIRequest { - public enum Exclude: String { - case retweets - case replies - func bind(param: inout [String: Any]) { - param["exclude"] = rawValue - } - } - public let id: String public let endTime: Date? - public let exclude: Exclude? + public let exclude: Set? public let expansions: Set? public let maxResults: Int? public let mediaFields: Set? @@ -55,7 +47,7 @@ open class GetUsersTweetsRequestV2: TwitterAPIRequest { public init( id: String, endTime: Date? = .none, - exclude: Exclude? = .none, + exclude: Set? = .none, expansions: Set? = .none, maxResults: Int? = .none, mediaFields: Set? = .none, diff --git a/Sources/TwitterAPIKit/APIv2/Timeline/TimelineAPIv2.swift b/Sources/TwitterAPIKit/APIv2/Timeline/TimelineAPIv2.swift index fd50aaee..0689c75f 100644 --- a/Sources/TwitterAPIKit/APIv2/Timeline/TimelineAPIv2.swift +++ b/Sources/TwitterAPIKit/APIv2/Timeline/TimelineAPIv2.swift @@ -11,6 +11,12 @@ public protocol TimelineAPIv2 { func getUserMensions( _ request: GetUsersMentionsRequestV2 ) -> TwitterAPISessionJSONTask + + /// a.k.a Home Timeline + /// https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-reverse-chronological + func getUserReverseChronological( + _ request: GetUsersTimelinesReverseChronologicalRequestV2 + ) -> TwitterAPISessionJSONTask } extension TwitterAPIKit.TwitterAPIImplV2: TimelineAPIv2 { @@ -26,4 +32,10 @@ extension TwitterAPIKit.TwitterAPIImplV2: TimelineAPIv2 { ) -> TwitterAPISessionJSONTask { return session.send(request) } + + func getUserReverseChronological( + _ request: GetUsersTimelinesReverseChronologicalRequestV2 + ) -> TwitterAPISessionJSONTask { + return session.send(request) + } } diff --git a/Sources/TwitterAPIKit/APIv2/Timeline/TwitterTimelineExcludeV2.swift b/Sources/TwitterAPIKit/APIv2/Timeline/TwitterTimelineExcludeV2.swift new file mode 100644 index 00000000..53866e1a --- /dev/null +++ b/Sources/TwitterAPIKit/APIv2/Timeline/TwitterTimelineExcludeV2.swift @@ -0,0 +1,16 @@ +import Foundation + +public enum TwitterTimelineExcludeV2: String, TwitterAPIv2RequestParameter { + case retweets + case replies + + public var stringValue: String { + return rawValue + } +} + +extension Set where Element == TwitterTimelineExcludeV2 { + func bind(param: inout [String: Any]) { + param["exclude"] = commaSeparatedString + } +} diff --git a/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTimelinesReverseChronologicalRequestV2Tests.swift b/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTimelinesReverseChronologicalRequestV2Tests.swift new file mode 100644 index 00000000..4248b32f --- /dev/null +++ b/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTimelinesReverseChronologicalRequestV2Tests.swift @@ -0,0 +1,63 @@ +import TwitterAPIKit +import XCTest + +class GetUsersTimelinesReverseChronologicalRequestV2Tests: XCTestCase { + override func setUpWithError() throws { + } + + override func tearDownWithError() throws { + } + + func test() throws { + let req = GetUsersTimelinesReverseChronologicalRequestV2( + id: "_i_", + endTime: Date(timeIntervalSince1970: 50), + exclude: [.retweets], + expansions: [.authorID], + maxResults: 10, + mediaFields: [.altText], + paginationToken: "_p_", + placeFields: [.country], + pollFields: [.options], + sinceID: "_s_", + startTime: Date(timeIntervalSince1970: 10), + tweetFields: [.geo], + untilID: "_u_", + userFields: [.location] + ) + + XCTAssertEqual(req.method, .get) + XCTAssertEqual(req.baseURLType, .api) + XCTAssertEqual(req.path, "/2/users/_i_/timelines/reverse_chronological") + XCTAssertEqual(req.bodyContentType, .wwwFormUrlEncoded) + AssertEqualAnyDict( + req.parameters, + [ + "end_time": "1970-01-01T00:00:50Z", + "exclude": "retweets", + "expansions": "author_id", + "max_results": 10, + "media.fields": "alt_text", + "pagination_token": "_p_", + "place.fields": "country", + "poll.fields": "options", + "since_id": "_s_", + "start_time": "1970-01-01T00:00:10Z", + "tweet.fields": "geo", + "until_id": "_u_", + "user.fields": "location", + ] + ) + } + + func testDefaultArg() throws { + let req = GetUsersTimelinesReverseChronologicalRequestV2( + id: "_i_" + ) + + AssertEqualAnyDict( + req.parameters, + [:] + ) + } +} diff --git a/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTweetsRequestV2Tests.swift b/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTweetsRequestV2Tests.swift index 5e6ffb42..7b544fd6 100644 --- a/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTweetsRequestV2Tests.swift +++ b/Tests/TwitterAPIKitTests/APIv2/Timeline/GetUsersTweetsRequestV2Tests.swift @@ -12,7 +12,7 @@ class GetUsersTweetsRequestV2Tests: XCTestCase { let req = GetUsersTweetsRequestV2( id: "_i_", endTime: Date(timeIntervalSince1970: 10), - exclude: .replies, + exclude: [.replies, .retweets], expansions: [.authorID], maxResults: 100, mediaFields: [.publicMetrics], @@ -34,7 +34,7 @@ class GetUsersTweetsRequestV2Tests: XCTestCase { req.parameters, [ "end_time": "1970-01-01T00:00:10Z", - "exclude": "replies", + "exclude": "replies,retweets", "expansions": "author_id", "max_results": 100, "media.fields": "public_metrics",