-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Elijah Cobb
committed
Jul 10, 2019
1 parent
fc07fa4
commit 8b4a500
Showing
46 changed files
with
849 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
target 'subscribeto' do | ||
pod 'AwaitKit', '~> 5.2.0' | ||
end |
10 changes: 10 additions & 0 deletions
10
subscribeto/subscribeto.xcworkspace/contents.xcworkspacedata
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
8 changes: 8 additions & 0 deletions
8
subscribeto/subscribeto.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
<plist version="1.0"> | ||
<dict> | ||
<key>IDEDidComputeMac32BitWarning</key> | ||
<true/> | ||
</dict> | ||
</plist> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,62 +1,29 @@ | ||
// | ||
// API.swift | ||
// APIRequests.swift | ||
// subscribeto | ||
// | ||
// Created by Elijah Cobb on 9/07/19. | ||
// Created by Elijah Cobb on 10/07/19. | ||
// Copyright © 2019 subscribeto. All rights reserved. | ||
// | ||
|
||
import Foundation | ||
import AwaitKit | ||
import PromiseKit | ||
|
||
struct S2NetworkError { | ||
let code: Int | ||
let msg: String | ||
} | ||
|
||
struct S2Request { | ||
struct API { | ||
|
||
enum Method: String { | ||
case get = "GET" | ||
case post = "POST" | ||
case delete = "DELETE" | ||
case put = "PUT" | ||
struct NetworkError { | ||
let code: Int | ||
let message: String | ||
} | ||
|
||
enum Token { | ||
case session | ||
case totp(String) | ||
case email(String) | ||
case sms(String) | ||
} | ||
|
||
static let baseUrl = "http://api.scribe.to" | ||
static var sessionToken: String? | ||
|
||
var method: Method | ||
var endpoint: String | ||
var token: Token | ||
|
||
func makeRequest(_ handler: @escaping (Data?, S2NetworkError?) -> Void) { | ||
|
||
let session = URLSession.init() | ||
guard let url = URL.init(string: S2Request.baseUrl + "/" + endpoint) else { return handler(nil, S2NetworkError(code: -1, msg: "The url created was invalid.")) } | ||
let urlRequest = URLRequest.init(url: url) | ||
|
||
session.dataTask(with: urlRequest) { (data: Data?, response: URLResponse?, error: Error?) in | ||
|
||
if data != nil { handler(data, nil) } | ||
else { | ||
|
||
guard let err = error else { | ||
return handler(nil, S2NetworkError(code: -1, msg: "Both ")) | ||
} | ||
|
||
handler(nil, S2NetworkError(code: -1, msg: err.localizedDescription)) | ||
|
||
} | ||
|
||
static func signUp(email: String, password: String) -> Promise<Void> { | ||
return async { | ||
var req = ECHTTPRequest(method: .post, endpoint: "/user/auth/sign-up") | ||
req.set(body: ["email": email, "password": password]) | ||
let res = try await(req.fetch()) | ||
|
||
print(res.status) | ||
} | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
// | ||
// API.swift | ||
// subscribeto | ||
// | ||
// Created by Elijah Cobb on 9/07/19. | ||
// Copyright © 2019 subscribeto. All rights reserved. | ||
// | ||
|
||
import Foundation | ||
import AwaitKit | ||
import PromiseKit | ||
|
||
struct ECHTTPRequest { | ||
|
||
enum HTTPMethod: String { | ||
case get = "GET" | ||
case post = "POST" | ||
case put = "PUT" | ||
case delete = "DELETE" | ||
} | ||
|
||
enum RequestError: Error { | ||
case invalidUrl | ||
case unknown | ||
} | ||
|
||
var method: HTTPMethod? | ||
var endpoint: String? | ||
var body: Data? | ||
var headers: [String : String] = [String : String]() | ||
static var baseUrl: String = "http://api.scribe.to" | ||
|
||
init(method: HTTPMethod, endpoint: String) { | ||
self.method = method | ||
self.endpoint = endpoint | ||
} | ||
|
||
mutating func set(body value: [String: Any]?) { | ||
|
||
guard let value = value else { return } | ||
guard let data: Data = try? JSONSerialization.data(withJSONObject: value, options: .prettyPrinted) else { return } | ||
|
||
self.body = data | ||
self.set(header: "Content-Type", value: "application/json") | ||
|
||
} | ||
|
||
mutating func set(header: String, value: String) { | ||
|
||
self.headers[header] = value | ||
|
||
} | ||
|
||
mutating func set(token: String) { | ||
|
||
self.headers["Authorization"] = "Bearer \(token)" | ||
|
||
} | ||
|
||
func fetch() throws -> ECHTTPResponse { | ||
|
||
let sephamore = DispatchSemaphore(value: 0) | ||
|
||
var res: ECHTTPResponse? | ||
var err: Error? | ||
|
||
self.fetch { (r: ECHTTPResponse?, e: Error?) in | ||
|
||
res = r | ||
err = e | ||
|
||
sephamore.signal() | ||
|
||
} | ||
|
||
sephamore.wait() | ||
|
||
if let response = res { | ||
|
||
return response | ||
|
||
} else { | ||
|
||
if let error = err { | ||
|
||
throw error | ||
|
||
} else { | ||
|
||
throw RequestError.unknown | ||
|
||
} | ||
|
||
} | ||
|
||
} | ||
|
||
func fetch(_ completion: @escaping (ECHTTPResponse?, Error?) -> Void) { | ||
|
||
guard let endpoint = self.endpoint else { return completion(nil, RequestError.invalidUrl) } | ||
let urlString = ECHTTPRequest.baseUrl + endpoint | ||
guard let url = URL(string: urlString) else { return completion(nil, RequestError.invalidUrl) } | ||
var request = URLRequest(url: url) | ||
request.allHTTPHeaderFields = headers | ||
request.httpMethod = self.method?.rawValue | ||
if let body = self.body { request.httpBody = body } | ||
|
||
URLSession.shared.dataTask(with: request) { (d, u, e) in | ||
|
||
if let err = e { | ||
|
||
completion(nil, err) | ||
|
||
} else { | ||
|
||
completion(ECHTTPResponse(d, u), nil) | ||
|
||
} | ||
|
||
}.resume() | ||
|
||
} | ||
|
||
func fetch() -> Promise<ECHTTPResponse> { | ||
return Promise.init(resolver: { (resolver) in | ||
fetch({ (r, e) in | ||
if let response = r { | ||
resolver.fulfill(response) | ||
} else if let error = e { | ||
resolver.reject(error) | ||
} | ||
}) | ||
}) | ||
} | ||
|
||
} | ||
|
||
|
||
struct ECHTTPResponse { | ||
|
||
let status: Int | ||
let headers: [AnyHashable : Any] | ||
let body: Data? | ||
|
||
init(_ d: Data?, _ r: URLResponse?) { | ||
|
||
if let res = r as? HTTPURLResponse { | ||
|
||
self.status = res.statusCode | ||
self.headers = res.allHeaderFields | ||
|
||
|
||
} else { | ||
|
||
self.status = 0 | ||
self.headers = [AnyHashable: Any]() | ||
|
||
} | ||
|
||
self.body = d | ||
|
||
} | ||
|
||
func getDictionary<T : Decodable>() -> T? { | ||
|
||
if let data = self.body { | ||
|
||
return try? JSONDecoder().decode(T.self, from: data) | ||
|
||
} else { | ||
|
||
return nil | ||
|
||
} | ||
|
||
} | ||
|
||
func getString() -> String? { | ||
|
||
if let data = self.body { | ||
|
||
return String.init(data: data, encoding: String.Encoding.utf8) | ||
|
||
} else { | ||
|
||
return nil | ||
|
||
} | ||
|
||
} | ||
|
||
} |
Oops, something went wrong.