-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAuthSessionLocalDataSource.swift
More file actions
79 lines (65 loc) · 2.46 KB
/
Copy pathAuthSessionLocalDataSource.swift
File metadata and controls
79 lines (65 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//
// AuthSessionLocalDataSource.swift
// Siksha
//
// Created by Codex on 7/5/26.
//
import Foundation
protocol AuthSessionLocalDataSource {
func loadSession() -> AuthSession?
func saveSession(_ session: AuthSession)
func clearSession()
}
final class AuthSessionLocalDataSourceImpl: AuthSessionLocalDataSource {
private enum Key {
static let accessToken = "accessToken"
static let tokenExpDate = "tokenExpDate"
static let appleUserIdentifier = "appleUserIdentifier"
static let signedInWithApple = "signedInWithApple"
}
private let userDefaults: UserDefaults
init(userDefaults: UserDefaults = .standard) {
self.userDefaults = userDefaults
}
func loadSession() -> AuthSession? {
guard let accessToken = userDefaults.string(forKey: Key.accessToken) else {
return nil
}
let expiresAt = expirationDate()
let appleUserIdentifier = userDefaults.bool(forKey: Key.signedInWithApple)
? userDefaults.string(forKey: Key.appleUserIdentifier)
: nil
return AuthSession(
accessToken: accessToken,
expiresAt: expiresAt,
appleUserIdentifier: appleUserIdentifier
)
}
func saveSession(_ session: AuthSession) {
userDefaults.set(session.accessToken, forKey: Key.accessToken)
if let expiresAt = session.expiresAt {
userDefaults.set(expiresAt.timeIntervalSince1970, forKey: Key.tokenExpDate)
} else {
userDefaults.removeObject(forKey: Key.tokenExpDate)
}
if let appleUserIdentifier = session.appleUserIdentifier {
userDefaults.set(appleUserIdentifier, forKey: Key.appleUserIdentifier)
userDefaults.set(true, forKey: Key.signedInWithApple)
} else {
userDefaults.removeObject(forKey: Key.appleUserIdentifier)
userDefaults.set(false, forKey: Key.signedInWithApple)
}
}
func clearSession() {
userDefaults.removeObject(forKey: Key.accessToken)
userDefaults.removeObject(forKey: Key.tokenExpDate)
userDefaults.removeObject(forKey: Key.appleUserIdentifier)
userDefaults.removeObject(forKey: Key.signedInWithApple)
}
private func expirationDate() -> Date? {
guard let timestamp = userDefaults.object(forKey: Key.tokenExpDate) as? Double else {
return nil
}
return Date(timeIntervalSince1970: timestamp)
}
}