/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ import { HttpClient, HttpErrorResponse, HttpEvent, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { ErrorDto, Types, Version, Versioned } from '@app/framework/internal'; export module HTTP { export function upload(http: HttpClient, method: string, url: string, file: File, version?: Version): Observable> { const req = new HttpRequest(method, url, getFormData(file), { headers: createHeaders(version), reportProgress: true }); return http.request(req); } export function getVersioned(http: HttpClient, url: string, version?: Version): Observable>> { const headers = createHeaders(version); return handleVersion(http.get(url, { observe: 'response', headers })); } export function postVersioned(http: HttpClient, url: string, body: any, version?: Version): Observable>> { const headers = createHeaders(version); return handleVersion(http.post(url, body, { observe: 'response', headers })); } export function putVersioned(http: HttpClient, url: string, body: any, version?: Version): Observable>> { const headers = createHeaders(version); return handleVersion(http.put(url, body, { observe: 'response', headers })); } export function patchVersioned(http: HttpClient, url: string, body: any, version?: Version): Observable>> { const headers = createHeaders(version); return handleVersion(http.request('PATCH', url, { body, observe: 'response', headers })); } export function deleteVersioned(http: HttpClient, url: string, version?: Version): Observable>> { const headers = createHeaders(version); return handleVersion(http.delete(url, { observe: 'response', headers })); } export function requestVersioned(http: HttpClient, method: string, url: string, version?: Version, body?: any): Observable>> { const headers = createHeaders(version); return handleVersion(http.request(method, url, { observe: 'response', headers, body })); } function getFormData(file: File) { const formData = new FormData(); formData.append('file', file); return formData; } function createHeaders(version?: Version): HttpHeaders { if (version && version.value && version.value.length > 0) { return new HttpHeaders().set('If-Match', version.value); } else { return new HttpHeaders(); } } function handleVersion(httpRequest: Observable>): Observable>> { return httpRequest.pipe(map((response: HttpResponse) => { const etag = response.headers.get('etag') || ''; return { version: new Version(etag), payload: response }; })); } } export const pretifyError = (message: string) => (source: Observable) => source.pipe(catchError((response: HttpErrorResponse) => { if (Types.is(response, ErrorDto)) { return throwError(response); } let result: ErrorDto | null = null; if (!Types.is(response.error, Error)) { try { let errorDto = Types.isObject(response.error) ? response.error : JSON.parse(response.error); if (!errorDto) { errorDto = { message: 'Failed to make the request.', details: [] }; } if (response.status === 412) { result = new ErrorDto(response.status, 'Failed to make the update. Another user has made a change. Please reload.', [], response); } else if (response.status !== 500) { result = new ErrorDto(response.status, errorDto.message, errorDto.details, response); } } catch (e) { result = new ErrorDto(500, 'Failed to make the request.', [], response); } } result = result || new ErrorDto(500, message); return throwError(result); }));