Skip to content

Commit 5f75fa3

Browse files
committed
Add /wpcom/v2/sites/:siteid/subscribers
1 parent 94cbe7e commit 5f75fa3

File tree

5 files changed

+122
-5
lines changed

5 files changed

+122
-5
lines changed

Package.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ let package = Package(
1111
targets: [
1212
.binaryTarget(
1313
name: "WordPressKit",
14-
url: "https://github.com/user-attachments/files/19732825/WordPressKit.zip",
15-
checksum: "0ecd8b19cd00a4ef363ab6e826f92166c1efa4693db8f3218533510a3f951dbb"
14+
url: "https://github.com/user-attachments/files/19949670/WordPressKit.zip",
15+
checksum: "69e4a2bec7a641336c4121c1ba23357b6222bf9db8353fe162328852780558ef"
1616
),
1717
]
1818
)

Sources/CoreAPI/WordPressComRestApi.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ open class WordPressComRestApi: NSObject {
376376
open func perform(
377377
_ method: HTTPRequestBuilder.Method,
378378
URLString: String,
379-
parameters: [String: AnyObject]? = nil,
379+
parameters: [String: Any]? = nil,
380380
fulfilling progress: Progress? = nil
381381
) async -> APIResult<AnyObject> {
382382
await perform(method, URLString: URLString, parameters: parameters, fulfilling: progress) {
@@ -387,7 +387,7 @@ open class WordPressComRestApi: NSObject {
387387
open func perform<T: Decodable>(
388388
_ method: HTTPRequestBuilder.Method,
389389
URLString: String,
390-
parameters: [String: AnyObject]? = nil,
390+
parameters: [String: Any]? = nil,
391391
fulfilling progress: Progress? = nil,
392392
jsonDecoder: JSONDecoder? = nil,
393393
type: T.Type = T.self
@@ -401,7 +401,7 @@ open class WordPressComRestApi: NSObject {
401401
private func perform<T>(
402402
_ method: HTTPRequestBuilder.Method,
403403
URLString: String,
404-
parameters: [String: AnyObject]?,
404+
parameters: [String: Any]?,
405405
fulfilling progress: Progress?,
406406
decoder: @escaping (Data) throws -> T
407407
) async -> APIResult<T> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Foundation
2+
3+
public struct RemoteSubscriber: Decodable {
4+
public let userID: Int
5+
public let subscriptionID: Int
6+
public let emailAddress: String?
7+
public let dateSubscribed: Date
8+
public let isEmailSubscriber: Bool
9+
public let subscriptionStatus: String?
10+
public let displayName: String?
11+
public let avatar: String?
12+
13+
private enum CodingKeys: String, CodingKey {
14+
case userID = "user_id"
15+
case subscriptionID = "subscription_id"
16+
case emailAddress = "email_address"
17+
case dateSubscribed = "date_subscribed"
18+
case isEmailSubscriber = "is_email_subscriber"
19+
case subscriptionStatus = "subscription_status"
20+
case displayName = "display_name"
21+
case avatar
22+
}
23+
}

Sources/WordPressKit/Services/PeopleServiceRemote.swift

+90
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,96 @@ public class PeopleServiceRemote: ServiceRemoteWordPressComREST {
173173
})
174174
}
175175

176+
public struct SubscribersParameters {
177+
public var sortField: SortField?
178+
public var sortOrder: SortOrder?
179+
public var filters: [Filter]
180+
181+
public enum SortField: String {
182+
case dateSubscribed = "date_subscribed"
183+
case email = "email"
184+
case name = "name"
185+
case plan = "plan"
186+
case subscriptionStatus = "subscription_status"
187+
}
188+
189+
public enum SortOrder: String {
190+
case ascending = "asc"
191+
case descending = "dsc"
192+
}
193+
194+
public protocol Filter: CustomStringConvertible {}
195+
196+
public enum FilterSubscriptionType: String, Filter {
197+
case email = "email_subscriber"
198+
case reader = "reader_subscriber"
199+
case unconfirmed = "unconfirmed_subscriber"
200+
case blocked = "blocked_subscriber"
201+
202+
public var description: String { rawValue }
203+
}
204+
205+
public enum FilterPaymentType: String, Filter {
206+
case free
207+
case paid
208+
209+
public var description: String { rawValue }
210+
}
211+
212+
public init(sortField: SortField? = nil, sortOrder: SortOrder? = nil, filters: [Filter] = []) {
213+
self.sortField = sortField
214+
self.sortOrder = sortOrder
215+
self.filters = filters
216+
}
217+
}
218+
219+
public struct SubscribersResponse: Decodable {
220+
public var total: Int
221+
public var pages: Int
222+
public var page: Int
223+
public var perPage: Int
224+
public var subscribers: [RemoteSubscriber]
225+
226+
private enum CodingKeys: String, CodingKey {
227+
case total = "total"
228+
case pages = "pages"
229+
case page = "page"
230+
case perPage = "per_page"
231+
case subscribers = "subscribers"
232+
}
233+
}
234+
235+
public func getSubscribers(
236+
siteID: Int,
237+
page: Int? = nil,
238+
perPage: Int? = 25,
239+
parameters: SubscribersParameters = .init(),
240+
) async throws -> SubscribersResponse {
241+
let url = self.path(forEndpoint: "sites/\(siteID)/subscribers", withVersion: ._2_0)
242+
var query: [String: Any] = [:]
243+
if let page {
244+
query["page"] = page
245+
}
246+
if let perPage {
247+
query["per_page"] = perPage
248+
}
249+
if let sortField = parameters.sortField {
250+
query["sort"] = sortField.rawValue
251+
}
252+
if let sortOrder = parameters.sortOrder {
253+
query["sort_order"] = sortOrder.rawValue
254+
}
255+
if !parameters.filters.isEmpty {
256+
query["filters"] = parameters.filters.map { $0.description }
257+
}
258+
return try await wordPressComRestApi.perform(
259+
.get,
260+
URLString: url,
261+
jsonDecoder: JSONDecoder.apiDecoder,
262+
type: SubscribersResponse.self
263+
).get().body
264+
}
265+
176266
/// Updates a specified User's Role
177267
///
178268
/// - Parameters:

WordPressKit.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
0CCD4C5C2C41700B00B53F9A /* UIDevice+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCD4C5B2C41700B00B53F9A /* UIDevice+Extensions.swift */; };
5151
0CCD4C5F2C41711800B53F9A /* NSObject-SafeExpectations in Frameworks */ = {isa = PBXBuildFile; productRef = 0CCD4C5E2C41711800B53F9A /* NSObject-SafeExpectations */; };
5252
0CCD4C622C41712800B53F9A /* wpxmlrpc in Frameworks */ = {isa = PBXBuildFile; productRef = 0CCD4C612C41712800B53F9A /* wpxmlrpc */; };
53+
0CE4E8252DC027AC00056DD9 /* RemoteSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CE4E8242DC027AC00056DD9 /* RemoteSubscriber.swift */; };
5354
0CED1FE82B617CF300E6DD52 /* AtomicSiteServiceRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CED1FE72B617CF300E6DD52 /* AtomicSiteServiceRemote.swift */; };
5455
0CED1FEB2B617D7D00E6DD52 /* AtomicLogs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CED1FEA2B617D7D00E6DD52 /* AtomicLogs.swift */; };
5556
1769DEAA24729AFF00F42EFC /* HomepageSettingsServiceRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769DEA924729AFF00F42EFC /* HomepageSettingsServiceRemote.swift */; };
@@ -824,6 +825,7 @@
824825
0CB1905F2A2A6943004D3E80 /* blaze-campaigns-search.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "blaze-campaigns-search.json"; sourceTree = "<group>"; };
825826
0CB190642A2A7569004D3E80 /* BlazeCampaignsSearchResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlazeCampaignsSearchResponse.swift; sourceTree = "<group>"; };
826827
0CCD4C5B2C41700B00B53F9A /* UIDevice+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Extensions.swift"; sourceTree = "<group>"; };
828+
0CE4E8242DC027AC00056DD9 /* RemoteSubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteSubscriber.swift; sourceTree = "<group>"; };
827829
0CED1FE72B617CF300E6DD52 /* AtomicSiteServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtomicSiteServiceRemote.swift; sourceTree = "<group>"; };
828830
0CED1FEA2B617D7D00E6DD52 /* AtomicLogs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AtomicLogs.swift; sourceTree = "<group>"; };
829831
1769DEA924729AFF00F42EFC /* HomepageSettingsServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomepageSettingsServiceRemote.swift; sourceTree = "<group>"; };
@@ -1866,6 +1868,7 @@
18661868
4A68E3DC294070A7004AC3DC /* RemoteReaderSite.swift */,
18671869
4A68E3E0294076C1004AC3DC /* RemoteReaderSiteInfo.swift */,
18681870
9F3E0B9A208732B2009CB5BA /* RemoteReaderSiteInfoSubscription.swift */,
1871+
0CE4E8242DC027AC00056DD9 /* RemoteSubscriber.swift */,
18691872
4A68E3DE29407100004AC3DC /* RemoteReaderTopic.swift */,
18701873
74E2295D1F1E777B0085F7F2 /* RemoteSharingButton.swift */,
18711874
7430C9C81F192F260051B8E6 /* RemoteSourcePostAttribution.h */,
@@ -3491,6 +3494,7 @@
34913494
3FD634F32BC3AD6200CEDF5E /* Result+Callback.swift in Sources */,
34923495
B5A4822E20AC6C1A009D95F6 /* WPKitLogging.m in Sources */,
34933496
3FE2E97C2BC3A332002CA2E1 /* WordPressComRestApi.swift in Sources */,
3497+
0CE4E8252DC027AC00056DD9 /* RemoteSubscriber.swift in Sources */,
34943498
FE6C673C2BB739950083ECAB /* NSAttributedString+extensions.swift in Sources */,
34953499
7430C9A61F1927180051B8E6 /* ReaderSiteServiceRemote.m in Sources */,
34963500
FEE4EF57272FDD4B003CDA3C /* RemoteCommentV2.swift in Sources */,

0 commit comments

Comments
 (0)