OpenAPI та валідація
Валідація вхідних даних у HTTP-запитах працює на основі метаданих, що передаються в @OasRoute()
(OAS - це скорочення від "OpenAPI Specification"). Перед стартом веб-сервера, ValidationExtension аналізує ці метадані, і якщо в конкретному роуті задекларовано, що запит може приходити із параметрами чи тілом запиту, в цей роут додається ValidationInterceptor.
Щоправда, не усі метадані, які приймаються у @OasRoute()
, беруться до уваги для валідації. На даний момент перевіряється таке:
number
: наявність параметра, мінімальне та максимальне значення;string
: наявність параметра, мінімальна та максимальна довжина;boolean
: наявність параметра та допустимі значення (0, 1, true, false);object
: наявність параметра; робиться рекурсивний прохід по кожній властивості з перевіркою, описаною в усіх пунктах цього списку (number
,string
,boolean
,object
,array
);array
: наявність параметра, мінімальна та максимальна кількість елементів, а також відбувається перевірка, описана в усіх пунктах цього списку (number
,string
,boolean
,object
,array
) для кожного елемента.
OasOperationObject
Для спрощення передачі метаданих до @OasRoute()
, створено хелпер OasOperationObject. Кожен метод цього класа має префікс set*
або get*
. Кожен із методів з префіксом set*
повертає референс на інстанс OasOperationObject
, через що можна викликати декілька методів підряд:
@OasRoute('GET', ':slug', [], {
...new OasOperationObject()
.setOptionalParams('query', Params, 'tag', 'author', 'limit', 'offset')
.setResponse(ArticleItem, 'Description for response content.')
.setUnauthorizedResponse()
.getNotFoundResponse('The article not found.'),
})
async getArticle() {
// ...
}
Як бачите, тут тричі викликаються методи з префіксом set*
і в самому кінці - один раз з префіксом get*
. Це важливий момент: "Кожне використання інстансу OasOperationObject
повинно завершуватись викликом методу з префіксом get*
".
Зверніть увагу, що тут Params
та ArticleItem
- це класи, що виступають тут у якості моделей даних, з яких хелпер OasOperationObject
зчитує метадані. Для закріплення метаданих за кожною моделлю, використовується декоратор @Column()
:
import { Column } from '@ditsmod/openapi';
export class ArticleItem {
@Column()
article: Article;
}