{"version":3,"file":"trxn-angular-file-storage.mjs","sources":["../../../../../libs/angular/file-storage/src/lib/constants/file-storage-configuration.constant.ts","../../../../../libs/angular/file-storage/src/lib/dtos/file-storage-configuration.dto.ts","../../../../../libs/angular/file-storage/src/lib/services/file-storage.service.ts","../../../../../libs/angular/file-storage/src/lib/file-storage.module.ts","../../../../../libs/angular/file-storage/src/trxn-angular-file-storage.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nimport { FileStorageConfiguration } from '../interfaces';\n\nexport const FILE_STORAGE_CONFIGURATION =\n  new InjectionToken<FileStorageConfiguration>('FILE_STORAGE_CONFIGURATION');\n","import { IsString } from 'class-validator';\n\nimport { FileStorageConfiguration } from '../interfaces/file-storage-configuration.interface';\n\nexport class FileStorageConfigurationDto implements FileStorageConfiguration {\n  /**\n   * Bucket used by default\n   */\n  @IsString()\n  defaultBucket!: string;\n\n  /**\n   * Endpoint to get presigend uploads\n   */\n  @IsString()\n  presignedUploadEndpoint!: string;\n\n  /**\n   * Endpoint to get presigned downloads\n   */\n  @IsString()\n  presignedDownloadEndpoint!: string;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\n\nimport { FILE_STORAGE_CONFIGURATION } from '../constants';\nimport {\n  FileStorageConfiguration,\n  FileStorageFormData,\n  FileStoragePresignedPostToken,\n  FileStorageUploadResult,\n} from '../interfaces';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class FileStorageService {\n  constructor(\n    @Inject(FILE_STORAGE_CONFIGURATION)\n    private fileStorageConfiguration: FileStorageConfiguration,\n    private http: HttpClient,\n  ) {}\n\n  /**\n   * Get presigned upload url to upload a file into storage\n   *\n   * @param mimeType - MIME type of the file to upload\n   * @param fileSize - Size of the file to upload\n   * @returns Observable that resolve into a presigned post token\n   */\n  public getPresignedUploadUrl(mimeType: string, fileSize: number) {\n    const { presignedUploadEndpoint } = this.fileStorageConfiguration;\n    return this.http\n      .get<FileStoragePresignedPostToken>(presignedUploadEndpoint, {\n        params: { mimeType, fileSize },\n      })\n      .pipe(shareReplay(1));\n  }\n\n  /**\n   * Get presigned download url to download a file to storage\n   *\n   * @param file - Path of the file to download\n   * @returns Observable that resolve into a presigned post token\n   */\n  public getPresignedDownloadUrl(file: string) {\n    const { presignedDownloadEndpoint } = this.fileStorageConfiguration;\n    return this.http\n      .get<{ url: string }>(presignedDownloadEndpoint, {\n        params: { file },\n      })\n      .pipe(shareReplay(1));\n  }\n\n  /**\n   * Generate form data from presigned post token and file\n   * to upload\n   *\n   * @param presignedPostToken - Presigned post token to build form data\n   * @param file - File to upload\n   * @returns Form data instance that must be sent to data storage\n   */\n  public generateFormData(\n    rawFormData: FileStorageFormData,\n    file: File,\n  ): FormData {\n    const formData = new FormData();\n\n    for (const [key, value] of Object.entries(rawFormData)) {\n      formData.append(key, value as string);\n    }\n\n    formData.append('file', file);\n\n    return formData;\n  }\n\n  /**\n   * Upload a file to file storage using presigned url\n   *\n   * @param file - File to upload to file storage\n   * @param reportProgress - Option to report request progress\n   * @returns Observable that resolves as a temporary url of the uploaded file\n   */\n  public uploadFileToFileStorage(\n    file: File,\n    reportProgress = false,\n  ): Observable<FileStorageUploadResult> {\n    if (!file) throw new Error('No file provided for upload to file storage');\n\n    return this.getPresignedUploadUrl(file.type, file.size).pipe(\n      map(({ formData, postURL }) => ({\n        postURL,\n        formData: this.generateFormData(formData, file),\n      })),\n      switchMap(({ postURL, formData }) =>\n        this.http.post(postURL, formData, { reportProgress }).pipe(\n          map(() => ({\n            url: this.getUploadFileUrl(\n              postURL,\n              // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n              formData.get('key')!.toString(),\n            ),\n            size: file.size,\n            mimeType: file.type,\n          })),\n        ),\n      ),\n      shareReplay(1),\n    );\n  }\n\n  /**\n   * Return the url of an uploaded file, calculated from the upload url\n   * and the file key\n   *\n   * @param postURL - Upload url of the file\n   * @param fileKey - Key of the uploaded file\n   * @returns the public url of the uploaded file\n   */\n  public getUploadFileUrl(postURL: string, fileKey: string) {\n    // Remove last backslash of the url if it exists, as it can be inconsistent between minio and aws\n    const formattedPostUrl = postURL.replace(/\\/\\s*$/, '');\n    return `${formattedPostUrl}/${fileKey}`;\n  }\n}\n","/* eslint-disable import/no-extraneous-dependencies */\n\nimport { HttpClientModule } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { FILE_STORAGE_CONFIGURATION } from './constants';\nimport { FileStorageConfigurationDto } from './dtos';\nimport { FileStorageConfiguration } from './interfaces';\nimport { FileStorageService } from './services';\n\nimport { AsyncOptions, ModuleOptionsFactory } from '@trxn/angular-tools';\n\n@NgModule({\n  imports: [HttpClientModule],\n  providers: [FileStorageService],\n})\nexport class FileStorageModule extends ModuleOptionsFactory<\n  FileStorageConfiguration,\n  FileStorageConfiguration\n>(FILE_STORAGE_CONFIGURATION, FileStorageConfigurationDto) {\n  static register(\n    options?: FileStorageConfiguration,\n  ): ModuleWithProviders<FileStorageModule> {\n    return super.register(options);\n  }\n\n  static forRoot(\n    options?: FileStorageConfiguration,\n  ): ModuleWithProviders<FileStorageModule> {\n    return super.forRoot(options);\n  }\n\n  static registerAsync(\n    options: AsyncOptions<FileStorageConfiguration, FileStorageConfiguration>,\n  ): ModuleWithProviders<FileStorageModule> {\n    return super.registerAsync(options);\n  }\n\n  static forRootAsync(\n    options: AsyncOptions<FileStorageConfiguration, FileStorageConfiguration>,\n  ): ModuleWithProviders<FileStorageModule> {\n    return super.forRootAsync(options);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}