Skip to content

Commit

Permalink
feat: punchout oci configuration store version one
Browse files Browse the repository at this point in the history
  • Loading branch information
DilaraGueler committed May 10, 2023
1 parent 47a1acd commit 6b39dcd
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 46 deletions.
17 changes: 17 additions & 0 deletions src/app/extensions/punchout/facades/punchout.facade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@ import { HttpError } from 'ish-core/models/http-error/http-error.model';
import { selectRouteParam } from 'ish-core/store/core/router';
import { whenTruthy } from 'ish-core/utils/operators';

import { OciConfigurationItem } from '../models/oci-configuration/oci-configuration.model';
import { PunchoutType, PunchoutUser } from '../models/punchout-user/punchout-user.model';
import {
getOciConfigurationError,
getOciConfigurationLoading,
loadOciConfiguration,
updateOciConfiguration,
} from '../store/oci-configuration';
import { transferPunchoutBasket } from '../store/punchout-functions';
import { getPunchoutTypes, getPunchoutTypesError, getPunchoutTypesLoading } from '../store/punchout-types';
import {
Expand All @@ -28,10 +35,12 @@ export class PunchoutFacade {
punchoutLoading$ = combineLatest([
this.store.pipe(select(getPunchoutLoading)),
this.store.pipe(select(getPunchoutTypesLoading)),
this.store.pipe(select(getOciConfigurationLoading)),
]).pipe(map(([loading, typesLoading]) => loading || (typesLoading as boolean)));

punchoutError$ = this.store.pipe(select(getPunchoutError));
punchoutTypesError$: Observable<HttpError> = this.store.pipe(select(getPunchoutTypesError));
ociConfigurationError$ = this.store.pipe(select(getOciConfigurationError));

supportedPunchoutTypes$: Observable<PunchoutType[]> = this.store.pipe(select(getPunchoutTypes));

Expand Down Expand Up @@ -68,4 +77,12 @@ export class PunchoutFacade {
transferBasket() {
this.store.dispatch(transferPunchoutBasket());
}

loadOciConfiguration() {
this.store.dispatch(loadOciConfiguration());
}

updateOciConfiguration(ociConfiguration: OciConfigurationItem[]) {
this.store.dispatch(updateOciConfiguration({ ociConfiguration }));
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
export interface OciConfiguration {
name: string;
export interface OciConfigurationItem {
type: string;
field: string;
transform: string;
formatter: string;
mappings: [
mappings?: [
{
name: string;
type: string;
mapFromValue: string;
mapToValue: string;
}
Expand Down
39 changes: 19 additions & 20 deletions src/app/extensions/punchout/services/punchout/punchout.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { DomService } from 'ish-core/utils/dom/dom.service';
import { whenTruthy } from 'ish-core/utils/operators';
import { encodeResourceID } from 'ish-core/utils/url-resource-ids';

import { OciConfiguration } from '../../models/oci-configuration/oci-configuration.model';
import { OciConfigurationItem } from '../../models/oci-configuration/oci-configuration.model';
import { PunchoutSession } from '../../models/punchout-session/punchout-session.model';
import { PunchoutType, PunchoutUser } from '../../models/punchout-user/punchout-user.model';

Expand Down Expand Up @@ -63,49 +63,48 @@ export class PunchoutService {
}

/**
* Gets the list of oci configurations.
* Gets the list of oci configuration items.
*
* @returns An array of punchout oci configurations.
* @returns An array of punchout oci configuration items.
*/
getOciConfigurations(): Observable<OciConfiguration[]> {
getOciConfiguration(): Observable<OciConfigurationItem[]> {
return this.currentCustomer$.pipe(
switchMap(customer =>
this.apiService
.get<{ data: OciConfiguration[] }>(
.get<{ items: OciConfigurationItem[] }>(
`customers/${customer.customerNo}/punchouts/${this.getResourceType('oci')}/configurations`,
{
headers: this.punchoutHeaders,
}
)
.pipe(map(data => data.data))
.pipe(map(data => data.items))
)
);
}

//TODO: Update method will be replaced with Silke's method.
/**
* Updates a punchout oci configuration.
*
* @param ociConfiguration The ociConfiguration for the oci configuration update.
* @param ociConfigurationItem[] The list of ociConfigurationItem for the oci configuration update.
* @returns The updated oci configuration.
*/
updateOciConfiguration(ociConfiguration: OciConfiguration): Observable<OciConfiguration> {
updateOciConfiguration(ociConfiguration: OciConfigurationItem[]): Observable<OciConfigurationItem> {
if (!ociConfiguration) {
return throwError(() => new Error('updateOciConfiguration() called without required OciConfiguration'));
}

return this.currentCustomer$.pipe(
switchMap(
customer =>
this.apiService
.put<{ data: OciConfiguration }>(
`customers/${customer.customerNo}/punchouts/${this.getResourceType('oci')}/configurations`,
ociConfiguration,
{
headers: this.punchoutHeaders,
}
)
.pipe(map(data => data.data))
// .pipe(map(OciConfigurationMapper.fromData)) TO DO: mapper will be created
switchMap(customer =>
this.apiService
.put<{ data: OciConfigurationItem }>(
`customers/${customer.customerNo}/punchouts/${this.getResourceType('oci')}/configurations`,
ociConfiguration,
{
headers: this.punchoutHeaders,
}
)
.pipe(map(data => data.data))
)
);
}
Expand Down
3 changes: 3 additions & 0 deletions src/app/extensions/punchout/store/oci-configuration/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// API to access ngrx OciConfiguration state
export * from './oci-configuration.actions';
export * from './oci-configuration.selectors';
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@ import { createAction } from '@ngrx/store';

import { httpError, payload } from 'ish-core/utils/ngrx-creators';

import { OciConfiguration } from '../../models/oci-configuration/oci-configuration.model';
import { OciConfigurationItem } from '../../models/oci-configuration/oci-configuration.model';

export const loadOciConfigurations = createAction('[Punchout] Load Oci Configurations');
export const loadOciConfiguration = createAction('[Punchout] Load Oci Configuration');

export const loadOciConfigurationsFail = createAction('[Punchout API] Load Oci Configurations Fail', httpError());
export const loadOciConfigurationFail = createAction('[Punchout API] Load Oci Configuration Fail', httpError());

export const loadOciConfigurationsSuccess = createAction(
'[Punchout API] Load Oci Configurations Success',
payload<{ ociConfigurations: OciConfiguration[] }>()
export const loadOciConfigurationSuccess = createAction(
'[Punchout API] Load Oci Configuration Success',
payload<{ ociConfiguration: OciConfigurationItem[] }>()
);

export const updateOciConfiguration = createAction(
'[Punchout] Update Oci Configurations',
payload<{ ociConfiguration: OciConfiguration }>()
'[Punchout] Update Oci Configuration',
payload<{ ociConfiguration: OciConfigurationItem[] }>()
);

export const updateOciConfigurationFail = createAction('[Punchout API] Update Oci Configurations Fail', httpError());
export const updateOciConfigurationFail = createAction('[Punchout API] Update Oci Configuration Fail', httpError());

export const updateOciConfigurationSuccess = createAction(
'[Punchout API] Update Oci Configurations Success',
payload<{ ociConfiguration: OciConfiguration }>()
'[Punchout API] Update Oci Configuration Success',
payload<{ ociConfiguration: OciConfigurationItem[] }>()
);
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,31 @@ import { mapErrorToAction, mapToPayloadProperty } from 'ish-core/utils/operators
import { PunchoutService } from '../../services/punchout/punchout.service';

import {
loadOciConfigurations,
loadOciConfigurationsFail,
loadOciConfigurationsSuccess,
loadOciConfiguration,
loadOciConfigurationFail,
loadOciConfigurationSuccess,
updateOciConfiguration,
updateOciConfigurationFail,
updateOciConfigurationSuccess,
} from './oci-configuration.actions';

@Injectable()
export class OciConfigurationsEffects {
export class OciConfigurationEffects {
constructor(private actions$: Actions, private punchoutService: PunchoutService) {}

loadOciConfigurations$ = createEffect(() =>
loadOciConfiguration$ = createEffect(() =>
this.actions$.pipe(
ofType(loadOciConfigurations),
ofType(loadOciConfiguration),
concatMap(() =>
this.punchoutService.getOciConfigurations().pipe(
map(ociConfigurations => loadOciConfigurationsSuccess({ ociConfigurations })),
mapErrorToAction(loadOciConfigurationsFail)
this.punchoutService.getOciConfiguration().pipe(
map(ociConfiguration => loadOciConfigurationSuccess({ ociConfiguration })),
mapErrorToAction(loadOciConfigurationFail)
)
)
)
);

//TODO: The update function should be replaced with Silke's method.
updateOciConfiguration$ = createEffect(() =>
this.actions$.pipe(
ofType(updateOciConfiguration),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { EntityState, createEntityAdapter } from '@ngrx/entity';
import { createReducer } from '@ngrx/store';
import { on } from 'events';

import { HttpError } from 'ish-core/models/http-error/http-error.model';
import { setErrorOn, setLoadingOn, unsetLoadingAndErrorOn } from 'ish-core/utils/ngrx-creators';

import { OciConfigurationItem } from '../../models/oci-configuration/oci-configuration.model';

import {
loadOciConfiguration,
loadOciConfigurationFail,
loadOciConfigurationSuccess,
updateOciConfiguration,
updateOciConfigurationFail,
updateOciConfigurationSuccess,
} from './oci-configuration.actions';

export const ociConfigurationAdapter = createEntityAdapter<OciConfigurationItem>();

export interface OciConfigurationState extends EntityState<OciConfigurationItem> {
loading: boolean;
error: HttpError;
}

const initialState: OciConfigurationState = ociConfigurationAdapter.getInitialState({
loading: false,
error: undefined,
});

export const ociConfigurationReducer = createReducer(
initialState,
setLoadingOn(loadOciConfiguration, updateOciConfiguration),
unsetLoadingAndErrorOn(loadOciConfigurationSuccess, updateOciConfigurationSuccess),
setErrorOn(loadOciConfigurationFail, updateOciConfigurationFail),
//TODO: The on function will be fixed
on(loadOciConfigurationSuccess, updateOciConfigurationSuccess, (state, action) =>
ociConfigurationAdapter.upsertMany(action.payload.OciConfiguration, state)
)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { createSelector } from '@ngrx/store';

import { getPunchoutState } from '../punchout-store';

const getOciConfigurationState = createSelector(getPunchoutState, state => state.ociConfiguration);

export const getOciConfigurationLoading = createSelector(getOciConfigurationState, state => state.loading);

export const getOciConfigurationError = createSelector(getOciConfigurationState, state => state.error);
5 changes: 4 additions & 1 deletion src/app/extensions/punchout/store/punchout-store.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { pick } from 'lodash-es';

import { resetOnLogoutMeta } from 'ish-core/utils/meta-reducers';

import { OciConfigurationEffects } from './oci-configuration/oci-configuration.effects';
import { ociConfigurationReducer } from './oci-configuration/oci-configuration.reducer';
import { PunchoutFunctionsEffects } from './punchout-functions/punchout-functions.effects';
import { PunchoutState } from './punchout-store';
import { PunchoutTypesEffects } from './punchout-types/punchout-types.effects';
Expand All @@ -13,11 +15,12 @@ import { PunchoutUsersEffects } from './punchout-users/punchout-users.effects';
import { punchoutUsersReducer } from './punchout-users/punchout-users.reducer';

const punchoutReducers: ActionReducerMap<PunchoutState> = {
ociConfiguration: ociConfigurationReducer,
punchoutUsers: punchoutUsersReducer,
punchoutTypes: punchoutTypesReducer,
};

const punchoutEffects = [PunchoutUsersEffects, PunchoutFunctionsEffects, PunchoutTypesEffects];
const punchoutEffects = [OciConfigurationEffects, PunchoutUsersEffects, PunchoutFunctionsEffects, PunchoutTypesEffects];

@Injectable()
export class PunchoutStoreConfig implements StoreConfig<PunchoutState> {
Expand Down
2 changes: 2 additions & 0 deletions src/app/extensions/punchout/store/punchout-store.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { createFeatureSelector } from '@ngrx/store';

import { OciConfigurationState } from './oci-configuration/oci-configuration.reducer';
import { PunchoutTypesState } from './punchout-types/punchout-types.reducer';
import { PunchoutUsersState } from './punchout-users/punchout-users.reducer';

export interface PunchoutState {
ociConfiguration: OciConfigurationState;
punchoutUsers: PunchoutUsersState;
punchoutTypes: PunchoutTypesState;
}
Expand Down

0 comments on commit 6b39dcd

Please sign in to comment.