{"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/local-destination/index.ts"],"sourcesContent":["import { Writable, Readable } from 'stream';\nimport path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Knex } from 'knex';\nimport type { Core, Struct } from '@strapi/types';\nimport type { IDestinationProvider, IMetadata, ProviderType, Transaction } from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\n\nimport { createAssetsDestinationWritable } from './assets-destination-writable';\nimport { restore } from './strategies';\nimport * as utils from '../../../utils';\nimport {\n  ProviderInitializationError,\n  ProviderTransferError,\n  ProviderValidationError,\n} from '../../../errors/providers';\nimport { assertValidStrapi } from '../../../utils/providers';\n\nexport const VALID_CONFLICT_STRATEGIES = ['restore'];\nexport const DEFAULT_CONFLICT_STRATEGY = 'restore';\n\nexport interface ILocalStrapiDestinationProviderOptions {\n  getStrapi(): Core.Strapi | Promise<Core.Strapi>; // return an initialized instance of Strapi\n\n  autoDestroy?: boolean; // shut down the instance returned by getStrapi() at the end of the transfer\n  restore?: restore.IRestoreOptions; // erase data in strapi database before transfer; required if strategy is 'restore'\n  strategy: 'restore'; // conflict management strategy; only the restore strategy is available at this time\n  /** CLI / UI: human-readable progress during {@link beforeTransfer} (restore prep). */\n  onTransferPhase?: (message: string) => void;\n}\n\nclass LocalStrapiDestinationProvider implements IDestinationProvider {\n  name = 'destination::local-strapi';\n\n  type: ProviderType = 'destination';\n\n  options: ILocalStrapiDestinationProviderOptions;\n\n  strapi?: Core.Strapi;\n\n  transaction?: Transaction;\n\n  uploadsBackupDirectoryName: string;\n\n  onWarning?: ((message: string) => void) | undefined;\n\n  #diagnostics?: IDiagnosticReporter;\n\n  /**\n   * The entities mapper is used to map old entities to their new IDs\n   */\n  #entitiesMapper: { [type: string]: { [id: number]: number } };\n\n  constructor(options: ILocalStrapiDestinationProviderOptions) {\n    this.options = options;\n    this.#entitiesMapper = {};\n    this.uploadsBackupDirectoryName = `uploads_backup_${Date.now()}`;\n  }\n\n  async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n    this.#diagnostics = diagnostics;\n    this.#validateOptions();\n    this.strapi = await this.options.getStrapi();\n    if (!this.strapi) {\n      throw new ProviderInitializationError('Could not access local strapi');\n    }\n    this.strapi.db.lifecycles.disable();\n    this.transaction = utils.transaction.createTransaction(this.strapi);\n  }\n\n  // TODO: either move this to restore strategy, or restore strategy should given access to these instead of repeating the logic possibly in a different way\n  #areAssetsIncluded = () => {\n    return this.options.restore?.assets;\n  };\n\n  #isContentTypeIncluded = (type: string) => {\n    const notIncluded =\n      this.options.restore?.entities?.include &&\n      !this.options.restore?.entities?.include?.includes(type);\n    const excluded =\n      this.options.restore?.entities?.exclude &&\n      this.options.restore?.entities.exclude.includes(type);\n\n    return !excluded && !notIncluded;\n  };\n\n  #reportInfo(message: string) {\n    this.#diagnostics?.report({\n      details: {\n        createdAt: new Date(),\n        message,\n        origin: 'local-destination-provider',\n      },\n      kind: 'info',\n    });\n  }\n\n  async close(): Promise<void> {\n    const { autoDestroy } = this.options;\n    assertValidStrapi(this.strapi);\n    this.transaction?.end();\n    this.strapi.db.lifecycles.enable();\n    // Basically `!== false` but more deterministic\n    if (autoDestroy === undefined || autoDestroy === true) {\n      await this.strapi?.destroy();\n    }\n  }\n\n  #validateOptions() {\n    this.#reportInfo('validating options');\n    if (!VALID_CONFLICT_STRATEGIES.includes(this.options.strategy)) {\n      throw new ProviderValidationError(`Invalid strategy ${this.options.strategy}`, {\n        check: 'strategy',\n        strategy: this.options.strategy,\n        validStrategies: VALID_CONFLICT_STRATEGIES,\n      });\n    }\n\n    // require restore options when using restore\n    if (this.options.strategy === 'restore' && !this.options.restore) {\n      throw new ProviderValidationError('Missing restore options');\n    }\n  }\n\n  async #deleteFromRestoreOptions() {\n    assertValidStrapi(this.strapi);\n    if (!this.options.restore) {\n      throw new ProviderValidationError('Missing restore options');\n    }\n    this.#reportInfo('deleting record ');\n    return restore.deleteRecords(this.strapi, this.options.restore);\n  }\n\n  async #deleteAllAssets(trx?: Knex.Transaction) {\n    assertValidStrapi(this.strapi);\n    this.#reportInfo('deleting all assets');\n    // if we're not restoring files, don't touch the files\n    if (!this.#areAssetsIncluded()) {\n      return;\n    }\n\n    const stream: Readable = this.strapi.db\n      // Create a query builder instance (default type is 'select')\n      .queryBuilder('plugin::upload.file')\n      // Fetch all columns\n      .select('*')\n      // Attach the transaction\n      .transacting(trx)\n      // Get a readable stream\n      .stream();\n\n    // TODO use bulk delete when exists in providers\n    for await (const file of stream) {\n      await this.strapi.plugin('upload').provider.delete(file);\n      if (file.formats) {\n        for (const fileFormat of Object.values(file.formats)) {\n          await this.strapi.plugin('upload').provider.delete(fileFormat);\n        }\n      }\n    }\n\n    this.#reportInfo('deleted all assets');\n  }\n\n  async rollback() {\n    this.#reportInfo('Rolling back transaction');\n    await this.transaction?.rollback();\n    this.#reportInfo('Rolled back transaction');\n  }\n\n  async beforeTransfer() {\n    if (!this.strapi) {\n      throw new Error('Strapi instance not found');\n    }\n\n    this.options.onTransferPhase?.('Local: preparing destination for restore…');\n\n    await this.transaction?.attach(async (trx) => {\n      try {\n        if (this.options.strategy === 'restore') {\n          if (this.#areAssetsIncluded()) {\n            this.options.onTransferPhase?.('Local: backing up existing upload folder…');\n          }\n          await this.#handleAssetsBackup();\n          if (this.#areAssetsIncluded()) {\n            this.options.onTransferPhase?.('Local: deleting existing media files from disk…');\n          }\n          await this.#deleteAllAssets(trx);\n          this.options.onTransferPhase?.('Local: clearing database content for restore…');\n          await this.#deleteFromRestoreOptions();\n        }\n      } catch (error) {\n        throw new Error(`restore failed ${error}`);\n      }\n    });\n  }\n\n  getMetadata(): IMetadata {\n    this.#reportInfo('getting metadata');\n    assertValidStrapi(this.strapi, 'Not able to get Schemas');\n    const strapiVersion = this.strapi.config.get<string>('info.strapi');\n    const createdAt = new Date().toISOString();\n\n    return {\n      createdAt,\n      strapi: {\n        version: strapiVersion,\n      },\n    };\n  }\n\n  getSchemas(): Record<string, Struct.Schema> {\n    this.#reportInfo('getting schema');\n    assertValidStrapi(this.strapi, 'Not able to get Schemas');\n\n    const schemas = utils.schema.schemasToValidJSON({\n      ...this.strapi.contentTypes,\n      ...this.strapi.components,\n    });\n\n    return utils.schema.mapSchemasValues(schemas);\n  }\n\n  createEntitiesWriteStream(): Writable {\n    assertValidStrapi(this.strapi, 'Not able to import entities');\n    this.#reportInfo('creating entities stream');\n    const { strategy } = this.options;\n\n    const updateMappingTable = (type: string, oldID: number, newID: number) => {\n      if (!this.#entitiesMapper[type]) {\n        this.#entitiesMapper[type] = {};\n      }\n\n      Object.assign(this.#entitiesMapper[type], { [oldID]: newID });\n    };\n\n    if (strategy === 'restore') {\n      return restore.createEntitiesWriteStream({\n        strapi: this.strapi,\n        updateMappingTable,\n        transaction: this.transaction,\n      });\n    }\n\n    throw new ProviderValidationError(`Invalid strategy ${this.options.strategy}`, {\n      check: 'strategy',\n      strategy: this.options.strategy,\n      validStrategies: VALID_CONFLICT_STRATEGIES,\n    });\n  }\n\n  async #handleAssetsBackup() {\n    assertValidStrapi(this.strapi, 'Not able to create the assets backup');\n\n    // if we're not restoring assets, don't back them up because they won't be touched\n    if (!this.#areAssetsIncluded()) {\n      return;\n    }\n\n    if (this.strapi.config.get<{ provider: string }>('plugin::upload').provider === 'local') {\n      this.#reportInfo('creating assets backup directory');\n      const assetsDirectory = path.join(this.strapi.dirs.static.public, 'uploads');\n      const backupDirectory = path.join(\n        this.strapi.dirs.static.public,\n        this.uploadsBackupDirectoryName\n      );\n\n      try {\n        // Check access before attempting to do anything\n        await fse.access(\n          assetsDirectory,\n          // eslint-disable-next-line no-bitwise\n          fse.constants.W_OK | fse.constants.R_OK | fse.constants.F_OK\n        );\n        // eslint-disable-next-line no-bitwise\n        await fse.access(path.join(assetsDirectory, '..'), fse.constants.W_OK | fse.constants.R_OK);\n\n        await fse.move(assetsDirectory, backupDirectory);\n        await fse.mkdir(assetsDirectory);\n        // Create a .gitkeep file to ensure the directory is not empty\n        await fse.outputFile(path.join(assetsDirectory, '.gitkeep'), '');\n        this.#reportInfo(`created assets backup directory ${backupDirectory}`);\n      } catch (err) {\n        throw new ProviderTransferError(\n          'The backup folder for the assets could not be created inside the public folder. Please ensure Strapi has write permissions on the public directory',\n          {\n            code: 'ASSETS_DIRECTORY_ERR',\n          }\n        );\n      }\n      return backupDirectory;\n    }\n  }\n\n  async #removeAssetsBackup() {\n    assertValidStrapi(this.strapi, 'Not able to remove Assets');\n    // if we're not restoring assets, don't back them up because they won't be touched\n    if (!this.#areAssetsIncluded()) {\n      return;\n    }\n    // TODO: this should catch all thrown errors and bubble it up to engine so it can be reported as a non-fatal diagnostic message telling the user they may need to manually delete assets\n    if (this.strapi.config.get<{ provider: string }>('plugin::upload').provider === 'local') {\n      this.#reportInfo('removing assets backup');\n      assertValidStrapi(this.strapi);\n      const backupDirectory = path.join(\n        this.strapi.dirs.static.public,\n        this.uploadsBackupDirectoryName\n      );\n      await fse.rm(backupDirectory, { recursive: true, force: true });\n      this.#reportInfo('successfully removed assets backup');\n    }\n  }\n\n  // TODO: Move this logic to the restore strategy\n  async createAssetsWriteStream(): Promise<Writable> {\n    assertValidStrapi(this.strapi, 'Not able to stream Assets');\n    this.#reportInfo('creating assets write stream');\n    if (!this.#areAssetsIncluded()) {\n      throw new ProviderTransferError(\n        'Attempting to transfer assets when `assets` is not set in restore options'\n      );\n    }\n\n    const fileEntitiesMapper = this.#entitiesMapper['plugin::upload.file'];\n\n    return createAssetsDestinationWritable({\n      strapi: this.strapi,\n      transaction: this.transaction!,\n      resolveUploadFileId: (metadata) => fileEntitiesMapper?.[metadata.id],\n      restoreMediaEntitiesContent: this.#isContentTypeIncluded('plugin::upload.file'),\n      removeAssetsBackup: this.#removeAssetsBackup.bind(this),\n    });\n  }\n\n  async createConfigurationWriteStream(): Promise<Writable> {\n    assertValidStrapi(this.strapi, 'Not able to stream Configurations');\n    this.#reportInfo('creating configuration write stream');\n    const { strategy } = this.options;\n\n    if (strategy === 'restore') {\n      return restore.createConfigurationWriteStream(this.strapi, this.transaction);\n    }\n\n    throw new ProviderValidationError(`Invalid strategy ${strategy}`, {\n      check: 'strategy',\n      strategy,\n      validStrategies: VALID_CONFLICT_STRATEGIES,\n    });\n  }\n\n  async createLinksWriteStream(): Promise<Writable> {\n    this.#reportInfo('creating links write stream');\n    if (!this.strapi) {\n      throw new Error('Not able to stream links. Strapi instance not found');\n    }\n\n    const { strategy } = this.options;\n    const mapID = (uid: string, id: number): number | undefined => this.#entitiesMapper[uid]?.[id];\n\n    if (strategy === 'restore') {\n      return restore.createLinksWriteStream(mapID, this.strapi, this.transaction, this.onWarning);\n    }\n\n    throw new ProviderValidationError(`Invalid strategy ${strategy}`, {\n      check: 'strategy',\n      strategy,\n      validStrategies: VALID_CONFLICT_STRATEGIES,\n    });\n  }\n}\n\nexport const createLocalStrapiDestinationProvider = (\n  options: ILocalStrapiDestinationProviderOptions\n) => {\n  return new LocalStrapiDestinationProvider(options);\n};\n"],"names":["VALID_CONFLICT_STRATEGIES","DEFAULT_CONFLICT_STRATEGY","LocalStrapiDestinationProvider","bootstrap","diagnostics","strapi","options","getStrapi","ProviderInitializationError","db","lifecycles","disable","transaction","utils","close","autoDestroy","assertValidStrapi","end","enable","undefined","destroy","rollback","beforeTransfer","Error","onTransferPhase","attach","trx","strategy","error","getMetadata","strapiVersion","config","get","createdAt","Date","toISOString","version","getSchemas","schemas","contentTypes","components","createEntitiesWriteStream","updateMappingTable","type","oldID","newID","Object","assign","restore","ProviderValidationError","check","validStrategies","createAssetsWriteStream","ProviderTransferError","fileEntitiesMapper","createAssetsDestinationWritable","resolveUploadFileId","metadata","id","restoreMediaEntitiesContent","removeAssetsBackup","bind","createConfigurationWriteStream","createLinksWriteStream","mapID","uid","onWarning","name","assets","notIncluded","entities","include","includes","excluded","exclude","uploadsBackupDirectoryName","now","message","report","details","origin","kind","stream","queryBuilder","select","transacting","file","plugin","provider","delete","formats","fileFormat","values","assetsDirectory","path","join","dirs","static","public","backupDirectory","fse","access","constants","W_OK","R_OK","F_OK","move","mkdir","outputFile","err","code","rm","recursive","force","createLocalStrapiDestinationProvider"],"mappings":"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"}