{"version":3,"file":"c8y-ngx-components-static-assets-data.mjs","sources":["../../static-assets/data/static-assets.service.ts","../../static-assets/data/c8y-ngx-components-static-assets-data.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ApplicationAvailability, ApplicationType, FetchClient, IApplication } from '@c8y/client';\nimport { ApplicationService } from '@c8y/client';\nimport { AppStateService, DroppedFile, FilesService, ZipService } from '@c8y/ngx-components';\nimport { StaticAsset, StaticAssetType } from './static-assets.model';\n\n@Injectable({ providedIn: 'root' })\nexport class StaticAssetsService {\n  readonly fileNames = {\n    contents: 'contents.json',\n    manifest: 'cumulocity.json',\n    exportZipName: 'static-assets.zip'\n  } as const;\n  private listFilesCachePromises: Record<string, Promise<StaticAsset[]>> = {};\n\n  constructor(\n    private appstate: AppStateService,\n    private appService: ApplicationService,\n    private fetchClient: FetchClient,\n    private fileService: FilesService,\n    private zip: ZipService\n  ) {}\n\n  /**\n   * Lists all files of the given type.\n   * Forces a cache renewal.\n   */\n  async listFiles<T extends string = StaticAssetType>(type: T): Promise<StaticAsset[]> {\n    return this.listFilesCached(type, true);\n  }\n\n  /**\n   * Lists all files of the given type.\n   * Uses a cache.\n   */\n  async listFilesCached<T extends string = StaticAssetType>(\n    type: T,\n    forceCacheRenewal = false\n  ): Promise<StaticAsset[]> {\n    if (!this.listFilesCachePromises[type] || forceCacheRenewal) {\n      this.listFilesCachePromises[type] = this._listFiles(type);\n    }\n\n    return await this.listFilesCachePromises[type];\n  }\n\n  /**\n   * Clones all assets of the given type from parent tenants into the current tenant.\n   */\n  async cloneAssetsIntoTenant<T extends string = StaticAssetType>(type: T) {\n    const { data: apps } = await this.appService.list({\n      availability: ApplicationAvailability.SHARED,\n      type: ApplicationType.HOSTED,\n      pageSize: 2000\n    });\n\n    const tenantIdsFromOtherAssetApps = apps\n      .filter(app => {\n        const result =\n          app.owner?.tenant?.id &&\n          app.owner?.tenant?.id !== this.appstate.currentTenant.value?.name &&\n          app.contextPath === this.getContextPath(type, app.owner?.tenant?.id);\n        return result;\n      })\n      .map(app => app.owner?.tenant?.id);\n\n    let filesOfCurrentTenant = await this._listFiles(type);\n\n    let filesToUpload = new Array<File>();\n\n    const oldAssets = new Array<StaticAsset>();\n\n    for (const tenantId of tenantIdsFromOtherAssetApps) {\n      try {\n        const filesOfApp = await this.getContentJSONForType(type, tenantId);\n        oldAssets.push(...filesOfApp);\n        for (const file of filesOfApp) {\n          try {\n            const response = await this.fetchClient.fetch(file.path);\n            if (response.status !== 200) {\n              console.warn(`Failed to get file \"${file.fileName}\" from path ${file.path}`);\n              continue;\n            }\n            const fileContent = await response.blob();\n\n            // remove existing file with same name\n            filesOfCurrentTenant = filesOfCurrentTenant.filter(\n              existingFile => existingFile.fileName !== file.fileName\n            );\n            filesToUpload = filesToUpload.filter(\n              existingFile => existingFile.name !== file.fileName\n            );\n\n            filesToUpload.push(new File([fileContent], file.fileName, { type: file.type }));\n          } catch (e) {\n            console.warn(`Failed to add file \"${file.fileName}\" from tenant ${tenantId}`, e);\n          }\n        }\n      } catch (e) {\n        console.warn(`Failed to get asset files from tenant ${tenantId}`);\n      }\n    }\n\n    if (!filesToUpload.length) {\n      return;\n    }\n\n    const newAssets = await this.addFilesToStaticAssets(type, filesToUpload, filesOfCurrentTenant);\n\n    return { oldAssets, newAssets };\n  }\n\n  /**\n   * Adds the given files to the static assets of the given type.\n   */\n  async addFilesToStaticAssets<T extends string = StaticAssetType>(\n    type: T,\n    files: DroppedFile[] | File[],\n    existingFiles: StaticAsset[],\n    throwErrorOnExistingFiles = true\n  ) {\n    const app = await this.getAppForTenant(type);\n    const filesToAddToContents = new Array<StaticAsset>();\n    const addedAt = new Date().toISOString();\n    const filesToUpload: {\n      path: string;\n      contents: Blob;\n    }[] = [];\n    for (const droppedFile of files) {\n      const file = droppedFile instanceof File ? droppedFile : droppedFile.file;\n      const fileName = file.name.toLowerCase().replace(/[^a-zA-Z0-9\\-\\_\\.]/g, '');\n      const newFile = new File([file], fileName, {\n        type: file.type,\n        lastModified: file.lastModified\n      });\n      if (existingFiles.find(existingFile => existingFile.fileName === fileName)) {\n        if (throwErrorOnExistingFiles) {\n          throw Error(`File with name \"${fileName}\" is already existing.`);\n        }\n        existingFiles = existingFiles.filter(existingFile => existingFile.fileName !== fileName);\n      }\n      const fileExtension = file.name.split('.').pop();\n      filesToAddToContents.push({\n        addedAt,\n        lastModified: file.lastModified,\n        extension: fileExtension,\n        fileName: fileName,\n        originalFileName: file.name,\n        path: `/apps/public/${app.contextPath}/${fileName}`,\n        size: newFile.size,\n        type: newFile.type,\n        hashSum: await this.fileService.getHashSumOfFile(newFile)\n      });\n      filesToUpload.push({\n        contents: newFile,\n        path: fileName\n      });\n    }\n\n    const newFiles: StaticAsset[] = [...existingFiles, ...filesToAddToContents];\n    filesToUpload.push({\n      contents: new File([JSON.stringify(newFiles)], this.fileNames.contents, {\n        type: 'application/json'\n      }),\n      path: this.fileNames.contents\n    });\n    await this.appService.binary(app).updateFiles(filesToUpload);\n    await this.ensureAddedFilesArePresent(filesToAddToContents);\n    return newFiles;\n  }\n\n  /**\n   * Gets the static assets app for the given type.\n   */\n  async getAppForTenant<T extends string = StaticAssetType>(type: T): Promise<IApplication> {\n    const appName = this.getContextPath(type, false);\n    const { data: apps } = await this.appService.listByName(appName);\n    if (!apps.length) {\n      throw Error(`No app with name ${appName} found.`);\n    }\n    return apps[0];\n  }\n\n  private getContentJSONForType<T extends string = StaticAssetType>(\n    type: T,\n    appendTenantId?: string | null | undefined\n  ) {\n    const path = this.getPathForContent(type, appendTenantId);\n    return this.getContentJSONFromPath(path);\n  }\n\n  private async getContentJSONFromPath(path: string): Promise<StaticAsset[]> {\n    const response = await this.fetchClient.fetch(path);\n    if (response.status !== 200) {\n      throw Error(`Failed to retrieve ${path}`);\n    }\n\n    const content = await response.json();\n    return content;\n  }\n\n  private async ensureAddedFilesArePresent(files: StaticAsset[]) {\n    for (const file of files) {\n      await this.ensureFileIsPresent(file);\n    }\n  }\n\n  private async ensureFileIsPresent(file: StaticAsset) {\n    for (let i = 0; i < 12; i++) {\n      try {\n        const currentDate = new Date();\n        const response = await this.fetchClient.fetch(\n          `${file.path}?nocache=${currentDate.getTime()}`\n        );\n        if (response.status !== 200) {\n          await this.sleep(5_000);\n          continue;\n        }\n\n        const blob = await response.blob();\n        const hashSum = await this.fileService.getHashSumOfFile(blob);\n        if (hashSum !== file.hashSum) {\n          await this.sleep(5_000);\n          continue;\n        }\n        return;\n      } catch (e) {\n        console.warn(e);\n        continue;\n      }\n    }\n    throw Error(`Unable to retrieve file from ${file.path}`);\n  }\n\n  private sleep(duration: number): Promise<void> {\n    return new Promise<void>(resolve => setTimeout(() => resolve(), duration));\n  }\n\n  private async _listFiles<T extends string = StaticAssetType>(type: T) {\n    try {\n      const files = await this.getContentJSONForType(type);\n      return files;\n    } catch (e) {\n      console.warn(e);\n    }\n\n    return await this.createEmptyApp(type);\n  }\n\n  private getPathForContent<T extends string = StaticAssetType>(\n    type: T,\n    appendTenantId?: string | null | undefined\n  ): string {\n    const currentDate = new Date();\n    const contextPath = this.getContextPath(type, appendTenantId);\n    return `/apps/public/${contextPath}/${\n      this.fileNames.contents\n    }?nocache=${currentDate.getTime()}`;\n  }\n\n  private getContextPath<T extends string = StaticAssetType>(\n    type: T,\n    appendTenantId?: string | false | undefined\n  ) {\n    let contextPath: string = type + '-assets';\n    const tenantId =\n      appendTenantId === undefined ? this.appstate.currentTenant.value?.name : appendTenantId;\n    if (tenantId) {\n      contextPath = `${contextPath}-${tenantId}`;\n    }\n    return contextPath;\n  }\n\n  private async createEmptyApp<T extends string = StaticAssetType>(\n    type: T,\n    appendTenantId?: string | null | undefined\n  ): Promise<StaticAsset[]> {\n    const name = this.getContextPath(type, false);\n    const contextPath = this.getContextPath(type, appendTenantId);\n    const key = `${contextPath}-key`;\n    const manifest: IApplication = {\n      name,\n      contextPath,\n      key,\n      description: `Application containing static assets used for ${type}.`,\n      noAppSwitcher: true,\n      type: ApplicationType.HOSTED,\n      availability: ApplicationAvailability.MARKET\n    };\n\n    const content = [];\n    const zipFile = await this.zip.createZip([\n      {\n        fileName: `${this.fileNames.manifest}`,\n        blob: new Blob([JSON.stringify(manifest)])\n      },\n      {\n        fileName: `${this.fileNames.contents}`,\n        blob: new Blob([JSON.stringify(content)])\n      }\n    ]);\n    const { data: app } = await this.appService.create(manifest);\n    const { data: appBinary } = await this.appService\n      .binary(app)\n      .upload(zipFile, `empty-${name}.zip`);\n    await this.appService.update({ id: app.id, activeVersionId: appBinary.id as string });\n    return [];\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}