Ontica/Empiria.Land.Intranet

View on GitHub
src/app/presentation/land/recordable-subjects.presentation.handler.ts

Summary

Maintainability
C
1 day
Test Coverage
/**
 * @license
 * Copyright (c) La Vía Óntica SC, Ontica LLC and contributors. All rights reserved.
 *
 * See LICENSE.txt in the project root for complete license information.
 */

import { Injectable } from '@angular/core';

import { Assertion, Cache, EmpObservable } from '@app/core';

import { AbstractPresentationHandler, StateValues } from '@app/core/presentation/presentation.handler';

import { EmptyRecordSearchData, EmptyTractIndex, IssuersFilter } from '@app/models';

import { RecordableSubjectsDataService } from '@app/data-services';


export enum ActionType {
  SET_RECORD_SEARCH_DATA = 'Land.RecordableSubjects.Action.SetRecordSearchData',
}


export enum SelectorType {
  AMENDABLE_RECORDING_ACTS        = 'Land.RecordableSubjects.Selector.AmendableRecordingActs.List',
  ASSOCIATION_KIND_LIST           = 'Land.RecordableSubjects.Selector.AssociationKind.List',
  INSTRUMENT_KIND_LIST            = 'Land.RecordableSubjects.Selector.InstrumentKind.List',
  INSTRUMENT_TYPE_ISSUERS_LIST    = 'Land.RecordableSubjects.Selector.InstrumentTypeIssuers.List',
  NO_PROPERTY_KIND_LIST           = 'Land.RecordableSubjects.Selector.NoPropertyKind.List',
  RECORDER_OFFICE_LIST            = 'Land.RecordableSubjects.Selector.RecorderOffice.List',
  REAL_ESTATE_KIND_LIST           = 'Land.RecordableSubjects.Selector.RealEstateKind.List',
  REAL_ESTATE_PARTITION_KIND_LIST = 'Land.RecordableSubjects.Selector.RealEstatePartitionKind.List',
  REAL_ESTATE_LOT_SIZE_UNIT_LIST  = 'Land.RecordableSubjects.Selector.RealEstateLoteSizeUnit.List',
  RECORDING_BOOKS_LIST            = 'Land.RecordableSubjects.Selector.RecordingBooks.List',
  RECORDING_BOOK_ENTRIES_LIST     = 'Land.RecordableSubjects.Selector.RecordingBookEntries.List',
  RECORD_SEARCH_DATA              = 'Land.RecordableSubjects.Selector.RecordSearch.Data',
  TRACT_INDEX                     = 'Land.RecordableSubjects.Selector.TractIndex',
}


const initialState: StateValues = [
  { key: SelectorType.AMENDABLE_RECORDING_ACTS, value: EmptyTractIndex },
  { key: SelectorType.ASSOCIATION_KIND_LIST, value: [] },
  { key: SelectorType.INSTRUMENT_KIND_LIST, value: new Cache<string[]>() },
  { key: SelectorType.NO_PROPERTY_KIND_LIST, value: [] },
  { key: SelectorType.REAL_ESTATE_KIND_LIST, value: [] },
  { key: SelectorType.REAL_ESTATE_PARTITION_KIND_LIST, value: [] },
  { key: SelectorType.REAL_ESTATE_LOT_SIZE_UNIT_LIST, value: [] },
  { key: SelectorType.RECORDER_OFFICE_LIST, value: [] },
  { key: SelectorType.RECORD_SEARCH_DATA, value: EmptyRecordSearchData },
];


@Injectable()
export class RecordableSubjectsPresentationHandler extends AbstractPresentationHandler {

  constructor(private data: RecordableSubjectsDataService) {
    super({
      initialState,
      selectors: SelectorType,
      actions: ActionType,
    });
  }


  select<U>(selectorType: SelectorType, params?: any): EmpObservable<U> {
    let provider: () => any;

    switch (selectorType) {

      case SelectorType.AMENDABLE_RECORDING_ACTS:
        Assertion.assertValue(params.query, 'params.query');

        return this.data.getAmendableRecordingActs(params.query) as EmpObservable<U>;


      case SelectorType.ASSOCIATION_KIND_LIST:
        provider = () => this.data.getAssociationKinds();

        return super.selectFirst<U>(selectorType, provider);


      case SelectorType.INSTRUMENT_KIND_LIST:
        Assertion.assertValue(params, 'params');

        const instrumentType = params;

        const dataProvider = () => this.data.getInstrumentKinds(instrumentType);

        return super.selectMemoized(selectorType, dataProvider, instrumentType, []);


      case SelectorType.INSTRUMENT_TYPE_ISSUERS_LIST:
        Assertion.assertValue(params.instrumentType, 'params.instrumentType');

        return this.data.findInstrumentTypeIssuers(params as IssuersFilter) as EmpObservable<U>;


      case SelectorType.NO_PROPERTY_KIND_LIST:
        provider = () => this.data.getNoPropertyKinds();

        return super.selectFirst<U>(selectorType, provider);


      case SelectorType.REAL_ESTATE_KIND_LIST:
        provider = () => this.data.getRealEstateKinds();

        return super.selectFirst<U>(selectorType, provider);


      case SelectorType.REAL_ESTATE_PARTITION_KIND_LIST:
        provider = () => this.data.getRealEstatePartitionKinds();

        return super.selectFirst<U>(selectorType, provider);


      case SelectorType.REAL_ESTATE_LOT_SIZE_UNIT_LIST:
        provider = () => this.data.getRealEstateLotSizeUnits();

        return super.selectFirst<U>(selectorType, provider);


      case SelectorType.RECORDER_OFFICE_LIST:
        provider = () => this.data.getRecorderOffices();

        return super.selectFirst<U>(selectorType, provider);

      case SelectorType.RECORDING_BOOKS_LIST:
        Assertion.assertValue(params.recorderOfficeUID, 'params.recorderOfficeUID');
        Assertion.assertValue(params.recordingSectionUID, 'params.recordingSectionUID');
        Assertion.assertValue(params.keywords, 'params.keywords');

        return this.data.getRecordingBooks(params.recorderOfficeUID,
                                           params.recordingSectionUID,
                                           params.keywords) as EmpObservable<U>;

      case SelectorType.RECORDING_BOOK_ENTRIES_LIST:
        Assertion.assertValue(params.recordingBookUID, 'params.recordingBookUID');

        return this.data.getRecordingBookEntries(params.recordingBookUID) as EmpObservable<U>;

      case SelectorType.TRACT_INDEX:
        Assertion.assertValue(params.recordableSubjectUID, 'params.recordableSubjectUID');

        return this.data.getFullTractIndex(params.recordableSubjectUID) as EmpObservable<U>;

      default:
        return super.select<U>(selectorType, params);

    }
  }


  dispatch(actionType: ActionType, params?: any): void {
    switch (actionType) {

      case ActionType.SET_RECORD_SEARCH_DATA:
        Assertion.assertValue(params.recordSearchData, 'payload.recordSearchData');

        const recordSearchData = params.recordSearchData || this.getValue(SelectorType.RECORD_SEARCH_DATA);

        this.setValue(SelectorType.RECORD_SEARCH_DATA, recordSearchData);

        return;

      default:
        throw this.unhandledCommandOrActionType(actionType);
    }
  }

}