feature/single_value_storages #6

Merged
ivan.smolin merged 9 commits from feature/single_value_storages into master 2023-05-31 17:18:14 +03:00
Member

SingleValueStorage - протокол для доступа к значению которое может храниться в Keychain, UserDefaults или ещё где-то.

Позволяет:

  • инкапсулировать внутри себя логику получения, записи и удаления значения
  • добавлять дополнительную логику для получения или изменения значений через композицию или наследование
  • ограничить доступ к данным в UserDefaults или Keychain в разных частях приложения

StringValueKeychainStorage

Класс для работы со строковым значением нахоящимся в keychain (самый частый кейс)

import TIKeychainUtils
import TIFoundationUtils
import KeychainAccess

extension StorageKey {
    static var apiToken: StorageKey<String> {
        .init(rawValue: "apiToken")
    }

    static var deleteApiToken: StorageKey<Bool> {
        .init(rawValue: "deleteApiToken")
    }
}

let apiTokenKeychainStorage = StringValueKeychainStorage(keychain: keychain, storageKey: .apiToken)

if apiTokenKeychainStorage.hasStoredValue() {
    // open auth user flow, perform requests
} else {
    // show login screen
    // ...

    // login

//    switch await userService.login() {
//    case .success:
//        // open auth user flow, perform requests
//    case .failure:
//        // show login screen
//    }
}

AppInstallLifetimeSingleValueStorage<SingleValueStorage>

Класс позволяющий добавить дополнительную функциональность очистки значения по конкретному ключу в keychain
после переустановки приложения

import Foundation

let defaults = UserDefaults.standard // or AppGroup defaults

let appReinstallChecker = AppReinstallChecker(defaultsStorage: defaults,
                                              storageKey: .deleteApiToken)

let appInstallAwareTokenStorage = apiTokenKeychainStorage.appInstallLifetimeStorage(reinstallChecker: appReinstallChecker)

if appInstallAwareTokenStorage.hasStoredValue() {
    // app wasn't reinstalled, token is exist
} else {
    // app was reinstalled or token is empty
    // ...
}
# `SingleValueStorage` - протокол для доступа к значению которое может храниться в Keychain, UserDefaults или ещё где-то. Позволяет: - инкапсулировать внутри себя логику получения, записи и удаления значения - добавлять дополнительную логику для получения или изменения значений через композицию или наследование - ограничить доступ к данным в UserDefaults или Keychain в разных частях приложения ### `StringValueKeychainStorage` Класс для работы со строковым значением нахоящимся в keychain (самый частый кейс) ```swift import TIKeychainUtils import TIFoundationUtils import KeychainAccess extension StorageKey { static var apiToken: StorageKey<String> { .init(rawValue: "apiToken") } static var deleteApiToken: StorageKey<Bool> { .init(rawValue: "deleteApiToken") } } let apiTokenKeychainStorage = StringValueKeychainStorage(keychain: keychain, storageKey: .apiToken) if apiTokenKeychainStorage.hasStoredValue() { // open auth user flow, perform requests } else { // show login screen // ... // login // switch await userService.login() { // case .success: // // open auth user flow, perform requests // case .failure: // // show login screen // } } ``` ### `AppInstallLifetimeSingleValueStorage<SingleValueStorage>` Класс позволяющий добавить дополнительную функциональность очистки значения по конкретному ключу в keychain после переустановки приложения ```swift import Foundation let defaults = UserDefaults.standard // or AppGroup defaults let appReinstallChecker = AppReinstallChecker(defaultsStorage: defaults, storageKey: .deleteApiToken) let appInstallAwareTokenStorage = apiTokenKeychainStorage.appInstallLifetimeStorage(reinstallChecker: appReinstallChecker) if appInstallAwareTokenStorage.hasStoredValue() { // app wasn't reinstalled, token is exist } else { // app was reinstalled or token is empty // ... } ```
ivan.smolin added 5 commits 2023-05-25 11:44:27 +03:00
ivan.smolin added 1 commit 2023-05-25 18:17:53 +03:00
ivan.smolin added 1 commit 2023-05-26 10:49:21 +03:00
vladimir.makarov reviewed 2023-05-26 11:23:43 +03:00
@ -0,0 +44,4 @@
}
open func getValue() -> Result<Storage.ValueType, Storage.ErrorType> {
if appReinstallChecker.isAppFirstRun {

Минор, но, может, переписать на guard? Немного от вложенности избавимся

Минор, но, может, переписать на `guard`? Немного от вложенности избавимся
vladimir.makarov marked this conversation as resolved
@ -35,0 +37,4 @@
prependRequestRetriers: [RequestRetrier] = [],
appendRequestRetriers: [RequestRetrier] = [],
completion: @escaping ParameterClosure<EndpointResponse<S>>) -> Cancellable
{

Тоже минор, тут скобка съехала

Тоже минор, тут скобка съехала
vladimir.makarov marked this conversation as resolved
@ -65,1 +110,4 @@
self.process(request: request) {
completion($0.mapError { .init(failures: [$0]) })
}
.add(to: cancellableBag)

И, если не ошибаюсь, то между case оставляем пустую строку, там в нескольких местах есть такое

И, если не ошибаюсь, то между `case` оставляем пустую строку, там в нескольких местах есть такое
vladimir.makarov marked this conversation as resolved
vladimir.makarov approved these changes 2023-05-26 11:24:15 +03:00
ivan.smolin added 1 commit 2023-05-26 16:07:44 +03:00
vladimir.makarov approved these changes 2023-05-26 19:46:35 +03:00
ivan.smolin added 1 commit 2023-05-29 17:35:58 +03:00
vladimir.makarov approved these changes 2023-05-29 17:51:44 +03:00
ivan.smolin merged commit 5a74c342d9 into master 2023-05-31 17:18:14 +03:00
ivan.smolin deleted branch feature/single_value_storages 2023-05-31 17:18:15 +03:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: TouchInstinct/LeadKit#6
No description provided.