Newer
Older
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { HttpErrorResponse, HttpResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { createEmptyStateResource, createErrorStateResource, createStateResource, EMPTY_STRING, getMessageForIssue, isNotNil, isUnprocessableEntity, isValidationFieldFileSizeExceedError, sanitizeFileName, StateResource } from '@goofy-client/tech-shared';
import { SnackBarService } from '@goofy-client/ui';
import { Resource, ResourceUri } from '@ngxp/rest';
import { saveAs } from 'file-saver';
import { isNil } from 'lodash-es';
import { Observable, of, throwError } from 'rxjs';
import { catchError, map, mergeMap, startWith } from 'rxjs/operators';
import { BinaryFileListResource, BinaryFileResource } from './binary-file.model';
import { BinaryFileRepository } from './binary-file.repository';
@Injectable({ providedIn: 'root' })
export class BinaryFileService {
constructor(private repository: BinaryFileRepository, private snackbarService: SnackBarService) { }
public uploadFile(resource: Resource, linkRel: string, file: File): Observable<StateResource<BinaryFileResource>> {
return this.repository.uploadFile(resource, linkRel, file).pipe(
mergeMap((response: HttpResponse<void>) => this.getFile(response.headers.get('Location'))),
catchError(errorResponse => this.handleError(errorResponse.error)),
startWith(createEmptyStateResource<BinaryFileResource>(true)));
private handleError(errorResponse: HttpErrorResponse): Observable<StateResource<any>> {
return of(this.handleErrorByStatus(errorResponse));
handleErrorByStatus(error: HttpErrorResponse): StateResource<any> {
if (isUnprocessableEntity(error.status) && isValidationFieldFileSizeExceedError(error.error)) {
this.snackbarService.showError(getMessageForIssue(EMPTY_STRING, error.error.issues[0]));

OZGCloud
committed
return createErrorStateResource(error.error);
}
throwError({ error });
}
public downloadFile(file: BinaryFileResource, fileNamePrefix: string): Observable<StateResource<any>> {
return this.repository.download(file).pipe(
map(data => this.saveBinaryFile(data, file, fileNamePrefix)),
startWith(createEmptyStateResource(true)));
}
saveBinaryFile(data: any, file: BinaryFileResource, fileNamePrefix: string): StateResource<Blob> {
if (isNil(data)) {
return createEmptyStateResource(true);
}
this.save(data, this.buildFileName(file, fileNamePrefix));
return createStateResource(data);
}
private buildFileName(file: BinaryFileResource, fileNamePrefix: string): string {
if(isNotNil(fileNamePrefix)){
return sanitizeFileName(`${fileNamePrefix}_${file.name}`);
save(data: any, fileName: string): void {
saveAs(data, fileName)
}
getFile(uri: ResourceUri): Observable<StateResource<BinaryFileResource>> {
return this.repository.getFile(uri).pipe(
map(fileList => createStateResource(fileList)),
startWith(createEmptyStateResource<any>(true)));
}
public getFiles(resource: Resource, linkRel: string): Observable<StateResource<BinaryFileListResource>> {
return this.repository.getFiles(resource, linkRel).pipe(
map(fileList => createStateResource(fileList)),
startWith(createEmptyStateResource<BinaryFileListResource>(true)));