Mutation Side-Effects
When mutations update more than one resource, it may be tempting to simply expire all the other resources.
However, we can still achieve the high performance atomic mutations if we simply bundle all updated resources in the mutation response, we can avoid this slow networking cascade.
Network Cascade
Response Bundling
Example
You're running a crypto trading platform called dogebase
. Every time
a user creates a trade, you need to update some balance information
in their accounts object. So upon POST
ing to the /trade/
endpoint,
you nest both the updated accounts object along with the trade you just
created.
{
"trade": {
"id": 2893232,
"user": 1,
"amount": "50.2335324",
"coin": "doge",
"created_at": ""
},
"account": {
"id": 899,
"user": 1,
"balance": "1337.00",
"coin_value": "3.50"
}
}
To handle this, we just need to update the schema
to include the custom
endpoint.
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,
},
}),
}));
Now if when we use the getList.push Endpoint generator method,
we will be happy knowing both the trade and account information will
be updated in the cache after the POST
request is complete.
export default function CreateTrade() {
const ctrl = useController();
const handleSubmit = payload =>
ctrl.fetch(TradeResource.create, payload);
//...
}
Feel free to create completely new RestEndpoint methods for any custom
endpoints you have. This endpoint tells Reactive Data Client
how to process any
request.