{"version":3,"file":"version-caches2.mjs","sources":["../../../../../../../../packages/components/file/src/hooks/version-caches.ts"],"sourcesContent":["import { type FileActionUploadApiResponseRecord, type FileMode } from '../typings'\nimport { type Keys, validateVersionCachesHasApiFile } from '../utils'\n\nexport type FileVersionStrategy = 'latest' | 'all'\nexport type FileVersionCache = FileActionUploadApiResponseRecord\nexport interface FileVersionCaches {\n  actualId?: FileVersionCache[]\n}\n\n// // 调用 updatefile 接口返回数据 version 为 0\n// version === 0\n// // 数据已被业务消费\n// businessId || businessKey\n\n/**\n * 编辑/立即更新模式需要向后端提供双向绑定的 fileactualids\n *\n * 1. 编辑模式数据结构：(为了后端管理文件版本)\n * [{\n *    actualId: '',\n *    moduleCode: '',\n *    versionList: [{\n *      ...file\n *    }]\n * }]\n *\n * 2. 立即更新模式数据结构：\n * [file.actualId]\n *\n * 其中当组件进入编辑/立即更新模式后，数据初始化完成先组建数据结构：\n * [{ actualId: '' }]\n * 编辑模式下，当用户进入行编辑前/打开version弹窗前/点击更新按钮前，请求 filehistorylist 将数据维护至 versionlist 中此时打开 version 弹窗直接从缓存取数据即可\n *\n * 3. 缓存载入的时机是在编辑/立即更新模式下 queryfile/queryfilelist，后端返回的数据中每条数据为 verions:1 接口返回后调用 createAllFileCaches\n *\n * 4. 文件版本列表数据载入的时机是在编辑/立即更新模式下第一次点击该行中版本/更新按钮会请求 querfilehstory 将其载入缓存，详情查看 filetable.vue 中的 beforeReadFileCaches\n *\n * 5. 删除该行文件数据缓存的时机是在编辑/立即更新模式下点击删除按钮后触发，调用 deleteFileCaches\n */\nexport class VersionCaches {\n  static controller: VersionCaches\n  static getInstance() {\n    if (!this.controller) {\n      this.controller = new VersionCaches()\n    }\n    return this.controller\n  }\n\n  private filterCacheKeys: string[] = ['__id']\n\n  constructor(\n    // public strategy: FileVersionStrategy = 'latest',\n    public caches: { [key: string]: FileVersionCache[] | undefined } = {},\n    /** 控制版本个数只增一次 */\n    public actualidCaches: Set<string> = new Set<string>()\n  ) {}\n\n  /**\n   * 对数据源（全部文件数据）做缓存，filetable/fileupload/fileuploadlink\n   * @param files\n   * @param mode\n   */\n  createAllFileCaches(files: FileActionUploadApiResponseRecord[], mode?: FileMode) {\n    if (mode === 'update' || mode === 'updateInstantly') {\n      files.forEach((_file) => {\n        const file = this.serialize(_file)\n        if (!this.caches[file.actualId!]) {\n          this.caches[file.actualId!] = [file]\n        }\n      })\n    }\n  }\n\n  /**\n   * 对单一文件做缓存\n   * @param _file\n   * @param _histories\n   * @returns\n   */\n  createFileCaches(\n    _file: FileActionUploadApiResponseRecord,\n    _histories: FileActionUploadApiResponseRecord[]\n  ) {\n    const file = this.serialize(_file)\n    const histories = this.serialize(_histories)\n    histories.pop() // 最后一条数据即当前行数据，已经在初始化时放入缓存所以这里不需要\n    this.caches[file.actualId!] = [\n      ...histories.map((history) => this.buildCache(history)),\n      ...(this.caches[file.actualId!] || [file]),\n    ]\n    return this.caches[file.actualId!]\n  }\n\n  /**\n   * 为单一文件新增一条缓存数据\n   * 这里需要注意的是编辑模式下更新文件（接口返回的数据）版本只加一次\n   * 立即更新模式下不论是本地上传还是接口返回的文件数据每次更新版本都会加一次\n   * @param updatedFile\n   * @returns\n   */\n  createFileCache(updatedFile: FileActionUploadApiResponseRecord, mode: FileMode) {\n    const _updatedFile = this.serialize(updatedFile)\n    const isApiFileUpdatedOrIsLocalFile =\n      mode !== 'updateInstantly' &&\n      (this.actualidCaches.has(_updatedFile.actualId!) || // 非立即更新模式下更新文件（接口返回的数据）版本只加一次控制\n        !validateVersionCachesHasApiFile(this.caches[_updatedFile.actualId!])) // 非立即更新模式本地上传文件不增加版本号控制\n    if (isApiFileUpdatedOrIsLocalFile) {\n      this.updateFileCaches(updatedFile)\n      return\n    }\n\n    this.actualidCaches.add(_updatedFile.actualId!)\n    this.updateFileCacheVersion(_updatedFile)\n  }\n\n  readFileCaches(actualId: string) {\n    return this.caches[actualId]\n  }\n\n  /** 按照后端要求的数据结构返回 */\n  getCaches() {\n    return Object.keys(this.caches).map((k) => ({\n      actualId: k,\n      moduleCode: this.caches[k]![0].moduleCode,\n      versionList: this.caches[k]!,\n    }))\n  }\n\n  /**\n   * 更新单一文件全部缓存\n   * @param updatedFile\n   * @returns\n   */\n  updateFileCaches(updatedFile: FileActionUploadApiResponseRecord) {\n    const fileCaches = this.readFileCaches(updatedFile.actualId!)\n    if (!fileCaches) return\n\n    const latestVersionFileCache = this.readFileCacheLatestVersion(updatedFile.actualId!)\n    if (!latestVersionFileCache) return\n\n    this.caches[updatedFile.actualId!]!.pop()\n    this.caches[updatedFile.actualId!] = [\n      ...this.caches[updatedFile.actualId!]!,\n      { ...updatedFile, version: latestVersionFileCache.version },\n    ]\n  }\n\n  /**\n   * 文件删除成功后删除该文件的缓存\n   * @param actualId\n   * @returns\n   */\n  deleteFileCaches(actualId: string) {\n    const fileCaches = this.readFileCaches(actualId)\n    if (!fileCaches) return\n\n    this.actualidCaches.delete(actualId)\n    Reflect.deleteProperty(this.caches, actualId)\n  }\n\n  /**\n   * 清空所有缓存\n   */\n  deleteAllFileCaches() {\n    this.actualidCaches.clear()\n    this.caches = {}\n  }\n\n  /**\n   * 后端返回的 history 数组中的数据按照版本号由小到大排列\n   * 最后一条数据即最新版本\n   * @param actualId\n   * @returns\n   */\n  readFileCacheLatestVersion(actualId: string) {\n    const fileCaches = this.readFileCaches(actualId)\n    if (!fileCaches) return\n\n    return fileCaches.at(-1)\n  }\n\n  /**\n   * 更新缓存中的版本号\n   * @param updatedFile\n   * @returns\n   */\n  updateFileCacheVersion(updatedFile: FileActionUploadApiResponseRecord) {\n    const latestVersionFileCache = this.readFileCacheLatestVersion(updatedFile.actualId!)\n    if (!latestVersionFileCache) return\n\n    const cacheFile = this.buildCache(updatedFile)\n    if (this.caches[updatedFile.actualId!]) {\n      cacheFile.version = latestVersionFileCache.version + 1\n      this.caches[updatedFile.actualId!] = [...this.caches[updatedFile.actualId!]!, cacheFile]\n    } else {\n      this.caches[updatedFile.actualId!] = [cacheFile]\n    }\n  }\n\n  /**\n   * 表格行编辑前、version 列弹窗出现前、update 按钮点击前需要先判断缓存是否为空\n   * 如果为空则请求该文件的 filehistory 进行缓存\n   * 如果不为空则什么都不做\n   * @returns\n   */\n  isCachesEmpty() {\n    return !this.caches || Object.keys(this.caches).length === 0\n  }\n\n  /**\n   * 保留缓存需要的属性\n   * @param file\n   * @returns\n   */\n  buildCache(file: FileActionUploadApiResponseRecord) {\n    const cache = Object.keys(file).reduce((_cache: any, k: string) => {\n      if (!this.filterCacheKeys.includes(k) && !_cache[k]) {\n        _cache[k] = file[k as unknown as Keys<keyof FileActionUploadApiResponseRecord>]\n      }\n      return _cache\n    }, {} as any) as unknown as FileVersionCache\n    return cache\n  }\n\n  serialize<T>(data: T) {\n    return JSON.parse(JSON.stringify(data)) as T\n  }\n}\n\nexport const VersionCachesSingleton = VersionCaches.getInstance()\n"],"names":[],"mappings":"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"}