Skip to content

Commit

Permalink
Replace StoreEndpoint with StoreRequestStateUpdater.
Browse files Browse the repository at this point in the history
  • Loading branch information
jurebajt committed Nov 27, 2018
1 parent ff6333f commit ed787db
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 58 deletions.
17 changes: 7 additions & 10 deletions src/app/core/user/services/user.endpoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,29 @@ import {HttpClient, HttpErrorResponse} from '@angular/common/http';
import {Observable, throwError} from 'rxjs';
import {map, catchError} from 'rxjs/operators';

import {StoreEndpoint} from '../../../shared/types/store-endpoint';
import {ApiResponse} from '../../../shared/types/api-response';
import {UserStore} from './user.store';
import {USER_CONFIG} from '../user.config';
import {User} from '../types/user';
import {StoreRequestStateUpdater} from '../../../shared/types/store-request-state-updater';

@Injectable()
export class UserEndpoint extends StoreEndpoint {
constructor(private http: HttpClient) {
super();
}
export class UserEndpoint {
constructor(private http: HttpClient) {}

getUser(store: UserStore): Observable<User> {
getUser(requestStateUpdater: StoreRequestStateUpdater): Observable<User> {
const request = USER_CONFIG.requests.getUser;
this.setRequestState(store, request, {
requestStateUpdater(request.name, {
inProgress: true,
});
return this.http.get<ApiResponse<User>>(request.url).pipe(
map(response => {
this.setRequestState(store, request, {
requestStateUpdater(request.name, {
inProgress: false,
});
return response.data as User;
}),
catchError((error: HttpErrorResponse) => {
this.setRequestState(store, request, {
requestStateUpdater(request.name, {
inProgress: false,
error: true,
});
Expand Down
8 changes: 7 additions & 1 deletion src/app/core/user/services/user.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,29 @@ import {map, tap} from 'rxjs/operators';
import {UserEndpoint} from './user.endpoint';
import {UserStoreState} from './user.store.state';
import {User} from '../types/user';
import {StoreRequestStateUpdater} from '../../../shared/types/store-request-state-updater';
import * as endpointHelpers from '../../../shared/helpers/endpoint.helpers';

@Injectable()
export class UserStore extends Store<UserStoreState> {
user$: Observable<User>;
private storeRequestStateUpdater: StoreRequestStateUpdater;

constructor(private endpoint: UserEndpoint) {
super(new UserStoreState());

this.user$ = this.state$.pipe(map(state => state.user));
this.storeRequestStateUpdater = endpointHelpers.getStoreRequestStateUpdater(
this
);
}

get user(): User {
return this.state.user;
}

loadUser(): Observable<User> {
return this.endpoint.getUser(this).pipe(
return this.endpoint.getUser(this.storeRequestStateUpdater).pipe(
tap((user: User) => {
this.handleGetUserResponse(user);
})
Expand Down
29 changes: 11 additions & 18 deletions src/app/features/coffee-list/services/coffee-list.endpoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,37 @@ import {HttpClient, HttpErrorResponse} from '@angular/common/http';
import {Observable, throwError} from 'rxjs';
import {map, catchError, delay} from 'rxjs/operators';

import {StoreEndpoint} from '../../../shared/types/store-endpoint';
import {ApiResponse} from '../../../shared/types/api-response';
import {CoffeeListStore} from './coffee-list.store';
import {COFFEE_LIST_CONFIG} from '../coffee-list.config';
import {Candidate} from '../types/candidate';
import * as endpointHelpers from '../../../shared/helpers/endpoint.helpers';
import * as sortHelpers from '../../../shared/helpers/sort.helpers';
import {RequestStateUpdater} from '../../../shared/types/request-state-updater';
import {StoreRequestStateUpdater} from '../../../shared/types/store-request-state-updater';
import {CustomRequestStateUpdater} from '../../../shared/types/custom-request-state-updater';
import {Sort} from '../../../shared/types/sort';
import {SortOrder} from '../../../app.constants';

@Injectable()
export class CoffeeListEndpoint extends StoreEndpoint {
constructor(private http: HttpClient) {
super();
}
export class CoffeeListEndpoint {
constructor(private http: HttpClient) {}

listCandidates(
store: CoffeeListStore,
sort: Sort
sort: Sort,
requestStateUpdater: StoreRequestStateUpdater
): Observable<Candidate[]> {
const request = COFFEE_LIST_CONFIG.requests.listCandidates;
const options = {
params: {
...sortHelpers.convertSortToRequestParams(sort),
},
};
this.setRequestState(store, request, {
inProgress: true,
});
requestStateUpdater(request.name, {inProgress: true});
return this.http
.get<ApiResponse<Candidate[]>>(request.url, options)
.pipe(
delay(2000), // Simulate request delay
map(response => {
this.setRequestState(store, request, {
inProgress: false,
});
requestStateUpdater(request.name, {inProgress: false});
// Simulate sorting on server
const candidates = response.data.sort(
(c1: Candidate, c2: Candidate): number => {
Expand All @@ -63,7 +56,7 @@ export class CoffeeListEndpoint extends StoreEndpoint {
return candidates;
}),
catchError((error: HttpErrorResponse) => {
this.setRequestState(store, request, {
requestStateUpdater(request.name, {
inProgress: false,
error: true,
});
Expand All @@ -74,7 +67,7 @@ export class CoffeeListEndpoint extends StoreEndpoint {

addVote(
candidate: Candidate,
requestStateUpdater: RequestStateUpdater
requestStateUpdater: CustomRequestStateUpdater
): Observable<null> {
const url = endpointHelpers.getUrlWithParams(
COFFEE_LIST_CONFIG.requests.addVote.url,
Expand All @@ -98,7 +91,7 @@ export class CoffeeListEndpoint extends StoreEndpoint {

removeVote(
candidate: Candidate,
requestStateUpdater: RequestStateUpdater
requestStateUpdater: CustomRequestStateUpdater
): Observable<null> {
const url = endpointHelpers.getUrlWithParams(
COFFEE_LIST_CONFIG.requests.removeVote.url,
Expand Down
15 changes: 11 additions & 4 deletions src/app/features/coffee-list/services/coffee-list.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import * as candidateHelpers from '../helpers/candidate.helpers';
import {UserStore} from '../../../core/user/services/user.store';
import {User} from '../../../core/user/types/user';
import {UserAction} from '../coffee-list.constants';
import {RequestStateUpdater} from '../../../shared/types/request-state-updater';
import * as endpointHelpers from '../../../shared/helpers/endpoint.helpers';
import {StoreRequestStateUpdater} from '../../../shared/types/store-request-state-updater';
import {CustomRequestStateUpdater} from '../../../shared/types/custom-request-state-updater';
import {Sort} from '../../../shared/types/sort';

@Injectable()
Expand All @@ -20,6 +22,7 @@ export class CoffeeListStore extends Store<CoffeeListStoreState>
private ngUnsubscribe$: Subject<undefined> = new Subject();
private reloadCandidates$: Subject<undefined> = new Subject();
private detailsModal: ModalComponent;
private storeRequestStateUpdater: StoreRequestStateUpdater;

constructor(
private endpoint: CoffeeListEndpoint,
Expand All @@ -31,6 +34,10 @@ export class CoffeeListStore extends Store<CoffeeListStoreState>
init(): void {
this.initReloadCandidates$();
this.subscribeToUserUpdates();

this.storeRequestStateUpdater = endpointHelpers.getStoreRequestStateUpdater(
this
);
}

ngOnDestroy(): void {
Expand Down Expand Up @@ -102,8 +109,8 @@ export class CoffeeListStore extends Store<CoffeeListStoreState>
.pipe(
switchMap(() => {
return this.endpoint.listCandidates(
this,
this.state.candidateList.sort
this.state.candidateList.sort,
this.storeRequestStateUpdater
);
}),
tap(candidates => {
Expand Down Expand Up @@ -141,7 +148,7 @@ export class CoffeeListStore extends Store<CoffeeListStoreState>

private getUpdateCandidateRequestStateUpdater(
candidate: Candidate
): RequestStateUpdater {
): CustomRequestStateUpdater {
return requestState => {
this.setState({
...this.state,
Expand Down
16 changes: 16 additions & 0 deletions src/app/shared/helpers/endpoint.helpers.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import {StoreRequestStateUpdater} from '../types/store-request-state-updater';

export function getUrlWithParams(
url: string,
params: {[key: string]: any}
Expand All @@ -8,3 +10,17 @@ export function getUrlWithParams(
});
return url;
}

export function getStoreRequestStateUpdater(
store: any,
): StoreRequestStateUpdater {
return (requestName, requestState) => {
store.setState({
...store.state,
requests: {
...store.state.requests,
[requestName]: requestState,
},
});
};
}
3 changes: 3 additions & 0 deletions src/app/shared/types/custom-request-state-updater.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import {RequestState} from './request-state';

export type CustomRequestStateUpdater = (requestState: RequestState) => void;
5 changes: 0 additions & 5 deletions src/app/shared/types/request-state-updater.ts

This file was deleted.

20 changes: 0 additions & 20 deletions src/app/shared/types/store-endpoint.ts

This file was deleted.

6 changes: 6 additions & 0 deletions src/app/shared/types/store-request-state-updater.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import {RequestState} from './request-state';

export type StoreRequestStateUpdater = (
requestName: string,
requestState: RequestState
) => void;

0 comments on commit ed787db

Please sign in to comment.