Saltar al contenido principal

Entities parciales

A veces tienes un endpoint de lista cuyas entidades solo incluyen un subconjunto de los campos necesarios para resumirlas.

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

En este caso podemos sobrescribir Entity.validate() usando validateRequired() para asegurarnos de tener la respuesta completa cuando se necesita (vistas de detalle), mientras mantenemos nuestro estado DRY y normalizado para garantizar la integridad de los datos.

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▶

Datos de detalle en una entity anidada​

A menudo es mejor mover los datos costosos a otra entity para simplificar la 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]) },
});