import { ObjectsActionParams, ObjectsActionSpec } from './ObjectsActionSpec'; export type ObjectsActionCallback = (params: ObjectsActionParams) => Promise; export class ObjectsActionContext { allActions: ObjectsActionSpec[] = []; wfRules: ObjectsActionSpec[] = []; callbacks: Record = {}; startWorkflow?: ObjectsActionCallback; constructor(public params: Omit) { } get actions(): ObjectsActionSpec[] { const isInCollection = !!this.params.selection?.collectionId; if (isInCollection) { return this.allActions.filter(action => action.id !== 'addToCollection' && action.id !== 'delete' ); } else { return this.allActions.filter(action => action.id !== 'removeFromCollection' && action.id !== 'deleteFromCollections' ); } } registerCallback(name: string, cb: (params: ObjectsActionParams) => Promise) { this.callbacks[name] = cb; return () => { delete this.callbacks[name]; } } unregisterCallback(name: string) { delete this.callbacks[name]; } findAction(actionId: string) { let action = this.allActions.find(a => a.id === actionId); if (!action) { action = this.wfRules.find(a => a.id === actionId); } return action; } async run(actionId: string): Promise { const action = this.findAction(actionId); if (!action) { throw new Error(`Action ${actionId} not found`); } const params = { ...this.params, action }; const cb = this.callbacks[actionId]; if (cb) { return cb(params); } else { throw new Error("No action callback set"); } } }