1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/frontend/app/model/network/network.service.ts

151 lines
4.6 KiB
TypeScript
Raw Normal View History

2018-03-31 03:30:30 +08:00
import {Injectable} from '@angular/core';
import {HttpClient, HttpResponse} from '@angular/common/http';
2018-03-31 03:30:30 +08:00
import {Message} from '../../../../common/entities/Message';
import {SlimLoadingBarService} from 'ng2-slim-loading-bar';
import {ErrorCodes, ErrorDTO} from '../../../../common/entities/Error';
import {Config} from '../../../../common/config/public/Config';
import {Utils} from '../../../../common/Utils';
import {CostumHeaders} from '../../../../common/CostumHeaders';
import {VersionService} from '../version.service';
2016-03-13 05:19:24 +08:00
2016-05-05 03:08:05 +08:00
@Injectable()
2016-05-09 23:04:56 +08:00
export class NetworkService {
2016-03-13 05:19:24 +08:00
_apiBaseUrl = Utils.concatUrls(Config.Client.urlBase, '/api');
private globalErrorHandlers: Array<(error: ErrorDTO) => boolean> = [];
2016-03-13 05:19:24 +08:00
2018-03-31 03:30:30 +08:00
constructor(private _http: HttpClient,
private slimLoadingBarService: SlimLoadingBarService,
private versionService: VersionService) {
}
2016-03-13 05:19:24 +08:00
public static buildUrl(url: string, data?: { [key: string]: any }) {
2018-03-31 03:30:30 +08:00
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 url;
}
2018-11-26 07:26:29 +08:00
public getXML<T>(url: string): Promise<Document> {
this.slimLoadingBarService.visible = true;
this.slimLoadingBarService.start(() => {
this.slimLoadingBarService.visible = false;
});
const process = (res: string): Document => {
this.slimLoadingBarService.complete();
const parser = new DOMParser();
return parser.parseFromString(res, 'text/xml');
};
2018-11-29 06:49:33 +08:00
const err = (error: any) => {
2018-11-26 07:26:29 +08:00
this.slimLoadingBarService.complete();
return this.handleError(error);
};
return this._http.get(this._apiBaseUrl + url, {responseType: 'text'})
.toPromise()
.then(process)
.catch(err);
}
public postJson<T>(url: string, data: any = {}): Promise<T> {
return this.callJson('post', url, data);
}
public putJson<T>(url: string, data: any = {}): Promise<T> {
return this.callJson('put', url, data);
}
public getJson<T>(url: string, data?: { [key: string]: any }): Promise<T> {
return this.callJson('get', NetworkService.buildUrl(url, data));
2018-03-31 03:30:30 +08:00
}
public deleteJson<T>(url: string): Promise<T> {
return this.callJson('delete', url);
}
addGlobalErrorHandler(fn: (error: ErrorDTO) => boolean) {
this.globalErrorHandlers.push(fn);
}
2018-03-31 03:30:30 +08:00
private callJson<T>(method: 'get' | 'post' | 'delete' | 'put', url: string, data: any = {}): Promise<T> {
const body = data;
2016-03-13 18:28:29 +08:00
2017-06-22 03:16:04 +08:00
this.slimLoadingBarService.visible = true;
this.slimLoadingBarService.start(() => {
this.slimLoadingBarService.visible = false;
});
const process = (res: HttpResponse<Message<T>>): T => {
2017-06-22 03:16:04 +08:00
this.slimLoadingBarService.complete();
const msg = res.body;
if (res.headers.has(CostumHeaders.dataVersion)) {
this.versionService.onNewVersion(res.headers.get(CostumHeaders.dataVersion));
}
if (!!msg.error) {
if (msg.error.code) {
(<any>msg.error)['title'] = ErrorCodes[msg.error.code];
2017-07-04 01:17:49 +08:00
}
throw msg.error;
2017-07-04 01:17:49 +08:00
}
return msg.result;
2017-06-22 03:16:04 +08:00
};
const err = (error: any) => {
2017-06-22 03:16:04 +08:00
this.slimLoadingBarService.complete();
2018-03-31 03:30:30 +08:00
return this.handleError(error);
2017-06-22 03:16:04 +08:00
};
2018-03-31 03:30:30 +08:00
switch (method) {
case 'get':
return this._http.get<Message<T>>(this._apiBaseUrl + url, {observe: 'response'})
2018-03-31 03:30:30 +08:00
.toPromise()
.then(process)
.catch(err);
case 'delete':
return this._http.delete<Message<T>>(this._apiBaseUrl + url, {observe: 'response'})
2018-03-31 03:30:30 +08:00
.toPromise()
.then(process)
.catch(err);
case 'post':
return this._http.post<Message<T>>(this._apiBaseUrl + url, body, {observe: 'response'})
2018-03-31 03:30:30 +08:00
.toPromise()
.then(process)
.catch(err);
case 'put':
return this._http.put<Message<T>>(this._apiBaseUrl + url, body, {observe: 'response'})
2018-03-31 03:30:30 +08:00
.toPromise()
.then(process)
.catch(err);
default:
throw new Error('Unknown method');
}
2016-05-09 23:04:56 +08:00
}
private handleError(error: any) {
2018-03-31 03:30:30 +08:00
if (typeof error.code !== 'undefined') {
for (let i = 0; i < this.globalErrorHandlers.length; i++) {
2018-03-31 03:30:30 +08:00
if (this.globalErrorHandlers[i](error) === true) {
return;
}
}
2017-07-13 00:31:19 +08:00
return Promise.reject(error);
}
// instead of just logging it to the console
2018-03-31 03:30:30 +08:00
console.error('error:', error);
2017-07-04 01:17:49 +08:00
return Promise.reject(error.message || error || 'Server error');
}
2016-03-13 05:19:24 +08:00
}