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 });