Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 79c8d79

Browse files
committed
Add AtomicSiteServiceRemote/getWebServerLogs
1 parent 8a286de commit 79c8d79

File tree

2 files changed

+80
-12
lines changed

2 files changed

+80
-12
lines changed

WordPressKit/AtomicLogs.swift

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Foundation
22

3-
public final class AtomicLogMessage: Decodable {
3+
public final class AtomicErrorLogEntry: Decodable {
44
public let message: String?
55
public let severity: String?
66
public let kind: String?
@@ -19,6 +19,30 @@ public final class AtomicLogMessage: Decodable {
1919

2020
public final class AtomicErrorLogsResponse: Decodable {
2121
public let totalResults: Int
22-
public let logs: [AtomicLogMessage]
22+
public let logs: [AtomicErrorLogEntry]
23+
public let scrollId: String?
24+
}
25+
26+
public class AtomicWebServerLogEntry: Decodable {
27+
public let bodyBytesSent: Int?
28+
/// The possible values are `"true"` or `"false"`.
29+
public let cached: String?
30+
public let date: Date?
31+
public let httpHost: String?
32+
public let httpReferer: String?
33+
public let httpUserAgent: String?
34+
public let requestTime: Double?
35+
public let requestType: String?
36+
public let requestURL: String?
37+
public let scheme: String?
38+
public let status: Int?
39+
public let timestamp: Int?
40+
public let type: String?
41+
public let userIP: String?
42+
}
43+
44+
public final class AtomicWebServerLogsResponse: Decodable {
45+
public let totalResults: Int
46+
public let logs: [AtomicWebServerLogEntry]
2347
public let scrollId: String?
2448
}

WordPressKit/AtomicSiteServiceRemote.swift

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,71 @@ import Foundation
33
public final class AtomicSiteServiceRemote: ServiceRemoteWordPressComREST {
44
/// - parameter scrollID: Pass the scroll ID from the previous response to
55
/// fetch the next page.
6-
public func getSiteErrorLogs(siteID: Int,
6+
public func getErrorLogs(siteID: Int,
7+
range: Range<Date>,
8+
severity: AtomicErrorLogEntry.Severity? = nil,
9+
scrollID: String? = nil,
10+
pageSize: Int = 50,
11+
success: @escaping (AtomicErrorLogsResponse) -> Void,
12+
failure: @escaping (Error) -> Void) {
13+
let path = self.path(forEndpoint: "sites/\(siteID)/hosting/error-logs/", withVersion: ._2_0)
14+
var parameters = [
15+
"start": "\(Int(range.lowerBound.timeIntervalSince1970))",
16+
"end": "\(Int(range.upperBound.timeIntervalSince1970))",
17+
"sort_order": "desc",
18+
"page_size": "\(pageSize)"
19+
] as [String: String]
20+
if let severity {
21+
parameters["filter[severity][]"] = severity.rawValue
22+
}
23+
if let scrollID {
24+
parameters["scroll_id"] = scrollID
25+
}
26+
wordPressComRestApi.GET(path, parameters: parameters as [String: AnyObject]) { responseObject, httpResponse in
27+
guard (200..<300).contains(httpResponse?.statusCode ?? 0),
28+
let data = (responseObject as? [String: AnyObject])?["data"],
29+
JSONSerialization.isValidJSONObject(data) else {
30+
failure(URLError(.unknown))
31+
return
32+
}
33+
do {
34+
let data = try JSONSerialization.data(withJSONObject: data)
35+
let response = try JSONDecoder.apiDecoder.decode(AtomicErrorLogsResponse.self, from: data)
36+
success(response)
37+
} catch {
38+
WPKitLogError("Error parsing campaigns response: \(error), \(responseObject)")
39+
failure(error)
40+
}
41+
} failure: { error, _ in
42+
failure(error)
43+
}
44+
}
45+
46+
public func getWebServerLogs(siteID: Int,
747
range: Range<Date>,
8-
severity: AtomicLogMessage.Severity? = nil,
48+
httpMethod: String? = nil,
49+
statusCode: Int? = nil,
950
scrollID: String? = nil,
1051
pageSize: Int = 50,
11-
success: @escaping (AtomicErrorLogsResponse) -> Void,
52+
success: @escaping (AtomicWebServerLogsResponse) -> Void,
1253
failure: @escaping (Error) -> Void) {
13-
let path = self.path(forEndpoint: "sites/\(siteID)/hosting/error-logs/", withVersion: ._2_0)
54+
let path = self.path(forEndpoint: "sites/\(siteID)/hosting/logs/", withVersion: ._2_0)
1455
var parameters = [
1556
"start": "\(Int(range.lowerBound.timeIntervalSince1970))",
1657
"end": "\(Int(range.upperBound.timeIntervalSince1970))",
1758
"sort_order": "desc",
1859
"page_size": "\(pageSize)"
19-
] as [String: AnyObject]
20-
if let severity {
21-
parameters["filter[severity][]"] = severity.rawValue as AnyObject
60+
] as [String: String]
61+
if let httpMethod {
62+
parameters["filter[request_type][]"] = httpMethod.uppercased()
63+
}
64+
if let statusCode {
65+
parameters["filter[status][]"] = "\(statusCode)"
2266
}
2367
if let scrollID {
24-
parameters["scroll_id"] = scrollID as AnyObject
68+
parameters["scroll_id"] = scrollID
2569
}
26-
wordPressComRestApi.GET(path, parameters: parameters) { responseObject, httpResponse in
70+
wordPressComRestApi.GET(path, parameters: parameters as [String: AnyObject]) { responseObject, httpResponse in
2771
guard (200..<300).contains(httpResponse?.statusCode ?? 0),
2872
let data = (responseObject as? [String: AnyObject])?["data"],
2973
JSONSerialization.isValidJSONObject(data) else {
@@ -32,7 +76,7 @@ public final class AtomicSiteServiceRemote: ServiceRemoteWordPressComREST {
3276
}
3377
do {
3478
let data = try JSONSerialization.data(withJSONObject: data)
35-
let response = try JSONDecoder.apiDecoder.decode(AtomicErrorLogsResponse.self, from: data)
79+
let response = try JSONDecoder.apiDecoder.decode(AtomicWebServerLogsResponse.self, from: data)
3680
success(response)
3781
} catch {
3882
WPKitLogError("Error parsing campaigns response: \(error), \(responseObject)")

0 commit comments

Comments
 (0)