import {Observable} from "rxjs"; import axios from "axios"; import config from "../config"; const HEADER_CONTENT_TYPE = 'Content-Type'; const HEADER_LANGUAGE = 'X-Language'; const HEADER_ACCEPT = 'Accept'; export default interface ApiService { get(query: string, url?: string): Observable; post(query: string, payload: any, url?: string): Observable; put(query: string, payload: any, url?: string): Observable; delete(query: string, url?: string): Observable; postFile(query: string, fileName: string, file: any, url?: string): Observable; downloadFile(query: string, payload: any, url?: string): Observable; } export class DefaultApiService implements ApiService { private baseUrl: string = config.api.serverUrl; private readonly DEFAULT_ERROR = {'origin': 'server', 'message': 'Server error'}; private static getLanguage(): string { return "de_DE"; } private prepareError(err: any): any { return err || this.DEFAULT_ERROR; } private static getOption(options: any, key: any, defaultValue: any): string { if (options) { if (Object.prototype.hasOwnProperty.call(options, key)) { return options[key]; } } return defaultValue; } protected getHeaders(options?: unknown): any { const headers: any = {}; const language = DefaultApiService.getLanguage(); if (language) { headers[HEADER_LANGUAGE] = language; } const value = DefaultApiService.getOption(options, HEADER_CONTENT_TYPE, 'application/json; charset=utf-8'); if (value) { headers[HEADER_CONTENT_TYPE] = value; } headers[HEADER_ACCEPT] = 'application/json'; return headers; } protected getUrl(query: string, url?: string) { return (url ? url : this.baseUrl) + query; } get(query: string, url?: string): Observable { return new Observable((observer) => { axios.get(this.getUrl(query, url), {headers: this.getHeaders()}) .then((response) => { observer.next(response.data); observer.complete(); }) .catch((error) => observer.error(this.prepareError(error))); }); } post(query: string, payload: any, url?: string): Observable { return new Observable((observer) => { axios.post(this.getUrl(query, url), payload, {headers: this.getHeaders()}) .then((response) => { observer.next(response.data); observer.complete(); }) .catch((error) => observer.error(this.prepareError(error))); }); } put(query: string, payload: any, url?: string): Observable { return new Observable((observer) => { axios.put(this.getUrl(query, url), payload, {headers: this.getHeaders()}) .then((response) => { observer.next(response.data); observer.complete(); }) .catch((error) => observer.error(this.prepareError(error))); }); } delete(query: string, url?: string): Observable { return new Observable((observer) => { axios.delete(this.getUrl(query, url), {headers: this.getHeaders()}) .then((response) => { observer.next(response.data); observer.complete(); }) .catch((error) => observer.error(this.prepareError(error))); }); } postFile(query: string, fileName: string, file: any, url?: string): Observable { const fd = new FormData(); fd.append("fileName", fileName); fd.append("file", file, fileName); return new Observable((observer) => { axios.post(this.getUrl(query, url), fd, {headers: this.getHeaders({[HEADER_CONTENT_TYPE]: undefined})}) .then((response) => { observer.next(response.data); observer.complete(); }) .catch((error) => observer.error(this.prepareError(error))); }); } downloadFile(query: string, payload: any, url?: string): Observable { return this.post(query, payload, url); // return new Observable((observer) => { // // axios.post(this.getUrl(query, url), payload, {responseType: 'blob', headers: this.getHeaders()}) // .then((response) => { // const disposition = response.headers['content-disposition']; // let filename = disposition.split(/;(.+)/)[1].split(/=(.+)/)[1]; // if (filename.toLowerCase().startsWith("utf-8''")) // filename = decodeURIComponent(filename.replace("utf-8''", '')); // else // filename = filename.replace(/['"]/g, ''); // return {filename, data: response.data}; // }).then((params: { filename: string, data: any }) => { // const url = window.URL.createObjectURL(params.data); // const a = document.createElement('a'); // a.href = url; // a.download = params.filename; // document.body.appendChild(a); // append the element to the dom // a.click(); // a.remove(); // afterwards, remove the element // observer.next(true as any); // observer.complete(); // }).catch((error) => observer.error(this.prepareError(error))); // }); } }