{"version":3,"file":"index.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/index.ts"],"sourcesContent":["import type { Core, UID, Struct } from '@strapi/types';\nimport type { Model } from '@strapi/database';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport * as queries from '../../../../queries';\n\nexport interface IRestoreOptions {\n  assets?: boolean; // delete media library files before transfer\n  configuration?: {\n    webhook?: boolean; // delete webhooks before transfer\n    coreStore?: boolean; // delete core store before transfer\n  };\n  entities?: {\n    include?: string[]; // only delete these stage entities before transfer\n    exclude?: string[]; // exclude these stage entities from deletion\n    filters?: ((contentType: Struct.ContentTypeSchema) => boolean)[]; // custom filters to exclude a content type from deletion\n    params?: { [uid: string]: unknown }; // params object passed to deleteMany before transfer for custom deletions\n  };\n}\n\ninterface IDeleteResults {\n  count: number;\n  aggregate: { [uid: string]: { count: number } };\n}\n\nexport const deleteRecords = async (strapi: Core.Strapi, options: IRestoreOptions) => {\n  const entities = await deleteEntitiesRecords(strapi, options);\n  const configuration = await deleteConfigurationRecords(strapi, options);\n\n  return {\n    count: entities.count + configuration.count,\n    entities,\n    configuration,\n  };\n};\n\nconst deleteEntitiesRecords = async (\n  strapi: Core.Strapi,\n  options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n  const { entities } = options;\n\n  const models = strapi.get('models').get() as Model[];\n  const contentTypes = Object.values(strapi.contentTypes) as Struct.ContentTypeSchema[];\n\n  const contentTypesToClear = contentTypes\n    .filter((contentType) => {\n      let removeThisContentType = true;\n\n      // include means \"only include these types\" so if it's not in here, it's not being included\n      if (entities?.include) {\n        removeThisContentType = entities.include.includes(contentType.uid);\n      }\n\n      // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n      if (entities?.exclude && entities.exclude.includes(contentType.uid)) {\n        removeThisContentType = false;\n      }\n\n      if (entities?.filters) {\n        removeThisContentType = entities.filters.every((filter) => filter(contentType));\n      }\n\n      return removeThisContentType;\n    })\n    .map((contentType) => contentType.uid);\n\n  const modelsToClear = models\n    .filter((model) => {\n      if (contentTypesToClear.includes(model.uid as UID.ContentType)) {\n        return false;\n      }\n\n      let removeThisModel = true;\n\n      // include means \"only include these types\" so if it's not in here, it's not being included\n      if (entities?.include) {\n        removeThisModel = entities.include.includes(model.uid);\n      }\n\n      // if something is excluded, remove it. But lack of being excluded doesn't mean it's kept\n      if (entities?.exclude && entities.exclude.includes(model.uid)) {\n        removeThisModel = false;\n      }\n\n      return removeThisModel;\n    })\n    .map((model) => model.uid);\n\n  const [results, updateResults] = useResults([...contentTypesToClear, ...modelsToClear]);\n\n  const contentTypeQuery = queries.entity.createEntityQuery(strapi);\n\n  const contentTypePromises = contentTypesToClear.map(async (uid) => {\n    const result = await contentTypeQuery(uid).deleteMany(entities?.params);\n\n    if (result) {\n      updateResults(result.count || 0, uid);\n    }\n  });\n\n  const modelsPromises = modelsToClear.map(async (uid) => {\n    const result = await strapi.db.query(uid).deleteMany({});\n\n    if (result) {\n      updateResults(result.count || 0, uid);\n    }\n  });\n\n  await Promise.all([...contentTypePromises, ...modelsPromises]);\n\n  return results;\n};\n\nconst deleteConfigurationRecords = async (\n  strapi: Core.Strapi,\n  options: IRestoreOptions = {}\n): Promise<IDeleteResults> => {\n  const { coreStore = true, webhook = true } = options?.configuration ?? {};\n\n  const models: string[] = [];\n\n  if (coreStore) {\n    models.push('strapi::core-store');\n  }\n\n  if (webhook) {\n    models.push('strapi::webhook');\n  }\n\n  const [results, updateResults] = useResults(models);\n\n  const deletePromises = models.map(async (uid) => {\n    const result = await strapi.db.query(uid).deleteMany({});\n\n    if (result) {\n      updateResults(result.count, uid);\n    }\n  });\n\n  await Promise.all(deletePromises);\n\n  return results;\n};\n\nconst useResults = (\n  keys: string[]\n): [IDeleteResults, (count: number, key?: string) => void | never] => {\n  const results: IDeleteResults = {\n    count: 0,\n    aggregate: keys.reduce((acc, key) => ({ ...acc, [key]: { count: 0 } }), {}),\n  };\n\n  const update = (count: number, key?: string) => {\n    if (key) {\n      if (!(key in results.aggregate)) {\n        throw new ProviderTransferError(`Unknown key \"${key}\" provided in results update`);\n      }\n\n      results.aggregate[key].count += count;\n    }\n\n    results.count += count;\n  };\n\n  return [results, update];\n};\n\nexport * from './entities';\nexport * from './configuration';\nexport * from './links';\n"],"names":["deleteRecords","strapi","options","entities","deleteEntitiesRecords","configuration","deleteConfigurationRecords","count","models","get","contentTypes","Object","values","contentTypesToClear","filter","contentType","removeThisContentType","include","includes","uid","exclude","filters","every","map","modelsToClear","model","removeThisModel","results","updateResults","useResults","contentTypeQuery","queries","contentTypePromises","result","deleteMany","params","modelsPromises","db","query","Promise","all","coreStore","webhook","push","deletePromises","keys","aggregate","reduce","acc","key","update","ProviderTransferError"],"mappings":"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"}