import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {Message} from '../../../../common/entities/Message'; import {SlimLoadingBarService} from 'ng2-slim-loading-bar'; import 'rxjs/Rx'; import {ErrorCodes, ErrorDTO} from '../../../../common/entities/Error'; @Injectable() export class NetworkService { _baseUrl = '/api'; private globalErrorHandlers: Array<(error: ErrorDTO) => boolean> = []; constructor(private _http: HttpClient, private slimLoadingBarService: SlimLoadingBarService) { } public postJson(url: string, data: any = {}): Promise { return this.callJson('post', url, data); } public putJson(url: string, data: any = {}): Promise { return this.callJson('put', url, data); } public getJson(url: string, data?: { [key: string]: any }): Promise { if (data) { const keys = Object.getOwnPropertyNames(data); if (keys.length > 0) { url += '?'; for (let i = 0; i < keys.length; i++) { url += keys[i] + '=' + data[keys[i]]; if (i < keys.length - 1) { url += '&'; } } } } return this.callJson('get', url); } public deleteJson(url: string): Promise { return this.callJson('delete', url); } private callJson(method: 'get' | 'post' | 'delete' | 'put', url: string, data: any = {}): Promise { const body = data; this.slimLoadingBarService.visible = true; this.slimLoadingBarService.start(() => { this.slimLoadingBarService.visible = false; }); const process = (res: Message): T => { this.slimLoadingBarService.complete(); if (!!res.error) { if (res.error.code) { res.error['title'] = ErrorCodes[res.error.code]; } throw res.error; } return res.result; }; const err = (error) => { this.slimLoadingBarService.complete(); return this.handleError(error); }; switch (method) { case 'get': return this._http.get>(this._baseUrl + url) .toPromise() .then(process) .catch(err); case 'delete': return this._http.delete>(this._baseUrl + url) .toPromise() .then(process) .catch(err); case 'post': return this._http.post>(this._baseUrl + url, body) .toPromise() .then(process) .catch(err); case 'put': return this._http.put>(this._baseUrl + url, body) .toPromise() .then(process) .catch(err); default: throw new Error('Unknown method'); } } private handleError(error: any) { if (typeof error.code !== 'undefined') { for (let i = 0; i < this.globalErrorHandlers.length; i++) { if (this.globalErrorHandlers[i](error) === true) { return; } } return Promise.reject(error); } // instead of just logging it to the console console.error('error:', error); return Promise.reject(error.message || error || 'Server error'); } addGlobalErrorHandler(fn: (error: ErrorDTO) => boolean) { this.globalErrorHandlers.push(fn); } }