import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpEventType } from '@angular/common/http'; import { environment } from '../../environments/environment'; import { SessionService } from './session'; @Injectable() export class HttpWrapperService { private displayReturn:boolean = false; constructor(private http: HttpClient, private session: SessionService) { } createRESTCall(api: string, inputOptions?: any) { let basePage = environment.apiUrl; let addressServerRest = `${basePage }/`; let options = inputOptions; if(options === undefined) { options = []; } let out = addressServerRest + api; let first = true; for(let iii = 0; iii < options.length; iii++) { if(first === false) { out = `${out }&`; } else { out = `${out }?`; first = false; } out = out + options[iii]; } return out; } addTokenIfNeeded(headerOption:any): any { if(this.session.sessionData !== null) { if(headerOption.authorization === undefined) { headerOption.authorization = `Yota ${ this.session.sessionData.userId }:${ this.session.sessionData.token}`; } } return headerOption; } get(uriRest:string, headerOption:any, params:any) { this.addTokenIfNeeded(headerOption); let connectionAdresse = this.createRESTCall(uriRest, {}); let config = { params: params, headers: new HttpHeaders(headerOption) }; return new Promise((resolve, reject) => { if(this.displayReturn === true) { console.log(`call GET ${ connectionAdresse } params=${ JSON.stringify(params, null, 2)}`); } let request = this.http.get(connectionAdresse, config); let self = this; request.subscribe((res: any) => { if(self.displayReturn === true) { console.log(`!! data ${ JSON.stringify(res, null, 2)}`); } if(res) { if(res.httpCode) { resolve({ status:res.httpCode, data:res }); } else { resolve({ status:200, data:res }); } } else { resolve({ status:200, data:'' }); } }, (error) => { if(self.displayReturn === true) { console.log(`an error occured status: ${ error.status}`); console.log(`answer: ${ JSON.stringify(error, null, 2)}`); } reject({ status:error.status, data:error.error }); }); }); } post(uriRest:string, headerOption:any, data:any, progress:any = null) { this.addTokenIfNeeded(headerOption); let connectionAdresse = this.createRESTCall(uriRest, {}); return new Promise((resolve, reject) => { if(this.displayReturn === true) { console.log(`call POST ${ connectionAdresse } data=${ JSON.stringify(data, null, 2)}`); } let request = this.http.post(connectionAdresse, data, { headers: new HttpHeaders(headerOption), reportProgress: true, observe: 'events' }); let self = this; request.subscribe((res: any) => { if(self.displayReturn === true) { console.log(`!! data ${ JSON.stringify(res, null, 2)}`); } if(res.type === HttpEventType.Sent) { /* res.type === 0 */ console.log('post : Sent'); } else if(res.type === HttpEventType.UploadProgress) { /* res.type === 1 */ // console.log("post : " + res.loaded + " / " + res.total); progress(res.loaded, res.total); } else if(res.type === HttpEventType.ResponseHeader) { /* res.type === 2 */ console.log('post : get header'); } else if(res.type === HttpEventType.DownloadProgress) { /* res.type === 3 */ console.log(`post : get DownloadProgress ${ res.loaded}`); } else if(res.type === HttpEventType.Response) { /* res.type === 4 */ console.log('post : get response'); if(res.httpCode) { resolve({ status:res.httpCode, data:res }); } else { resolve({ status:200, data:res }); } } else if(res.type === HttpEventType.User) { /* res.type === 5 */ console.log('post : get User'); } else { console.log(`post : get unknown ... ${ res.type}`); } }, (error) => { if(self.displayReturn === true) { console.log(`an error occured status: ${ error.status}`); console.log(`answer: ${ JSON.stringify(error, null, 2)}`); } reject({ status:error.status, data:error.error }); }); /* switch (event.type) { case HttpEventType.UploadProgress: const progress = Math.round(100 * event.loaded / event.total); return { status: 'progress', message: progress }; case HttpEventType.Response: return event.body; default: return `Unhandled event: ${event.type}`; } }) ); */ }); } put(uriRest:string, headerOption:any, data:any) { this.addTokenIfNeeded(headerOption); let connectionAdresse = this.createRESTCall(uriRest, {}); const httpOption = { headers: new HttpHeaders(headerOption) }; return new Promise((resolve, reject) => { if(this.displayReturn === true) { console.log(`call POST ${ connectionAdresse } data=${ JSON.stringify(data, null, 2)}`); } let request = this.http.put(connectionAdresse, data, httpOption); let self = this; request.subscribe((res: any) => { if(self.displayReturn === true) { console.log(`!! data ${ JSON.stringify(res, null, 2)}`); } if(res) { if(res.httpCode) { resolve({ status:res.httpCode, data:res }); } else { resolve({ status:200, data:res }); } } else { resolve({ status:200, data:'' }); } }, (error) => { if(self.displayReturn === true) { console.log(`an error occured status: ${ error.status}`); console.log(`answer: ${ JSON.stringify(error, null, 2)}`); } reject({ status:error.status, data:error.error }); }); }); } delete(uriRest:string, headerOption:any) { this.addTokenIfNeeded(headerOption); let connectionAdresse = this.createRESTCall(uriRest, {}); const httpOption = { headers: new HttpHeaders(headerOption) }; return new Promise((resolve, reject) => { if(this.displayReturn === true) { console.log(`call POST ${ connectionAdresse}`); } let request = this.http.delete(connectionAdresse, httpOption); let self = this; request.subscribe((res: any) => { if(self.displayReturn === true) { console.log(`!! data ${ JSON.stringify(res, null, 2)}`); } if(res) { if(res.httpCode) { resolve({ status:res.httpCode, data:res }); } else { resolve({ status:200, data:res }); } } else { resolve({ status:200, data:'' }); } }, (error) => { if(self.displayReturn === true) { console.log(`an error occured status: ${ error.status}`); console.log(`answer: ${ JSON.stringify(error, null, 2)}`); } reject({ status:error.status, data:error.error }); }); }); } uploadFileMultipart(base:string, id:number, file:File): any { console.log(`Upload file to ${ base}`); let url = base; if(id !== null) { url = `${url }/${ id}`; } let formData = new FormData(); formData.append('upload', file); let headers = new Headers(); console.log(`upload filename : ${ file.name}`); let extention = file.name.split('.').pop(); if(extention === 'jpg') { headers.append('Content-Type', 'image/jpeg'); } else if(extention === 'png') { headers.append('Content-Type', 'image/png'); } else if(extention === 'mkv') { headers.append('Content-Type', 'video/x-matroska'); } else if(extention === 'webm') { headers.append('Content-Type', 'video/webm'); } else { return null; } headers.append('filename', file.name); const httpOption = { headers: headers, reportProgress: true, }; return new Promise((resolve, reject) => { this.post(url, httpOption, formData) .then((response: any) => { console.log(`URL: ${ url }\nRespond(${ response.status }): ${ JSON.stringify(response.data, null, 2)}`); if(response.status === 200) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject(`return ERROR ${ JSON.stringify(response.data, null, 2)}`); } }); }); } uploadFileBase64(base:string, id:number, file:File): any { console.log(`Upload file to ${ base}`); let url = base; if(id !== null) { url = `${url }/${ id}`; } let self = this; let reader = new FileReader(); reader.readAsArrayBuffer(file); return new Promise((resolve, reject) => { reader.onload = () => { let headers:any = {};// new Headers(); console.log(`upload filename : ${ file.name}`); let extention = file.name.split('.').pop(); if(extention === 'jpg') { // headers.append('Content-Type', "image/jpeg"); headers['Content-Type'] = 'image/jpeg'; headers['mime-type'] = 'image/jpeg'; } else if(extention === 'jpeg') { // headers.append('Content-Type', "image/jpeg"); headers['Content-Type'] = 'image/jpeg'; headers['mime-type'] = 'image/jpeg'; } else if(extention === 'webp') { // headers.append('Content-Type', "image/webp"); headers['Content-Type'] = 'image/webp'; headers['mime-type'] = 'image/webp'; } else if(extention === 'png') { // headers.append('Content-Type', "image/png"); headers['Content-Type'] = 'image/png'; headers['mime-type'] = 'image/png'; } else if(extention === 'mkv') { headers['Content-Type'] = 'video/x-matroska'; headers['mime-type'] = 'video/x-matroska'; } else if(extention === 'webm') { headers['Content-Type'] = 'video/webm'; headers['mime-type'] = 'video/webm'; } else { return null; } // headers.append('filename', file.name); headers.filename = file.name; self.post(url, headers, reader.result) .then((response: any) => { console.log(`URL: ${ url }\nRespond(${ response.status }): ${ JSON.stringify(response.data, null, 2)}`); if(response.status === 200) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject('return ERROR ...');// + JSON.stringify(response, null, 2)); } }); }; }); } uploadFile(base:string, file:File): any { console.log(`Upload file to ${ base}`); let url = base; let self = this; let reader = new FileReader(); reader.readAsArrayBuffer(file); return new Promise((resolve, reject) => { reader.onload = () => { let headers: any = {};// new Headers(); console.log(`upload filename : ${ file.name}`); let extention = file.name.split('.').pop(); if(extention === 'jpg') { // headers.append('Content-Type', "image/jpeg"); headers['Content-Type'] = 'image/jpeg'; headers['mime-type'] = 'image/jpeg'; } else if(extention === 'jpeg') { // headers.append('Content-Type', "image/jpeg"); headers['Content-Type'] = 'image/jpeg'; headers['mime-type'] = 'image/jpeg'; } else if(extention === 'webp') { // headers.append('Content-Type', "image/webp"); headers['Content-Type'] = 'image/webp'; headers['mime-type'] = 'image/webp'; } else if(extention === 'png') { // headers.append('Content-Type', "image/png"); headers['Content-Type'] = 'image/png'; headers['mime-type'] = 'image/png'; } else if(extention === 'mkv') { headers['Content-Type'] = 'video/x-matroska'; headers['mime-type'] = 'video/x-matroska'; } else if(extention === 'webm') { headers['Content-Type'] = 'video/webm'; headers['mime-type'] = 'video/webm'; } else { return null; } // headers.append('filename', file.name); headers.filename = file.name; self.post(url, headers, reader.result) .then((response: any) => { console.log(`URL: ${ url }\nRespond(${ response.status }): ${ JSON.stringify(response.data, null, 2)}`); if(response.status === 200) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject('return ERROR ...');// + JSON.stringify(response, null, 2)); } }); }; }); } uploadMultipart(base:string, multipart:FormData, progress:any): any { console.log(`Upload multipart to ${ base}`); let url = base; let self = this; return new Promise((resolve, reject) => { let headers = { // 'Content-Type': 'multipart/form-data', };// new Headers(); self.post(url, headers, multipart, progress) .then((response: any) => { console.log(`URL: ${ url }\nRespond(${ response.status }): ${ JSON.stringify(response.data, null, 2)}`); if(response.status >= 200 && response.status <= 299) { resolve(response.data.body); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject('return ERROR ...');// + JSON.stringify(response, null, 2)); } }); }); } /* public upload(base:string, id:number, file:File): any { data, userId) { } let uploadURL = `${this.SERVER_URL}/auth/${userId}/avatar`; return this.http.post(uploadURL, data, { reportProgress: true, observe: 'events' }).pipe(map((event) => { switch (event.type) { case HttpEventType.UploadProgress: const progress = Math.round(100 * event.loaded / event.total); return { status: 'progress', message: progress }; case HttpEventType.Response: return event.body; default: return `Unhandled event: ${event.type}`; } }) ); } */ // Complex wrapper to simplify interaction: getSpecific(base:string, id:number = null, subElement:string = '', select:string[] = []):any { console.log(`Get All data from ${ base}`); const httpOption = { 'Content-Type': 'application/json' }; let url = base; if(id !== null) { url = `${url }/${ id}`; } if(subElement !== '') { url = `${url }/${ subElement}`; } if(select.length !== 0) { let newValue = ''; for(let iii = 0; iii < select.length; iii++) { if(select.length !== 0) { newValue = `${newValue}&`; } newValue = `${newValue}select=${select[iii]}`; } url = `${url}?${newValue}`; } // console.log("call GET " + url); return new Promise((resolve, reject) => { this.get(url, httpOption, {}) .then((response: any) => { // console.log("URL: " + url + "\nRespond(" + response.status + "): " + JSON.stringify(response.data, null, 2)); if(response.status === 200) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject(`return ERROR ${ JSON.stringify(response.data, null, 2)}`); } }); }); } // Complex wrapper to simplify interaction: deleteSpecific(base:string, id:number, subElement:string = ''):any { // console.log("delete data to " + base); const httpOption = { 'Content-Type': 'application/json' }; let url = base; if(id !== null) { url = `${url }/${ id}`; } if(subElement !== '') { url = `${url }/${ subElement}`; } // console.log("call DELETE: " + url); // console.log(" data: " + JSON.stringify(data, null, 2)); return new Promise((resolve, reject) => { this.delete(url, httpOption) .then((response: any) => { // console.log("URL: " + url + "\nRespond(" + response.status + "): " + JSON.stringify(response.data, null, 2)); if(response.status === 200) { resolve(response.data); return; } if(response.status === 201) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject(`return ERROR ${ JSON.stringify(response.data, null, 2)}`); } }); }); } // Complex wrapper to simplify interaction: putSpecific(base:string, id:number, data:any, subElement:string = ''):any { // console.log("put data to " + base); const httpOption = { 'Content-Type': 'application/json' }; let url = base; if(id !== null) { url = `${url }/${ id}`; } if(subElement !== '') { url = `${url }/${ subElement}`; } // console.log("call PUT: " + url); // console.log(" data: " + JSON.stringify(data, null, 2)); return new Promise((resolve, reject) => { this.put(url, httpOption, data) .then((response: any) => { // console.log("URL: " + url + "\nRespond(" + response.status + "): " + JSON.stringify(response.data, null, 2)); if(response.status === 200) { resolve(response.data); return; } if(response.status === 201) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject(`return ERROR ${ JSON.stringify(response.data, null, 2)}`); } }); }); } // Complex wrapper to simplify interaction: postSpecific(base:string, id:number, data:any, subElement:string = ''):any { // console.log("put data to " + base); const httpOption = { 'Content-Type': 'application/json' }; let url = base; if(id !== null) { url = `${url }/${ id}`; } if(subElement !== '') { url = `${url }/${ subElement}`; } // console.log("call PUT: " + url); // console.log(" data: " + JSON.stringify(data, null, 2)); return new Promise((resolve, reject) => { this.post(url, httpOption, data) .then((response: any) => { // console.log("URL: " + url + "\nRespond(" + response.status + "): " + JSON.stringify(response.data, null, 2)); if(response.status === 200) { resolve(response.data); return; } if(response.status === 201) { resolve(response.data); return; } reject('An error occured'); }, (response: any) => { if(typeof response.data === 'undefined') { reject('return ERROR undefined'); } else { reject(`return ERROR ${ JSON.stringify(response.data, null, 2)}`); } }); }); } }