store.mutate()
To make any changes to the data in the store, store.mutate() will be used.
- Create data
- Update data
- Delete data
Usage
Create an object
store.mutate({
  id: 1,
  username: "the_overlord"
})
Update an object
store.mutate({
  id: 1,
  username: "Updated!"
})
Delete an object
Check __destroy__ and __identify__
store.mutate({
  id: 1,
  __identify__: "user",
  __destroy__: true,
})
Payload
The payload is an object that we want to create/update in the store.
const payload = { id: 1, username: "the_overlord" }
store.mutate(payload)
Payloads have 4 special fields
- __identify__ a string, to tell the store what type of object this is.
- __indexes__ a string[], to tell the store which indexesthis object belongs to.
- __removeFromIndexes__ a string[], to tell the store which indexeswe should remove this object from.
- __destroy__ a boolean, to tell the store that we want to delete this object from the store.
__identify__
There are two ways an the store can identify the type of an object.
- Through the identifier
- By adding __identify__ in the object
Adding data will be faster when using __identify__ in the object compaired to the identifier function.
If __identify__ is found in the object, the store will not use the identifier function.
Here the identifier function will not know that this object is a user object, so we add __identify__ in the object to tell the store that this is a user object.
const store = createStore({
  // ...properties
  identifier: {
    user: o => "username" in o,
  }
});
store.mutate({
  id: 1,
  age: 25,
  __identify__: "user",
})
__indexes__
When we add some object to the store or create a new object, we may need to add the objects to an index
store.mutate({
  id: 1,
  age: 25,
  __indexes__: ["postFeed-home"]
})
When using an index, we folllow this naming structure [indexName]-[uniqueKey]
This way we can use the same index for multiple pages.
Example:
// We have a comments page, for each post.
const commentsIndex = createRelationalObjectIndex("commentsIndex", [comment]);
// Here is how we will select data in this index
// Post ID will be passed dynamically.
// So for each post comments page, we will maintain a seperate index of comments.
store.selectIndex(`commentsIndex-${postId}`, options);
// Add one comment to the store and to the index 'commentsIndex'
store.mutate({
  // ...comment
  __indexes__: [`commentsIndex-${postId}`]
})
__removeFromIndexes__
To remove an object from an index but not from the store, we use __removeFromIndexes__.
Over here we passed the id of the comment, and used __identify__ to identify the object as a comment and __removeFromIndexes__ to remove it from the index.
store.mutate({
  id: 10,
  __identify__: "comment",
  __removeFromIndexes__: [`commentsIndex-${postId}`]
})
__destroy__
To delete an object from the store, pass __destroy__ as true.
All references to this object's primaryKey will be removed.
All orphaned children will be deleted.
To keep the orphaned children and references, you must do a soft delete. (probably using a field like 'isDeleted' to know if the object is deleted.)
store.mutate({
  id: 10,
  __identify__: "comment",
  __destroy__: true
})
API
Properties
| Property | Type | Default | Description | 
|---|---|---|---|
| __identify__ | string | undefined | Used to define the type of the object when the identifier function will not work. | 
| __destroy__ | boolean | undefined | When truethe object will be deleted from the store. All references to the object and all orphaned children will be deleted. | 
| __indexes__ | string[] | undefined | When an object is being created in the store, the object will also be added to all these indexes. | 
| __removeFromIndexes__ | string[] | undefined | When set, the object will be removed from all matching indexes. |