You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.1 KiB
TypeScript

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpRequest, HttpEvent } from '@angular/common/http';
import { environment } from '../../environments/environment';
import { map } from 'rxjs/operators';
const API_HOST = environment.apiHost;
@Injectable({
providedIn: 'root'
})
export class ApiService {
httpOptions = {
headers: new HttpHeaders({'Content-Type': 'application/json'})
};
token: string;
constructor(private http: HttpClient) {
}
static handleError(error: Error) {
alert(error.message);
}
static extractData(res: HttpEvent<any>) {
const body = res;
return body || { };
}
setAuthToken(token) {
this.httpOptions.headers = this.httpOptions.headers.append('Authorization', `jwt ${token}`);
this.token = token;
}
get(endpoint): Promise<any> {
const url = `${API_HOST}${endpoint}`;
const req = this.http.get(url, this.httpOptions).pipe(map(ApiService.extractData));
return req
.toPromise()
.catch((e) => {
ApiService.handleError(e);
throw e;
});
}
post(endpoint, data): Promise<any> {
const url = `${API_HOST}${endpoint}`;
return this.http.post<HttpEvent<any>>(url, data, this.httpOptions)
.toPromise()
.catch((e) => {
ApiService.handleError(e);
throw e;
});
}
async upload(endpoint: string, file: File, payload: any): Promise<any> {
const signed_url = (await this.get(`${endpoint}/signed-url/${file.name}`)).url;
const headers = new HttpHeaders({'Content-Type': file.type});
const req = new HttpRequest( 'PUT', signed_url, file,
{
headers: headers,
reportProgress: true, // track progress
});
return new Promise ( resolve => {
this.http.request(req).subscribe((resp) => {
if (resp && (<any> resp).status && (<any> resp).status === 200) {
resolve(this.post(endpoint, payload));
}
});
});
}
}