Appearance
Валидация данных портфолио
Обзор
Валидация осуществляется классом ValidationTransaction (tools/transactions/validation/validationTransaction.js) с использованием библиотеки vee-validate. Валидация применяется в трёх сценариях:
- При инициализации — загрузка кластера из localStorage
- При добавлении/редактировании — валидация формы транзакции
- При импорте — проверка всех транзакций из файла
Диаграмма валидации
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