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