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.
resources/Article
ArticleDetail
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]) },
});