PalmyraDataStore#
@palmyralabs/palmyra-wire · PalmyraDataStore<T> extends PalmyraGridStore implements DataStore<T>
Overview#
Full CRUD store. Inherits query / queryLayout / get / export from PalmyraGridStore, adds post / put / save / remove. save is the upsert verb — POST with header action: 'save' — handy when the backend decides insert-vs-update from the payload.
Usually obtained via factory.getFormStore(...).
Constructor#
new PalmyraDataStore<T>(
baseUrl: string,
endPoint: IEndPoint,
options: StoreOptions,
factory?: APIErrorHandlerFactory,
idProperty?: strings,
)Use a MultiEndPoint when the paths diverge per verb:
const endPoint: MultiEndPoint = {
query: '/user',
post: '/user',
get: '/user/{id}',
put: '/user/{id}',
delete: '/user/{id}',
};Methods#
| Method | Signature |
|---|---|
query, queryLayout, get, export |
inherited from PalmyraGridStore |
save |
save(data: T, request?: PostRequest): Promise<T> — POST with headers: { action: 'save' } (upsert) |
post |
post(data: T, request?: PostRequest): Promise<T> — POST to postUrl |
put |
put(data: T, request?: PutRequest): Promise<T> — PUT to putUrl |
remove |
remove(key: T | any, request?: RemoveRequest): Promise<T> — DELETE to deleteUrl; key supplies URL-template variables |
Example#
import AppStoreFactory from './wire/StoreFactory';
const userForm = AppStoreFactory.getFormStore({}, {
query: '/user',
post: '/user',
get: '/user/{id}',
put: '/user/{id}',
delete: '/user/{id}',
}, 'id');
// create
const created = await userForm.post({ loginName: 'ada@example.com', firstName: 'Ada' });
// read → mutate → upsert (single round-trip decision on the server)
const existing = await userForm.get({ id: created.id });
await userForm.save({ ...existing, firstName: 'Ada L.' });
// explicit put for an update that must fail if the row is missing
await userForm.put({ id: created.id, status: 'ARCHIVED' });
// delete
await userForm.remove({ id: created.id });