Skip to content

Commit 887c839

Browse files
authored
feat(category): combine all metadata effects (#3294)
1 parent cf4d2f7 commit 887c839

5 files changed

+72
-163
lines changed

libs/category/state/src/category-state.module.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { StoreModule } from '@ngrx/store';
44

55
import { DaffProductStateModule } from '@daffodil/product/state';
66

7-
import { DaffCategoryPageFilterEffects } from './effects/category-page-filter.effects';
7+
import { DaffCategoryPageMetadataEffects } from './effects/category-page-metadata.effects';
88
import { DaffCategoryPageEffects } from './effects/category-page.effects';
99
import { DaffCategoryEffects } from './effects/category.effects';
1010
import { DAFF_CATEGORY_STORE_FEATURE_KEY } from './reducers/public_api';
@@ -16,7 +16,7 @@ import { DAFF_CATEGORY_REDUCERS } from './reducers/token/reducers.token';
1616
@NgModule({
1717
imports: [
1818
StoreModule.forFeature(DAFF_CATEGORY_STORE_FEATURE_KEY, DAFF_CATEGORY_REDUCERS),
19-
EffectsModule.forFeature([DaffCategoryEffects, DaffCategoryPageEffects, DaffCategoryPageFilterEffects]),
19+
EffectsModule.forFeature([DaffCategoryEffects, DaffCategoryPageEffects, DaffCategoryPageMetadataEffects]),
2020
DaffProductStateModule,
2121
],
2222
})

libs/category/state/src/effects/category-page-filter.effects.spec.ts libs/category/state/src/effects/category-page-metadata.effects.spec.ts

+58-8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ import {
2626
DaffCategoryPageApplyFilters,
2727
DaffCategoryPageClearFilters,
2828
DaffCategoryPageRemoveFilters,
29+
DaffCategoryPageChangePageSize,
30+
DaffCategoryPageChangeCurrentPage,
31+
DaffCategoryPageChangeSortingOption,
2932
} from '@daffodil/category/state';
3033
import {
3134
DaffCategoryStateTestingModule,
@@ -42,6 +45,7 @@ import {
4245
DaffFilterRequest,
4346
daffFiltersToRequests,
4447
DaffFilterToggleRequest,
48+
DaffSortDirectionEnum,
4549
} from '@daffodil/core';
4650
import { daffTransformErrorToStateError } from '@daffodil/core/state';
4751
import { MockDaffCollectionFacade } from '@daffodil/core/state/testing';
@@ -54,7 +58,7 @@ import { DaffProduct } from '@daffodil/product';
5458
import { DaffProductGridLoadSuccess } from '@daffodil/product/state';
5559
import { DaffProductFactory } from '@daffodil/product/testing';
5660

57-
import { DaffCategoryPageFilterEffects } from './category-page-filter.effects';
61+
import { DaffCategoryPageMetadataEffects } from './category-page-metadata.effects';
5862

5963
class MockError extends DaffInheritableError implements DaffError {
6064
code = 'code';
@@ -64,9 +68,9 @@ class MockError extends DaffInheritableError implements DaffError {
6468
}
6569
}
6670

67-
describe('DaffCategoryPageFilterEffects', () => {
71+
describe('DaffCategoryPageMetadataEffects', () => {
6872
let actions$: Observable<any>;
69-
let effects: DaffCategoryPageFilterEffects<DaffCategory, DaffProduct>;
73+
let effects: DaffCategoryPageMetadataEffects<DaffCategory, DaffProduct>;
7074
let daffCategoryDriver: DaffCategoryServiceInterface;
7175
let facade: MockDaffCollectionFacade;
7276

@@ -112,7 +116,7 @@ describe('DaffCategoryPageFilterEffects', () => {
112116
};
113117

114118
expectObservable(
115-
effects.updateFilters$(300, testScheduler),
119+
effects.update$(300, testScheduler),
116120
).toBe(expectedMarble, expectedValue);
117121
});
118122

@@ -162,7 +166,7 @@ describe('DaffCategoryPageFilterEffects', () => {
162166
};
163167

164168
expectObservable(
165-
effects.updateFilters$(0, testScheduler),
169+
effects.update$(0, testScheduler),
166170
).toBe(expectedMarble, expectedValue);
167171
});
168172

@@ -205,7 +209,7 @@ describe('DaffCategoryPageFilterEffects', () => {
205209
};
206210

207211
expectObservable(
208-
effects.updateFilters$(0, testScheduler),
212+
effects.update$(0, testScheduler),
209213
).toBe(expectedMarble, expectedValue);
210214
});
211215

@@ -229,14 +233,14 @@ describe('DaffCategoryPageFilterEffects', () => {
229233
DaffCategoryStateTestingModule,
230234
],
231235
providers: [
232-
DaffCategoryPageFilterEffects,
236+
DaffCategoryPageMetadataEffects,
233237
provideMockActions(() => actions$),
234238
],
235239
});
236240

237241
facade = TestBed.inject(MockDaffCollectionFacade);
238242
daffCategoryDriver = TestBed.inject<DaffCategoryServiceInterface>(DaffCategoryDriver);
239-
effects = TestBed.inject(DaffCategoryPageFilterEffects);
243+
effects = TestBed.inject(DaffCategoryPageMetadataEffects);
240244

241245
categoryFactory = TestBed.inject(DaffCategoryFactory);
242246
categoryPageMetadataFactory = TestBed.inject(DaffCategoryPageMetadataFactory);
@@ -332,4 +336,50 @@ describe('DaffCategoryPageFilterEffects', () => {
332336
testDriverFailure(() => action);
333337
});
334338
});
339+
340+
describe('when CategoryPageChangePageSizeAction is triggered', () => {
341+
let action: Action;
342+
343+
beforeEach(() => {
344+
action = new DaffCategoryPageChangePageSize(5);
345+
});
346+
347+
describe('driver behavior', () => {
348+
testDriverSuccess(() => action);
349+
testDriverFailure(() => action);
350+
});
351+
});
352+
353+
describe('when CategoryPageChangeCurrentPageAction is triggered', () => {
354+
let toggleRequest: DaffFilterToggleRequest;
355+
let action: Action;
356+
357+
beforeEach(() => {
358+
toggleRequest = filterToggleRequestFactory.create();
359+
action = new DaffCategoryPageChangeCurrentPage(2);
360+
});
361+
362+
describe('driver behavior', () => {
363+
testDriverSuccess(() => action);
364+
testDriverFailure(() => action);
365+
});
366+
});
367+
368+
describe('when CategoryPageChangeSortingOptionAction is triggered', () => {
369+
let toggleRequest: DaffFilterToggleRequest;
370+
let action: Action;
371+
372+
beforeEach(() => {
373+
toggleRequest = filterToggleRequestFactory.create();
374+
action = new DaffCategoryPageChangeSortingOption({
375+
option: 'option',
376+
direction: DaffSortDirectionEnum.Ascending,
377+
});
378+
});
379+
380+
describe('driver behavior', () => {
381+
testDriverSuccess(() => action);
382+
testDriverFailure(() => action);
383+
});
384+
});
335385
});

