Валідатор
Документ "Валідатор" відповідає за опис структур валідації даних. Методи обробки даних можуть, в подальшому
використовуватись в обробниках http
запитів, в обробниках ws
подій тощо.
Кращими практиками валідації є перевірка як вхідних, так і вихідних параметрів. Перевірка вхідних параметрів
має відбуватися під час обробки, з викиданням винятків до джерела взаємодії в разі помилок. У випадку помилок
валідації вихідних параметрів рекомендується логувати або створювати alerting
, щоб оперативно реагувати та
виправляти невідповідності валідованих даних вже на стороні веб-сервера.
Архітектура
При потребі використання методів валідації необхідно створити документ "Валідатор" з переліком необхідних методів валідації.
Документ "Валідатор" повинен бути зареєстрований в документі "Реєстр" предметної області, який в свою чергу, має бути зареєстрований в відповідному сервісі включеному до бізнес-схеми. Це гарантує, що при запуску ядра обчислень будуть завантажені всі методи по роботі з валідаціями.
Склад
Валідатор відображає структуру даних у форматі "ключ-значення", де кожен ключ відображає назву функції, а йому відповідає власне сама функція. Цей підхід дозволяє зручно організувати та керувати функціональними можливостями системи, забезпечуючи швидкий доступ до потрібного функціоналу через ім'я функції як ключ.
За основу роботи провайдера кожного методу валідації даних відповідає бібліотека Joi.
import joi from 'joi'
type ValidateErrors = Array<{
message: string;
key?: string;
value?: string;
}>;
export type Localization = {
// readonly supportedLanguages
// readonly defaultLanguages
// getResource
// getAnotherResource
};
type ValidateSchema = {
}
type Handler<I = any> = (
provider: joi.Root,
localization: Localization,
data: I
) => ValidateErrors | null;
type Structure<T extends Record<string, any>> = {
[K in keyof T]: T[K] extends infer I ? Handler<I> : T[K];
}
де:
ValidateErrors
- структура типу масиву помилок валідації даних.Localization
- тип обʼєкта локалізації з переліком методів по роботі з перекладами.Handler
- тип обробника валідації даних.I
- тип структури даних, яка буде передана в обробник, та яку необхідно буде валідувати.joi.Root
- набер методів валідації, які надаються бібліотекоюjoi
.
Structure
- структура валідатора, яка представляє собою обʼєкт з переліком функцій валідації даних.K
- назва функції строкового типу.T
- тіло функції.I
- тип структури даних, яку необхідно провалідувати, дорівнює типуI
Handler
.
Реалізація
import { setValidator } from '@x-fiber/proton';
import type { Provider, Localization, ValidateErrors } from '@x-fiber/proton';
type v1SignupParams = {
firstName: string;
lastName: string;
login: string;
phone?: string;
email?: string;
password: string;
confirmPassword: string;
};
type Validator = {
v1SignupParams: v1SignupParams
};
export const BusUsersAggValidator = setValidator<Validator>({
v1SignupParams: (p: Provider, localization: Localization, data: v1SignupParams): ValidateErrors | null => {
const schema = p.object<v1SignupParams>({
firstName: p.string().min(3).max(50).required(),
lastName: p.string().min(3).max(50).required(),
email: p.string().min(3).max(320).email(),
phone: p.string().min(13).max(13),
password: p.string().min(3).required(),
confirmPassword: p.string().valid(p.ref("password")).required(),
});
const result = schema.validate(data);
if (!result.error) return null;
return result.error.details.map((d: any) => {
return {
message: d.message,
key: d.path,
value: d.type,
};
});
},
})
Реєстрація
Щоб успішно використовувати функцї валідації, документ "Валідатор" повинен бути зареєстрова ний в документі "Реєстр" цієї
предметної області. Наприклад для предметної області - агрегат "Користувачі", необхідно в опис документів функції
setRegistry
для встановлення посилання на валідатор та інші компоненти модуля:
import { setRegistry } from '@x-fiber/proton';
import { BusUsersAggValidator } from './BusUsers.agg.validator';
export const BusUsersAggRegistry = setRegistry<'BusUsersAgg'>('BusUsersAgg', {
validator: BusUsersAggValidator,
// ... other documents
});