Pular para o conteúdo principal

Efeitos colaterais de mutações

Quando mutações atualizam mais de um resource, pode ser tentador simplesmente expirar todos os outros resources.

No entanto, ainda podemos obter mutações atômicas de alto desempenho se simplesmente agruparmos todos os resources atualizados na resposta da mutação, evitando essa lenta cascata de requisições de rede.

Cascata de rede

Agrupamento de resposta

Exemplo​

Você administra uma plataforma de negociação de criptomoedas chamada dogebase. Toda vez que um usuário cria uma negociação, você precisa atualizar algumas informações de saldo no objeto de contas dele. Assim, ao fazer POST no endpoint /trade/, você aninha tanto o objeto de contas atualizado quanto a negociação que acabou de ser criada.

POST /trade/
{
"trade": {
"id": 2893232,
"user": 1,
"amount": "50.2335324",
"coin": "doge",
"created_at": ""
},
"account": {
"id": 899,
"user": 1,
"balance": "1337.00",
"coin_value": "3.50"
}
}

Para lidar com isso, basta atualizar o schema para incluir o endpoint personalizado.

resources/Trade.ts
import { resource, Entity } from '@data-client/rest';
import { Account } from './Account';

export class Trade extends Entity {
id = 0;
user = 0;
amount = '0';
coin = '';
created_at = '';
}

export const TradeResource = resource({
path: '/trade/:id',
schema: Trade,
}).extend(Base => ({
create: Base.getList.push.extend({
schema: {
trade: Base.getList.push.schema,
account: Account,
},
}),
}));

Agora, ao usarmos o método gerador de Endpoint getList.push, podemos ficar tranquilos sabendo que tanto as informações da negociação quanto as da conta serão atualizadas no cache assim que a requisição POST for concluída.

CreateTrade.tsx
export default function CreateTrade() {
const ctrl = useController();
const handleSubmit = payload =>
ctrl.fetch(TradeResource.create, payload);
//...
}
observação

Sinta-se à vontade para criar métodos de RestEndpoint completamente novos para quaisquer endpoints personalizados que você tenha. Esse endpoint diz ao Reactive Data Client como processar qualquer requisição.