Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IOS-6610 IOS-7064 Add a mechanism for automatic indexation of wallets #3814

Merged
merged 20 commits into from
Sep 26, 2024

Conversation

amuraveinik
Copy link
Contributor

@amuraveinik amuraveinik commented Sep 10, 2024

IOS-6610
IOS-7064

Открыл PR из ветки соседнего, подмерджил сюда develop.
Старый PR пока оставлю для референса. Если что, то потом изменения перенесу туда

До/после

@amuraveinik amuraveinik requested review from tureck1y and a team as code owners September 10, 2024 08:05
@amuraveinik amuraveinik marked this pull request as draft September 10, 2024 08:05
@amuraveinik
Copy link
Contributor Author

Потрогал логику хелпера, сделал его stateless, по мотивам коммента
#3322 (comment)

@@ -66,3 +66,9 @@ extension StoredUserWallet: Decodable {
}
}
}

protocol NameableWallet {
var name: String { get set }
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил этот протокол на случай если понадобится переименовывать не только StoredUserWallet, но и другие сущности

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да у нас других сущностей и нет, этот код вообще временный, для миграции, я бы не усложнял

Copy link
Contributor Author

@amuraveinik amuraveinik Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В общем, тут есть еще проблема. Для такой реализации очень сложно написать тесты, потому что надо инициализировать StoredUserWallet чисто чтобы потом из него получить имя. Основная сложность в том что в Card нет публичного инита, а сам он лежит в TangemSDK, и ради тестов добавлять туда инит - вот это точно оверкилл

StoredUserWallet(
  userWalletId: <#T##Data#>,
  name: <#T##String#>,
  card: CardDTO(
    card: <#T##Card#>
  ),
  associatedCardIds: <#T##Set<String>#>,
  walletData: <#T##DefaultWalletData#>,
  artwork: <#T##ArtworkInfo?#>
)

Я поломал вчера голову как это лучше сделать, но кажется что удовлетворимых варианта только два:

  1. Тот что сейчас в этом PR-е, с NameableWallet
  2. Либо переделать реализацию, чтобы хелпер принимал массив строк. Так сделал Андрей Чукавин в изначальном PR-е, но там был коммент от тебя чтобы принимать модельки кошельков сразу

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ок, оставляй так, не крит

@amuraveinik
Copy link
Contributor Author

Тест кейсы и все остальное оставил из предыдущего PR

@amuraveinik amuraveinik marked this pull request as ready for review September 13, 2024 03:43
@@ -66,3 +66,9 @@ extension StoredUserWallet: Decodable {
}
}
}

protocol NameableWallet {
var name: String { get set }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да у нас других сущностей и нет, этот код вообще временный, для миграции, я бы не усложнял

@@ -186,10 +188,21 @@ final class MainViewModel: ObservableObject {

guard let userWalletModel = userWalletRepository.selectedModel else { return }

let otherWalletNames = userWalletRepository.models.compactMap { model -> String? in
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо будет потом эту логику реюнуть постараться с экраном настроек

return
}

if let migratedWallets = UserWalletNameIndexationHelper.migratedWallets(wallets) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если migratedWallets не используется, то и возвращать думаю не нужно

Copy link
Contributor Author

@amuraveinik amuraveinik Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ошибся немного, надо именно вернувшиеся сохранять, поправил

existingNamesTestCases: [
("Wallet 2", /* -> */ "Wallet 2"),
("Wallet", /* -> */ "Wallet"),
("Wallet 2", /* -> */ "Wallet 2"),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а почему тут Wallet 2, хотя на первой строке тоже Wallet 2?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А вы это обсуждали уже в старом PRе, я тут просто оставил как есть

#3322 (comment)

@tureck1y tureck1y changed the title IOS-6610 Add a mechanism for automatic indexation of wallets❌ IOS-6610 Add a mechanism for automatic indexation of wallets Sep 13, 2024
func nextIndex(for nameTemplate: String) -> Int {
let indexes = self[nameTemplate, default: []]

for i in 1 ... 100 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

почему такой range?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ты прав, тут на самом деле надо сделать верхней границей indices.count

Логика следующая:

  1. Если массив индексов пустой, то значит можно использовать первый (index = 1)
  2. Если не пустой, то мы проходимся в цикле от 1 до размера массива и ищем дырку со свободным индексом. Если такая дырка есть, то значит она находится точно ниже верхней грани цикла, то есть меньше размера массива. Пример: для массива [1, 3, 4] дырка - это 2, а 2 < indices.count
  3. Если такой дырки нет, то значит у нас индексы идут сплошняком [1, 2, 3], и тогда следующий индекс = размер + 1

@@ -520,6 +526,18 @@ class CommonUserWalletRepository: UserWalletRepository {
initializeServices(for: selectedModel)
}

private func migrateNamesIfNeeded(_ wallets: inout [StoredUserWallet]) {
if AppSettings.shared.didMigrateUserWalletNames {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут guard по смыслу больше подходит

tureck1y
tureck1y previously approved these changes Sep 24, 2024
fedorov-d
fedorov-d previously approved these changes Sep 25, 2024
@amuraveinik amuraveinik enabled auto-merge (squash) September 25, 2024 08:21
@amuraveinik amuraveinik changed the title IOS-6610 Add a mechanism for automatic indexation of wallets IOS-6610 IOS-7064 Add a mechanism for automatic indexation of wallets Sep 25, 2024
@amuraveinik amuraveinik marked this pull request as draft September 25, 2024 08:48
auto-merge was automatically disabled September 25, 2024 08:48

Pull request was converted to draft

@amuraveinik amuraveinik dismissed stale reviews from fedorov-d and tureck1y via 3a4ce34 September 25, 2024 08:49
}

walletNameFieldValidator = AlertFieldValidator { input in
!(otherWalletNames.contains(input) || input.isEmpty)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это изменение в т.ч. и для задачи IOS-7064

Почему правило именно такое - обсудили здесь

@amuraveinik amuraveinik marked this pull request as ready for review September 25, 2024 08:51
@tureck1y tureck1y merged commit c00779b into develop Sep 26, 2024
3 checks passed
@tureck1y tureck1y deleted the feature/IOS-6610_wallet_indexation branch September 26, 2024 13:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants