import {Injectable} from '@angular/core'; import {Rank} from '../../models/model-interfaces'; import {Observable} from 'rxjs/Observable'; import {ADD, EDIT, LOAD, REMOVE, Store} from '../stores/generic-store'; import {AppConfig} from '../../app.config'; import {HttpGateway, HttpMethod} from '../http-gateway'; import {HttpParams} from '@angular/common/http'; @Injectable() export class RankService { ranks$: Observable; rankStore = new Store(); constructor(private httpGateway: HttpGateway, private config: AppConfig) { this.ranks$ = this.rankStore.items$; } findRanks(query = '', fractionFilter?): Observable { let searchParams = new HttpParams().append('q', query); if (fractionFilter) { searchParams = searchParams.append('fractFilter', fractionFilter); } this.httpGateway.get(this.config.apiRankPath, searchParams) .do((ranks) => { this.rankStore.dispatch({type: LOAD, data: ranks}); }).subscribe(_ => { }); return this.ranks$; } getRank(id: number | string): Observable { return this.httpGateway.get(this.config.apiRankPath + id); } /** * For creating new data with POST or * update existing with patch PATCH */ submitRank(rank: Rank, imageFile?): Observable { let requestUrl = this.config.apiRankPath; let requestMethod: HttpMethod; let accessType; let body; if (rank._id) { requestUrl += rank._id; requestMethod = 'PATCH'; accessType = EDIT; } else { requestMethod = 'POST'; accessType = ADD; } if (imageFile) { body = new FormData(); Object.keys(rank).map((objectKey) => { if (rank[objectKey] !== undefined) { body.append(objectKey, rank[objectKey]); } }); body.append('image', imageFile, imageFile.name); } else { body = rank; } return this.httpGateway.request(requestUrl, body, requestMethod) .do(savedRank => { const action = {type: accessType, data: savedRank}; // leave some time to save image file before accessing it through list view setTimeout(() => { this.rankStore.dispatch(action); }, 300); }); } deleteRank(rank: Rank) { return this.httpGateway.delete(this.config.apiRankPath + rank._id) .do(res => { this.rankStore.dispatch({type: REMOVE, data: rank}); }); } }