import { ErrorAction } from './action.types'; export enum EntityActions { beginInsert = 'entity.beginInsert', commitInsert = 'entity.commitInsert', insertResult = 'entity.insertResult', update = 'entity.update', updating = 'entity.updating', updated = 'entity.updated', delete = 'entity.delete', deleting = 'entity.deleting', deleted = 'entity.deleted', fetch = 'entity.fetch', fetching = 'entity.fetching', fetched = 'entity.fetched', query = 'entity.query', querying = 'entity.querying', queried = 'entity.queried', selectAll = 'entity.selectAll', select = 'entity.select' } //tslint:disable:no-reserved-keywords export interface BaseEntity extends ErrorAction { target: TN; asyncKey?: Symbol; } export interface BeginInsert extends BaseEntity { type: EntityActions.beginInsert; entity: T; } export interface CommitInsert extends BaseEntity { type: EntityActions.commitInsert; entity: T; } export interface InsertResult extends BaseEntity { type: EntityActions.insertResult; entity: T; } export interface UpdateEntity extends BaseEntity { type: EntityActions.update; entity: T; } export interface DeleteEntity extends BaseEntity { type: EntityActions.delete; entity: T; } export interface FetchEntity extends BaseEntity { type: EntityActions.fetch; id: string; } export interface FetchResult extends BaseEntity { type: EntityActions.fetched; id: string; entity: T; } export interface QueryEntities extends BaseEntity { type: EntityActions.query; query: string; continuationToken?: string; skip?: number; take?: number; } export interface QueryResult extends BaseEntity { type: EntityActions.queried; items: T[]; hasMore: boolean; prevToken?: string; continuationToken?: string; } export interface SelectEntity extends BaseEntity { type: EntityActions.select; entity: T; select: boolean; } export interface SelectAll extends BaseEntity { type: EntityActions.selectAll; select: boolean; } export type EntityAction = QueryEntities | QueryResult | FetchEntity | FetchResult | SelectEntity | SelectAll; export const beginQuery = (target: TN, query: string, asyncKey: Symbol, skip?: number, take?: number): QueryEntities => ({ type: EntityActions.query, target, query, asyncKey, skip, take }); export const beginUpdate = (target: TN, entity: T, asyncKey: Symbol): UpdateEntity => ({ type: EntityActions.update, target, entity, asyncKey }); export const beginDelete = (target: TN, entity: T, asyncKey: Symbol): DeleteEntity => ({ type: EntityActions.delete, target, entity, asyncKey }); export const queryResult = (target: TN, items: T[]): QueryResult => ({ type: EntityActions.queried, items, target, hasMore: items && items.length > 0 }); export const beginInsert = (target: TN, entity: T): BeginInsert => ({ type: EntityActions.beginInsert, target, entity }); export const selectEntity = (target: TN, entity: T, select: boolean): SelectEntity => ({ type: EntityActions.select, target, entity, select }); export const selectAll = (target: TN, select: boolean): SelectAll => ({ type: EntityActions.selectAll, target, select });