libs/category/state/src/effects/category-page-filter.effects.ts libs/category/state/src/effects/category-page-metadata.effects.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import { DaffCategoryProductCollectionFacade } from '../facades/public_api';
5252
import { DAFF_CATEGORY_ERROR_MATCHER } from '../injection-tokens/public_api';
5353

5454
@Injectable()
55-
export class DaffCategoryPageFilterEffects<
55+
export class DaffCategoryPageMetadataEffects<
5656
V extends DaffGenericCategory<V>,
5757
W extends DaffProduct
5858
> {
@@ -73,7 +73,7 @@ export class DaffCategoryPageFilterEffects<
7373
* in a sequence.
7474
*/
7575

76-
updateFilters$: (throttleWindow: number, scheduler: AsyncScheduler) => Observable<
76+
update$: (throttleWindow: number, scheduler: AsyncScheduler) => Observable<
7777
DaffProductGridLoadSuccess
7878
| DaffCategoryPageLoadSuccess
7979
| DaffCategoryPageLoadFailure
@@ -85,6 +85,9 @@ export class DaffCategoryPageFilterEffects<
8585
DaffCategoryPageProductCollectionActionTypes.CategoryPageClearFiltersAction,
8686
DaffCategoryPageProductCollectionActionTypes.CategoryPageRemoveFiltersAction,
8787
DaffCategoryPageProductCollectionActionTypes.CategoryPageToggleFilterAction,
88+
DaffCategoryPageProductCollectionActionTypes.CategoryPageChangeSizeAction,
89+
DaffCategoryPageProductCollectionActionTypes.CategoryPageChangeCurrentPageAction,
90+
DaffCategoryPageProductCollectionActionTypes.CategoryPageChangeSortingOptionAction,
8891
),
8992
withLatestFrom(this.facade.metadata$),
9093
map((

libs/category/state/src/effects/category-page.effects.spec.ts

-76
Original file line numberDiff line numberDiff line change
@@ -299,80 +299,4 @@ describe('DaffCategoryPageEffects', () => {
299299
expect(daffCategoryDriver.getByUrl).toHaveBeenCalledWith(categoryRequest);
300300
});
301301
});
302-
303-
describe('when ChangeCategoryPageSize action is triggered', () => {
304-
305-
let expected;
306-
307-
it('should call get category with an id, page size, applied filters, and an applied sort option', () => {
308-
driverGetSpy.and.returnValue(of({
309-
category: stubCategory,
310-
categoryPageMetadata: stubcategoryPageMetadata,
311-
products: stubProducts,
312-
}));
313-
const changeCategoryPageSizeAction = new DaffCategoryPageChangePageSize(3);
314-
actions$ = hot('--a', { a: changeCategoryPageSizeAction });
315-
316-
expected = cold('--(ab)', { a: productGridLoadSuccessAction, b: categoryLoadSuccessAction });
317-
expect(effects.changeCategoryPageSize$).toBeObservable(expected);
318-
expect(daffCategoryDriver.get).toHaveBeenCalledWith({
319-
...stubcategoryPageMetadata,
320-
kind: DaffCategoryRequestKind.ID,
321-
pageSize: 3,
322-
filterRequests: daffFiltersToRequests(stubcategoryPageMetadata.filters),
323-
});
324-
});
325-
});
326-
327-
describe('when ChangeCategoryCurrentPage action is triggered', () => {
328-
329-
let expected;
330-
331-
it('should call get category with every available parameter', () => {
332-
driverGetSpy.and.returnValue(of({
333-
category: stubCategory,
334-
categoryPageMetadata: stubcategoryPageMetadata,
335-
products: stubProducts,
336-
}));
337-
const changeCategoryCurrentPageAction = new DaffCategoryPageChangeCurrentPage(3);
338-
actions$ = hot('--a', { a: changeCategoryCurrentPageAction });
339-
340-
expected = cold('--(ab)', { a: productGridLoadSuccessAction, b: categoryLoadSuccessAction });
341-
expect(effects.changeCategoryCurrentPage$).toBeObservable(expected);
342-
expect(daffCategoryDriver.get).toHaveBeenCalledWith({
343-
...stubcategoryPageMetadata,
344-
kind: DaffCategoryRequestKind.ID,
345-
currentPage: 3,
346-
filterRequests: daffFiltersToRequests(stubcategoryPageMetadata.filters),
347-
});
348-
});
349-
});
350-
351-
describe('when ChangeCategorySortAction is triggered', () => {
352-
353-
let expected;
354-
355-
it('should call get category with an id, page size, applied filters, and an applied sorting option', () => {
356-
driverGetSpy.and.returnValue(of({
357-
category: stubCategory,
358-
categoryPageMetadata: stubcategoryPageMetadata,
359-
products: stubProducts,
360-
}));
361-
const changeCategorySortingOption = new DaffCategoryPageChangeSortingOption({
362-
option: 'option',
363-
direction: DaffSortDirectionEnum.Ascending,
364-
});
365-
actions$ = hot('--a', { a: changeCategorySortingOption });
366-
367-
expected = cold('--(ab)', { a: productGridLoadSuccessAction, b: categoryLoadSuccessAction });
368-
expect(effects.changeCategorySort$).toBeObservable(expected);
369-
expect(daffCategoryDriver.get).toHaveBeenCalledWith({
370-
...stubcategoryPageMetadata,
371-
kind: DaffCategoryRequestKind.ID,
372-
appliedSortDirection: DaffSortDirectionEnum.Ascending,
373-
appliedSortOption: 'option',
374-
filterRequests: daffFiltersToRequests(stubcategoryPageMetadata.filters),
375-
});
376-
});
377-
});
378302
});

