Skip to content

Instantly share code, notes, and snippets.

View nderkach's full-sized avatar
✏️

Nikolay Derkach nderkach

✏️
View GitHub Profile
fileprivate init() {
...
let jsonDecoder = JSONDecoder()
// –––––– Mapping from specific paths to models ––––––
service.configureTransformer("/status") {
try jsonDecoder.decode([String: String].self, from: $0.content)
func resourceChanged(_ resource: Resource, event: ResourceEvent) {
if let status: [String: String] = resource.typedContent() {
print("\(status)")
}
}
if let text: String = resource.typedContent() {
print(text)
}
private var authToken: String? {
didSet {
service.invalidateConfiguration()
guard let token = authToken else { return }
let jwt = try? JWTDecode.decode(jwt: token)
tokenExpiryDate = jwt?.expiresAt
}
}
@discardableResult func login(_ email: String, _ password: String, onSuccess: @escaping () -> Void, onFailure: @escaping (String) -> Void) -> Request {
let request = service.resource("/login")
.request(.post, json: ["email": email, "password": password])
.onSuccess { entity in
guard let json: [String: String] = entity.typedContent() else {
onFailure("JSON parsing error")
return
}
guard let token = json["jwt"] else {
private var refreshTimer: Timer?
public private(set) var tokenExpiryDate: Date? {
didSet {
guard let tokenExpiryDate = tokenExpiryDate else { return }
let timeToExpire = tokenExpiryDate.timeIntervalSinceNow
// try to refresh JWT token before the expiration time
let timeToRefresh = Date(timeIntervalSinceNow: timeToExpire * 0.9)
service.configure("**") {
if let authToken = self.authToken {
$0.headers["Authorization"] = "Bearer \(authToken)"
}
}
import Foundation
struct Expense: Decodable {
let amount: Float
let createdAt: Date
let description: String
let type: String
enum CodingKeys: String, CodingKey {
case amount
service.configureTransformer("/login", requestMethods: [.post]) {
try jsonDecoder.decode([String: String].self, from: $0.content)
}
service.configureTransformer("/expenses") {
try jsonDecoder.decode([Expense].self, from: $0.content)
}