Skip to content

Валидация данных портфолио

Обзор

Валидация осуществляется классом ValidationTransaction (tools/transactions/validation/validationTransaction.js) с использованием библиотеки vee-validate. Валидация применяется в трёх сценариях:

  1. При инициализации — загрузка кластера из localStorage
  2. При добавлении/редактировании — валидация формы транзакции
  3. При импорте — проверка всех транзакций из файла

Диаграмма валидации

mermaid
flowchart TD
    A["Входные данные транзакции"] --> B{"isValidTransactionType(tt)<br/>tt ∈ {1,2,3,4,5}?"}
    B -->|"Нет"| FAIL["❌ Невалидно"]
    B -->|"Да"| C["getRequiredKeys(tt)<br/>Обязательные поля для типа"]

    C --> D{"hasRequiredKeys()<br/>Все обязательные поля<br/>присутствуют?"}
    D -->|"Нет"| FAIL
    D -->|"Да"| E["getRules(tt, currenciesKeys)<br/>Правила валидации"]

    E --> F["Promise.all: для каждого поля<br/>validator.verify(value, rules)"]
    F --> G{"Все поля валидны?"}
    G -->|"Да"| OK["✅ Валидно"]
    G -->|"Нет"| FAIL

Правила валидации по полям

Правила определены в ValidationRules (validation/validationRules.js):

ПолеПравилоОписание
qtt (quantity)quantityRule()Обязательное, числовое, > 0
ca (createdAt)Дата/время (без строгой валидации)
ci (currencyId)currencyRule(currenciesKeys)Должно быть из списка валют или криптовалют
tp (transactionPrice)priceRule()Обязательное, числовое, ≥ 0
ppc (pricePerCoin)priceRule()Обязательное, числовое, ≥ 0
mp (marketPrice)priceRule()Обязательное, числовое, ≥ 0
nt (note)noteRule()Строка, макс. 100 символов
fe (feeValue)feeValueRule(currenciesKeys, feeCurrency)Числовое, ≥ 0
fec (feeCurrency)feeCurrencyRule(currenciesKeys)Из списка валют или "%"

Валидация кластера

При загрузке/импорте кластера проверяется структура:

mermaid
flowchart TD
    A["Кластер транзакций"] --> B{"hasCluster()<br/>Объект существует<br/>и непустой?"}
    B -->|"Нет"| REJECT["Отклонение"]
    B -->|"Да"| C{"isValidCluster()<br/>Каждое значение<br/>= Array?"}
    C -->|"Нет"| TOAST["Toast: ImportErrorToast<br/>Отклонение"]
    C -->|"Да"| D["Для каждого coinId"]
    D --> E["validateTransactionsList()"]
    E --> F["Фильтрация невалидных"]
    F --> G{"Были невалидные?"}
    G -->|"Да"| H["Toast ошибки<br/>needSaveUpdates = true<br/>Перезапись localStorage"]
    G -->|"Нет"| I["Данные готовы"]
    H --> I