Skip to content

Commit d3d90b8

Browse files
committed
Cleanup post method and use encodable
1 parent 07eadcf commit d3d90b8

File tree

5 files changed

+123
-332
lines changed

5 files changed

+123
-332
lines changed

Lib/StudyplusSDK.xcodeproj/project.pbxproj

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
183FDAAF1E7544240085589F /* StudyplusError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183FDAAE1E7544240085589F /* StudyplusError.swift */; };
1616
183FDAB11E754DCB0085589F /* StudyplusAPIRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183FDAB01E754DCB0085589F /* StudyplusAPIRequest.swift */; };
1717
183FDAB31E7561B90085589F /* StudyplusRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183FDAB21E7561B90085589F /* StudyplusRecord.swift */; };
18-
183FDAB51E7584C50085589F /* StudyplusRecordAmount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183FDAB41E7584C50085589F /* StudyplusRecordAmount.swift */; };
1918
/* End PBXBuildFile section */
2019

2120
/* Begin PBXContainerItemProxy section */
@@ -40,7 +39,6 @@
4039
183FDAAE1E7544240085589F /* StudyplusError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StudyplusError.swift; sourceTree = "<group>"; };
4140
183FDAB01E754DCB0085589F /* StudyplusAPIRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StudyplusAPIRequest.swift; sourceTree = "<group>"; };
4241
183FDAB21E7561B90085589F /* StudyplusRecord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StudyplusRecord.swift; sourceTree = "<group>"; };
43-
183FDAB41E7584C50085589F /* StudyplusRecordAmount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StudyplusRecordAmount.swift; sourceTree = "<group>"; };
4442
/* End PBXFileReference section */
4543

4644
/* Begin PBXFrameworksBuildPhase section */
@@ -83,14 +81,13 @@
8381
183FDA691E7510920085589F /* StudyplusSDK */ = {
8482
isa = PBXGroup;
8583
children = (
86-
183FDA6A1E7510920085589F /* StudyplusSDK.h */,
8784
183FDA6B1E7510920085589F /* Info.plist */,
8885
183FDAAA1E75148D0085589F /* Studyplus.swift */,
89-
183FDAAC1E753E430085589F /* StudyplusLoginDelegate.swift */,
90-
183FDAAE1E7544240085589F /* StudyplusError.swift */,
9186
183FDAB01E754DCB0085589F /* StudyplusAPIRequest.swift */,
87+
183FDAAE1E7544240085589F /* StudyplusError.swift */,
88+
183FDAAC1E753E430085589F /* StudyplusLoginDelegate.swift */,
9289
183FDAB21E7561B90085589F /* StudyplusRecord.swift */,
93-
183FDAB41E7584C50085589F /* StudyplusRecordAmount.swift */,
90+
183FDA6A1E7510920085589F /* StudyplusSDK.h */,
9491
);
9592
path = StudyplusSDK;
9693
sourceTree = "<group>";
@@ -221,7 +218,6 @@
221218
isa = PBXSourcesBuildPhase;
222219
buildActionMask = 2147483647;
223220
files = (
224-
183FDAB51E7584C50085589F /* StudyplusRecordAmount.swift in Sources */,
225221
183FDAB11E754DCB0085589F /* StudyplusAPIRequest.swift in Sources */,
226222
183FDAB31E7561B90085589F /* StudyplusRecord.swift in Sources */,
227223
183FDAAD1E753E430085589F /* StudyplusLoginDelegate.swift in Sources */,

Lib/StudyplusSDK/Studyplus.swift

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,6 @@ final public class Studyplus {
4949
*/
5050
public static let shared: Studyplus = Studyplus()
5151

52-
/**
53-
When set to true, then call back to the delegate without posting the actual processing.
54-
55-
trueの場合、勉強記録の投稿時に実際の通信は行わずdelegateのコールバックメソッドを呼び出して処理を終了します。
56-
*/
57-
public var debug: Bool = false
58-
5952
/**
6053
Consumer Key for Studyplus API.
6154

@@ -156,40 +149,27 @@ final public class Studyplus {
156149
return String(data: data, encoding: .utf8)
157150
}
158151

159-
/// Posts a new study record to Studyplus.
160-
///
161-
/// Studyplusに勉強記録を新規投稿します。
152+
/// Studyplusに学習記録を投稿
162153
///
163154
/// - Parameter
164-
/// - studyRecord: see StudyplusRecord
165-
/// - success: callback when success to post the studyRecord
166-
/// - failure: callback when failure to post the studyRecord
167-
public func post(studyRecord: StudyplusRecord,
155+
/// - studyRecord: 学習記録
156+
/// - success: 投稿成功時のコールバック
157+
/// - failure: 投稿失敗時のコールバック
158+
public func post(_ record: StudyplusRecord,
168159
success: @escaping () -> Void,
169160
failure: @escaping (_ error: StudyplusError) -> Void) {
170-
171-
guard StudyplusRecord.durationRange ~= Int(studyRecord.duration) else {
161+
guard record.isValidDuration else {
162+
// TODO: change error type
172163
failure(.postRecordFailed)
173164
return
174165
}
175166

176-
if !self.isConnected() {
177-
failure(.notConnected)
178-
return
179-
}
180-
181167
guard let accessToken = self.accessToken() else {
182168
failure(.notConnected)
183169
return
184170
}
185171

186-
if self.debug {
187-
success()
188-
return
189-
}
190-
191-
let request: StudyplusAPIRequest = StudyplusAPIRequest(accessToken: accessToken)
192-
request.post(path: "study_records", params: studyRecord.requestParams(), success: { (_) in
172+
StudyplusAPIRequest(accessToken: accessToken).post(record, success: {
193173
success()
194174
}, failure: { error in
195175
failure(error)

Lib/StudyplusSDK/StudyplusAPIRequest.swift

Lines changed: 30 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -28,131 +28,60 @@ import Foundation
2828

2929
internal struct StudyplusAPIRequest {
3030

31-
private let apiVersion: Int = 1
31+
private static let endPoint: String = "https://external-api.studyplus.jp"
32+
private static let path: String = "/v1/study_record"
33+
private let studyRecordUrl: URL = URL(string: endPoint + path)!
34+
3235
private let accessToken: String
36+
private var encoder: JSONEncoder {
37+
let encoder = JSONEncoder()
38+
encoder.keyEncodingStrategy = .convertToSnakeCase
39+
encoder.dateEncodingStrategy = .iso8601
40+
41+
return encoder
42+
}
3343

3444
internal init(accessToken: String) {
3545
self.accessToken = accessToken
3646
}
3747

38-
internal func post(path: String,
39-
params: [String: Any],
40-
success: @escaping (_ response: [AnyHashable: Any]) -> Void,
48+
internal func post(_ record: StudyplusRecord,
49+
success: @escaping () -> Void,
4150
failure: @escaping (_ error: StudyplusError) -> Void) {
42-
43-
start(path: path, method: "POST", body: params, success: { (response) in
44-
51+
studyRecord(record, success: {
4552
DispatchQueue.main.async {
46-
success(response)
53+
success()
4754
}
48-
49-
}, failure: { statusCode, response in
50-
55+
}, failure: { error in
5156
DispatchQueue.main.async {
52-
if let message: String = response?["message"] as? String {
53-
failure(StudyplusError(statusCode, message))
54-
} else {
55-
failure(.unknownReason("Not connected to the network or StudyplusAPIRequest Error"))
56-
}
57+
failure(error)
5758
}
5859
})
5960
}
6061

61-
// MARK: - private
62-
63-
private func start(path: String,
64-
method: String,
65-
body: [String: Any],
66-
success: @escaping (_ response: [AnyHashable: Any]) -> Void,
67-
failure: @escaping (_ statusCode: Int, _ response: [String: Any]?) -> Void) {
68-
69-
guard let url = buildUrl(path: path) else {
70-
failure(0, nil)
71-
return
72-
}
73-
74-
var request = URLRequest(url: url)
75-
request.httpMethod = method
76-
77-
do {
78-
let data = try JSONSerialization.data(withJSONObject: body, options: .prettyPrinted)
79-
request.addValue("application/json; charaset=utf-8", forHTTPHeaderField: "Content-Type")
80-
request.httpBody = data
81-
} catch {
82-
failure(0, nil)
83-
return
84-
}
85-
62+
private func studyRecord(_ record: StudyplusRecord,
63+
success: @escaping () -> Void,
64+
failure: @escaping (_ error: StudyplusError) -> Void) {
65+
var request = URLRequest(url: studyRecordUrl)
66+
request.httpMethod = "POST"
67+
request.addValue("application/json; charaset=utf-8", forHTTPHeaderField: "Content-Type")
8668
request.addValue("OAuth " + accessToken, forHTTPHeaderField: "Authorization")
69+
request.httpBody = try? encoder.encode(record)
8770

88-
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
89-
90-
guard error == nil else {
91-
failure(0, nil)
71+
let task = URLSession.shared.dataTask(with: request) { data, response, error in
72+
guard data != nil, error == nil, let response = response as? HTTPURLResponse else {
73+
failure(.postRecordFailed)
9274
return
9375
}
9476

95-
guard let httpResponse: HTTPURLResponse = response as? HTTPURLResponse else {
96-
failure(0, nil)
77+
guard (200...204).contains(response.statusCode) else {
78+
failure(StudyplusError(response.statusCode, ""))
9779
return
9880
}
9981

100-
switch httpResponse.statusCode {
101-
case 200, 201, 202:
102-
guard let data = data else {
103-
failure(0, nil)
104-
return
105-
}
106-
107-
do {
108-
let jsonObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
109-
guard let obj = jsonObject as? [String: Any] else {
110-
failure(0, nil)
111-
return
112-
}
113-
114-
success(obj)
115-
116-
} catch {
117-
#if DEBUG
118-
print("-- StudyplusAPIRequest Json Error Path: \(url.absoluteString), Method: \(method), Description: \(error.localizedDescription) --")
119-
#endif
120-
failure(httpResponse.statusCode, ["message": error.localizedDescription])
121-
}
122-
case 204:
123-
success([:])
124-
return
125-
default:
126-
#if DEBUG
127-
print("-- StudyplusAPIRequest Path: \(url.absoluteString), Method: \(method), StatusCode: \(httpResponse.statusCode) --")
128-
#endif
129-
guard let data = data else {
130-
failure(httpResponse.statusCode, nil)
131-
return
132-
}
133-
134-
do {
135-
let jsonObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
136-
failure(httpResponse.statusCode, jsonObject as? [String: Any])
137-
return
138-
139-
} catch let jsonError {
140-
failure(httpResponse.statusCode, ["message": jsonError.localizedDescription])
141-
}
142-
}
82+
success()
14383
}
14484

145-
#if DEBUG
146-
NSLog("StudyplusAPIRequest path:%@ method:%@", url.absoluteString, method)
147-
#endif
148-
14985
task.resume()
15086
}
151-
152-
private func buildUrl(path: String) -> URL? {
153-
154-
let fullPath: String = "https://external-api.studyplus.jp/v\(apiVersion)/\(path)"
155-
guard let url = URL(string: fullPath) else { return nil }
156-
return url
157-
}
15887
}

0 commit comments

Comments
 (0)