blob: 5a2fce96d30fb3e502e271144fe8365fa975756a [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2020 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/switchMap';
import { of } from 'rxjs/observable/of';
import { Injectable } from '@angular/core';
import { catchError, map, switchMap } from 'rxjs/operators';
import { createEffect, ofType, Actions } from '@ngrx/effects';
import * as companyActions from '@shared/store/actions/company/company.action';
import { CompanyApiClient } from '@pages/company/company-api-client';
import { Company, CommunicationsData, Address } from '@shared/models';
import { Store } from '@ngrx/store';
import { State } from '@shared/store';
@Injectable()
export class CompanyEffect {
/**
* load external company details
*/
getCompany$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.loadCompanyDetail),
switchMap(action => {
return this._companyApiClient
.getCompanyDetails(action['payload'])
.map((company: Company) => companyActions.loadCompanyDetailSuccess({ payload: company }))
.catch(error => of(companyActions.loadCompanyDetailFail({ payload: error })));
})
)
);
/**
* Load company's addresses details
*/
getCompanyAddressDetails$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.loadCompanyDetailAddressDetails),
switchMap(action => {
return this._companyApiClient
.getAddressesDetails(action.payload_contactId, action.payload_addressId)
.map((companyAdressDetails: Address) =>
companyActions.loadCompanyDetailAddressDetailsSuccess({ payload: companyAdressDetails })
)
.catch(error =>
of(companyActions.loadCompanyDetailAddressDetailsFail({ payload: error }))
);
})
)
);
/**
* load company details Addresses
*/
getCompanyAddresses$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.loadCompanyDetailAddresses),
switchMap((action: any) => {
return this._companyApiClient
.getAddresses(action['payload']).pipe(
map((companyAddresses: Array<Address>) =>
companyActions.loadCompanyDetailAddressesSuccess({ payload: companyAddresses })
),
catchError(error =>
of(companyActions.loadCompanyDetailAddressesFail({ payload: error }))
)
);
})
)
);
/**
* persist new or edited company
*/
persistCompany$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.persistCompanyDetail),
map(action => action['payload']),
switchMap((companyDetails: Company) => {
return (companyDetails.contactId
? this._companyApiClient.putCompanyDetails(companyDetails.contactId, companyDetails)
: this._companyApiClient.postCompanyDetails(companyDetails)
).pipe(
map((company: Company) => {
return companyActions.persistCompanyDetailSuccess({ payload: company });
}),
catchError(error => of(companyActions.persistCompanyDetailFail({ payload: error })))
);
})
)
);
/**
* persist new or edited address
*/
persistAddress$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.persistAddressDetail),
map(action => action['payload']),
switchMap((address: Address) => {
return (address.id
? this._companyApiClient.putAddressDetails(address.contactId, address.id, address)
: this._companyApiClient.postAddressDetails(address.contactId, address)
).pipe(
map(() => {
this.store.dispatch(companyActions.loadCompanyDetailAddresses({ payload: address.contactId }));
return companyActions.persistAddressDetailSuccess({ payload: address });
}),
catchError(error => of(companyActions.persistAddressDetailFail({ payload: error })))
);
})
)
);
/**
* delete address
*/
deleteAddress$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.deleteAddress),
map((action) => action['payload']),
switchMap((address: Address) => {
return this._companyApiClient.deleteAddress(address.contactId, address.id).pipe(
map(() => {
this.store.dispatch(companyActions.loadCompanyDetailAddresses({ payload: address.contactId }));
return companyActions.deleteAddressSuccess();
}),
catchError(error => of(companyActions.deleteAddressFail({ payload: error })))
);
})
)
);
/**
* load internal company details communications data
*/
getCompanyCommunicationsData$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.loadCompanyDetailCommunicationsData),
switchMap((action: any) => {
return this._companyApiClient
.getCommunicationsData(action['payload']).pipe(
map((CompanyCommunicationsData: Array<CommunicationsData>) =>
companyActions.loadCompanyDetailCommunicationsDataSuccess({ payload: CompanyCommunicationsData })
),
catchError(error =>
of(companyActions.loadCompanyDetailCommunicationsDataFail({ payload: error }))
)
);
})
)
);
/**
* Load internal company's communications data details
*/
getCompanyCommunicationsDataDetails$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.loadCompanyDetailCommunicationsDataDetails),
switchMap(action => {
return this._companyApiClient
.getCommunicationsDataDetails(action.payload_contactId, action.payload_communicationsId)
.map((extcompanyCommunicationsDataDetails: CommunicationsData) =>
companyActions.loadCompanyDetailCommunicationsDataDetailsSuccess({ payload: extcompanyCommunicationsDataDetails })
)
.catch(error =>
of(companyActions.loadCompanyDetailCommunicationsDataDetailsFail({ payload: error }))
);
})
)
);
/**
* persist new or edited communications data
*/
persistCommunicationsData$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.persistCommunicationsDataDetail),
map(action => action['payload']),
switchMap((address: CommunicationsData) => {
return (address.id
? this._companyApiClient.putCommunicationsDataDetails(address.contactId, address.id, address)
: this._companyApiClient.postCommunicationsDataDetails(address.contactId, address)
).pipe(
map(() => {
this.store.dispatch(companyActions.loadCompanyDetailCommunicationsData({ payload: address.contactId }));
return companyActions.persistCommunicationsDataDetailSuccess({ payload: address });
}),
catchError(error => of(companyActions.persistCommunicationsDataDetailFail({ payload: error })))
);
})
)
);
/**
* delete communications data
*/
deleteCommunicationsData$: any = createEffect(() =>
this._actions$.pipe(
ofType(companyActions.deleteCommunicationsData),
map((action) => action['payload']),
switchMap((address: CommunicationsData) => {
return this._companyApiClient.deleteCommunicationsData(address.contactId, address.id).pipe(
map(() => {
this.store.dispatch(companyActions.loadCompanyDetailCommunicationsData({ payload: address.contactId }));
return companyActions.deleteCommunicationsDataSuccess();
}),
catchError(error => of(companyActions.deleteCommunicationsDataFail({ payload: error })))
);
})
)
);
constructor(private _actions$: Actions, private _companyApiClient: CompanyApiClient, private store: Store<State>) { }
}