Pular para o conteúdo principal

Entities parciais

observação

O original em inglês mudou depois desta tradução, então ela pode estar desatualizada.

Às vezes você tem um endpoint de lista cujas entities incluem apenas um subconjunto dos campos necessários para resumir.

ArticleSummary
{
"id": "1",
"title": "first"
}
Article
{
"id": "1",
"title": "first",
"content": "Imagine there was much more here.",
"createdAt": "2011-10-05T14:48:00.000Z"
}

Nesse caso, podemos sobrescrever Entity.validate() usando validateRequired() para garantir que temos a resposta completa quando necessário (views de detalhe), mantendo nosso estado DRY e normalizado para assegurar a integridade dos dados.

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

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

  // this ensures `Article` maps to the same entity
  static key = 'Article';

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

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

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

export const ArticleResource = resource({
  path: '/article/:id',
  schema: Article,
}).extend({
  getList: {
    schema: new Collection([ArticleSummary]),
  },
});
Resultado

Dados de detalhe em uma entity aninhada​

Muitas vezes é melhor mover os dados custosos para outra entity, simplificando a lógica condicional.

resources/Article.ts
class ArticleSummary extends Entity {
id = '';
title = '';
content = '';
createdAt = Temporal.Instant.fromEpochMilliseconds(0);

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

// this ensures `Article` maps to the same entity
static key = 'Article';
}

class Article extends ArticleSummary {
meta = ArticleMeta.fromJS();

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

class ArticleMeta extends Entity {
viewCount = 0;
likeCount = 0;
relatedArticles: ArticleSummary[] = [];

static schema = {
relatedArticles: [ArticleSummary],
};
}

const ArticleResource = resource({
path: '/article/:id',
schema: Article,
}).extend({
getList: { schema: new Collection([ArticleSummary]) },
});