/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ import { HttpClient, HttpErrorResponse, HttpHeaders, HttpResponse } from '@angular/common/http'; import { Observable, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { ErrorDto } from './../../utils/error'; import { Types} from './../../utils/types'; import { Version, Versioned } from './../../utils/version'; export module HTTP { 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 })); } 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 new Versioned(new Version(etag), response); })); } } export const pretifyError = (message: string) => (source: Observable) => source.pipe(catchError((response: HttpErrorResponse) => { 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.'); } else if (response.status !== 500) { result = new ErrorDto(response.status, errorDto.message, errorDto.details); } } catch (e) { result = new ErrorDto(500, 'Failed to make the request.'); } } result = result || new ErrorDto(500, message); return throwError(result); }));