libs/category/state/src/effects/category-page.effects.ts

+7-75
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,28 @@ import {
77
createEffect,
88
ofType,
99
} from '@ngrx/effects';
10-
import {
11-
Store,
12-
select,
13-
} from '@ngrx/store';
1410
import {
1511
of,
1612
Observable,
1713
} from 'rxjs';
1814
import {
1915
switchMap,
2016
catchError,
21-
withLatestFrom,
2217
} from 'rxjs/operators';
2318

2419
import {
2520
DaffGenericCategory,
2621
DaffGetCategoryResponse,
27-
DaffCategoryRequestKind,
28-
DaffCategoryIdRequest,
29-
DaffCategoryPageMetadata,
3022
} from '@daffodil/category';
3123
import {
3224
DaffCategoryDriver,
3325
DaffCategoryServiceInterface,
3426
} from '@daffodil/category/driver';
35-
import {
36-
DaffError,
37-
daffFiltersToRequests,
38-
} from '@daffodil/core';
27+
import { DaffError } from '@daffodil/core';
3928
import { ErrorTransformer } from '@daffodil/core/state';
4029
import { DaffProduct } from '@daffodil/product';
4130
import { DaffProductGridLoadSuccess } from '@daffodil/product/state';
4231

43-
import {
44-
DaffCategoryPageChangeCurrentPage,
45-
DaffCategoryPageChangePageSize,
46-
DaffCategoryPageChangeSortingOption,
47-
DaffCategoryPageProductCollectionActionTypes,
48-
} from '../actions/category-page-filter.actions';
4932
import {
5033
DaffCategoryPageLoadSuccess,
5134
DaffCategoryPageLoad,
@@ -54,7 +37,6 @@ import {
5437
DaffCategoryPageLoadByUrl,
5538
} from '../actions/category-page.actions';
5639
import { DAFF_CATEGORY_ERROR_MATCHER } from '../injection-tokens/public_api';
57-
import { getDaffCategorySelectors } from '../selectors/category.selector';
5840

5941
@Injectable()
6042
export class DaffCategoryPageEffects<
@@ -65,20 +47,11 @@ export class DaffCategoryPageEffects<
6547
private actions$: Actions,
6648
@Inject(DaffCategoryDriver) private driver: DaffCategoryServiceInterface<V, W>,
6749
@Inject(DAFF_CATEGORY_ERROR_MATCHER) private errorMatcher: ErrorTransformer,
68-
private store: Store<any>,
6950
) {}
7051

