Pular para o conteúdo principal

Entities parciais

À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
Store▶

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]) },
});