Skip to content
Snippets Groups Projects
actions.ts 5.18 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
     * Ministerpräsidenten des Landes Schleswig-Holstein
     * Staatskanzlei
     * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
     *
     * Lizenziert unter der EUPL, Version 1.2 oder - sobald
     * diese von der Europäischen Kommission genehmigt wurden -
     * Folgeversionen der EUPL ("Lizenz");
     * Sie dürfen dieses Werk ausschließlich gemäß
     * dieser Lizenz nutzen.
     * Eine Kopie der Lizenz finden Sie hier:
     *
     * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
     *
     * Sofern nicht durch anwendbare Rechtsvorschriften
     * gefordert oder in schriftlicher Form vereinbart, wird
     * die unter der Lizenz verbreitete Software "so wie sie
     * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
     * ausdrücklich oder stillschweigend - verbreitet.
     * Die sprachspezifischen Genehmigungen und Beschränkungen
     * unter der Lizenz sind dem Lizenztext zu entnehmen.
     */
    
    import { Action, ActionCreator, createAction, props } from '@ngrx/store';
    
    import { TypedAction } from '@ngrx/store/src/models';
    
    import { Resource, ResourceUri } from '@ngxp/rest';
    
    import { SaveResourceData, StateInfo } from '../resource/resource.model';
    
    import { ApiError, HttpError } from '../tech.model';
    
    export const EMPTY_ACTION: Action = {} as Action;
    
    
    export interface TypedActionCreatorWithProps<T>
      extends ActionCreator<string, (props: T) => T & TypedAction<string>> {}
    export interface TypedActionCreator extends ActionCreator<string, () => TypedAction<string>> {}
    
    export interface ApiErrorAction {
      //TODO rename ApiErrorProps
      apiError: ApiError;
    
    }
    
    export interface ResourceUriProps {
    
      resourceUri: ResourceUri;
    }
    
    //TODO rename ResourceSuccessProps
    
    export interface LoadResourceSuccessProps {
      resource: Resource;
    }
    
    export interface LoadResourceFailureProps {
      error: HttpError;
    }
    export interface ResourceActions {
      loadAction: TypedActionCreatorWithProps<ResourceUriProps>;
      loadFailureAction: TypedActionCreatorWithProps<LoadResourceFailureProps>;
      clearAction: TypedActionCreator;
      reloadAction: TypedActionCreator;
    }
    
    export interface SingleResourceLoadActions extends ResourceActions {
      loadSuccessAction: TypedActionCreatorWithProps<LoadResourceSuccessProps>;
    }
    
    
    export interface SaveProps {
      saveResourceData: SaveResourceData;
    }
    export interface ApiSingleResourceActions extends SingleResourceLoadActions {
      saveAction: TypedActionCreatorWithProps<SaveProps>;
      saveSuccessAction: TypedActionCreatorWithProps<LoadResourceSuccessProps>;
      saveFailureAction: TypedActionCreatorWithProps<LoadResourceFailureProps>;
    }
    
    export function createApiSingleResourceActions(stateInfo: StateInfo): ApiSingleResourceActions {
      const actions: SingleResourceLoadActions = createSingleResourceActions(stateInfo);
      return {
        ...actions,
        saveAction: createSaveAction(stateInfo),
        saveSuccessAction: createSaveSuccessAction(stateInfo),
        saveFailureAction: createSaveFailureAction(stateInfo),
      };
    }
    
    function createSaveAction(stateInfo: StateInfo): TypedActionCreatorWithProps<SaveProps> {
      return createAction(
        createActionType(stateInfo.name, `Save ${stateInfo.path}`),
        props<SaveProps>(),
      );
    }
    
    function createSaveSuccessAction(
      stateInfo: StateInfo,
    ): TypedActionCreatorWithProps<LoadResourceSuccessProps> {
      return createAction(
        createActionType(stateInfo.name, `Save ${stateInfo.path} Success`),
        props<LoadResourceSuccessProps>(),
      );
    }
    
    function createSaveFailureAction(
      stateInfo: StateInfo,
    ): TypedActionCreatorWithProps<LoadResourceFailureProps> {
      return createAction(
        createActionType(stateInfo.name, `Save ${stateInfo.path} Failure`),
        props<LoadResourceFailureProps>(),
      );
    }
    
    
    export function createSingleResourceActions(stateInfo: StateInfo): SingleResourceLoadActions {
      const actions: ResourceActions = createResourceActions(
        stateInfo.name,
        `${stateInfo.path} Resource`,
      );
      return { ...actions, loadSuccessAction: createLoadSuccessAction(stateInfo) };
    }
    
    export interface SingleResourceLoadActions extends ResourceActions {
      loadSuccessAction: TypedActionCreatorWithProps<LoadResourceSuccessProps>;
    }
    
    function createLoadSuccessAction(
      stateInfo: StateInfo,
    ): TypedActionCreatorWithProps<LoadResourceSuccessProps> {
      return createAction(
        createActionType(stateInfo.name, `Load ${stateInfo.path} Resource Success`),
        props<LoadResourceSuccessProps>(),
      );
    }
    
    function createResourceActions(stateName: string, message: string): ResourceActions {
      const loadAction: TypedActionCreatorWithProps<ResourceUriProps> = createAction(
        createActionType(stateName, `Load ${message}`),
        props<ResourceUriProps>(),
      );
      const loadFailureAction: TypedActionCreatorWithProps<LoadResourceFailureProps> = createAction(
        createActionType(stateName, `Load ${message} Failure`),
        props<LoadResourceFailureProps>(),
      );
      const clearAction: TypedActionCreator = createAction(
        createActionType(stateName, `Clear ${message}`),
      );
      const reloadAction: TypedActionCreator = createAction(
        createActionType(stateName, `Reload ${message}`),
      );
      return { loadAction, loadFailureAction, clearAction, reloadAction };
    }
    
    function createActionType(stateName: string, message: string): string {
      return `[${stateName}] ${message}`;
    }