71-
private categorySelectors = getDaffCategorySelectors<V, W>();
72-
7352
loadCategoryPage$: Observable<any> = createEffect(() => this.actions$.pipe(
7453
ofType(DaffCategoryPageActionTypes.CategoryPageLoadAction),
75-
switchMap((action: DaffCategoryPageLoad) => this.processCategoryGetRequest(action.request)),
76-
));
77-
78-
79-
loadCategoryPageByUrl$: Observable<any> = createEffect(() => this.actions$.pipe(
80-
ofType(DaffCategoryPageActionTypes.CategoryPageLoadByUrlAction),
81-
switchMap((action: DaffCategoryPageLoadByUrl) => this.driver.getByUrl(action.request).pipe(
54+
switchMap((action: DaffCategoryPageLoad) => this.driver.get(action.request).pipe(
8255
switchMap((resp: DaffGetCategoryResponse<V, W>) => [
8356
new DaffProductGridLoadSuccess(resp.products),
8457
new DaffCategoryPageLoadSuccess(resp),
@@ -88,55 +61,14 @@ export class DaffCategoryPageEffects<
8861
));
8962

9063

91-
changeCategoryPageSize$: Observable<any> = createEffect(() => this.actions$.pipe(
92-
ofType(DaffCategoryPageProductCollectionActionTypes.CategoryPageChangeSizeAction),
93-
withLatestFrom(
94-
this.store.pipe(select(this.categorySelectors.selectCollectionMetadata)),
95-
),
96-
switchMap(([action, metadata]: [DaffCategoryPageChangePageSize, DaffCategoryPageMetadata]) => this.processCategoryGetRequest({
97-
...metadata,
98-
kind: DaffCategoryRequestKind.ID,
99-
filterRequests: daffFiltersToRequests(metadata.filters),
100-
pageSize: action.pageSize,
101-
})),
102-
));
103-
104-
105-
changeCategoryCurrentPage$: Observable<any> = createEffect(() => this.actions$.pipe(
106-
ofType(DaffCategoryPageProductCollectionActionTypes.CategoryPageChangeCurrentPageAction),
107-
withLatestFrom(
108-
this.store.pipe(select(this.categorySelectors.selectCollectionMetadata)),
109-
),
110-
switchMap(([action, metadata]: [DaffCategoryPageChangeCurrentPage, DaffCategoryPageMetadata]) => this.processCategoryGetRequest({
111-
...metadata,
112-
kind: DaffCategoryRequestKind.ID,
113-
filterRequests: daffFiltersToRequests(metadata.filters),
114-
currentPage: action.currentPage,
115-
})),
116-
));
117-
118-
119-
changeCategorySort$: Observable<any> = createEffect(() => this.actions$.pipe(
120-
ofType(DaffCategoryPageProductCollectionActionTypes.CategoryPageChangeSortingOptionAction),
121-
withLatestFrom(
122-
this.store.pipe(select(this.categorySelectors.selectCollectionMetadata)),
123-
),
124-
switchMap(([action, metadata]: [DaffCategoryPageChangeSortingOption, DaffCategoryPageMetadata]) => this.processCategoryGetRequest({
125-
...metadata,
126-
kind: DaffCategoryRequestKind.ID,
127-
filterRequests: daffFiltersToRequests(metadata.filters),
128-
appliedSortOption: action.sort.option,
129-
appliedSortDirection: action.sort.direction,
130-
})),
131-
));
132-
133-
private processCategoryGetRequest(payload: DaffCategoryIdRequest) {
134-
return this.driver.get(payload).pipe(
64+
loadCategoryPageByUrl$: Observable<any> = createEffect(() => this.actions$.pipe(
65+
ofType(DaffCategoryPageActionTypes.CategoryPageLoadByUrlAction),
66+
switchMap((action: DaffCategoryPageLoadByUrl) => this.driver.getByUrl(action.request).pipe(
13567
switchMap((resp: DaffGetCategoryResponse<V, W>) => [
13668
new DaffProductGridLoadSuccess(resp.products),
13769
new DaffCategoryPageLoadSuccess(resp),
13870
]),
13971
catchError((error: DaffError) => of(new DaffCategoryPageLoadFailure(this.errorMatcher(error)))),
140-
);
141-
}
72+
)),
73+
));
14274
}

0 commit comments

Comments
 (0)