Efectos secundarios de las mutaciones
Cuando las mutaciones actualizan más de un recurso, puede resultar tentador caducar todos los demás recursos.
Sin embargo, aún podemos lograr mutaciones atómicas de alto rendimiento si simplemente agrupamos todos los recursos actualizados en la respuesta de la mutación; así evitamos esta lenta cascada de red.
Cascada de red
Agrupación de respuestas
Ejemplo
Estás a cargo de una plataforma de trading de criptomonedas llamada dogebase. Cada vez que
un usuario crea una operación, necesitas actualizar cierta información de saldo
en su objeto de cuentas. Por eso, al hacer POST al endpoint /trade/,
anidas tanto el objeto de cuentas actualizado como la operación que acabas de
crear.
{
"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 manejar esto, solo necesitamos actualizar el schema para incluir el endpoint
personalizado.
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,
},
}),
}));
Ahora, cuando usemos el método generador de Endpoint getList.push,
tendremos la tranquilidad de saber que tanto la información de la operación como la de la cuenta
se actualizarán en la caché una vez que se complete la petición POST.
export default function CreateTrade() {
const ctrl = useController();
const handleSubmit = payload =>
ctrl.fetch(TradeResource.create, payload);
//...
}
Siéntete libre de crear métodos RestEndpoint completamente nuevos para cualquier
endpoint personalizado que tengas. Este endpoint le indica a Reactive Data Client cómo procesar cualquier
petición.