Pular para o conteúdo principal

Validação da API

Entity.validate() é chamado durante a normalização e a desnormalização. undefined indica que não há erro, e uma string com a mensagem de erro indica que há um erro.

Verificação de campo​

A validação acontece depois de Entity.process(), mas antes de Entity.fromJS(), e portanto opera sobre POJOs, e não sobre uma instância da classe.

Aqui podemos garantir que o campo title esteja presente e seja do tipo esperado.

import { Entity, RestEndpoint } from '@data-client/rest';

export class Article extends Entity {
  id = '';
  title = '';

  static validate(processedEntity) {
    if (!Object.hasOwn(processedEntity, 'title')) return 'missing title field';
    if (typeof processedEntity.title !== 'string') return 'title is wrong type';
  }
}

export const getArticle = new RestEndpoint({
  path: '/article/:id',
  schema: Article,
});

Verificação de todos os campos​

validateRequired() pode ser usado para verificar se todos os campos definidos estão presentes.

import { Entity, RestEndpoint, validateRequired } from '@data-client/rest';

export class Article extends Entity {
  id = '';
  title = '';

  static validate(processedEntity) {
    return validateRequired(processedEntity, this.defaults);
  }
}

export const getArticle = new RestEndpoint({
  path: '/article/:id',
  schema: Article,
});

Resultados parciais​

Outro ótimo uso da validação é combinar endpoints que retornam objetos incompletos. Isso costuma ser útil quando alguns campos consomem muita banda ou são computacionalmente caros para o backend.

Considere usar validateRequired para reduzir código.

import { Entity, RestEndpoint } from '@data-client/rest';
import { Temporal } from 'temporal-polyfill';

export class ArticlePreview extends Entity {
  id = '';
  title = '';

  static key = 'Article';
}
export const getArticleList = new RestEndpoint({
  path: '/article',
  schema: [ArticlePreview],
});

export class ArticleFull extends ArticlePreview {
  content = '';
  createdAt = Temporal.Instant.fromEpochMilliseconds(0);

  static schema = {
    createdAt: Temporal.Instant.from,
  };

  static validate(processedEntity) {
    if (!Object.hasOwn(processedEntity, 'content')) return 'Missing content';
  }
}

export const getArticle = new RestEndpoint({
  path: '/article/:id',
  schema: ArticleFull,
});