{"version":3,"file":"api-handler.mjs","sources":["../../../server/src/services/api-handler.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Internal } from '@strapi/types';\n\n/**\n * Deletes the API folder of a contentType\n */\nexport async function clear(uid: Internal.UID.ContentType) {\n  // TODO double check if this is the correct way to get the apiName\n  const { apiName, modelName } = strapi.contentTypes[uid] as any;\n\n  const apiFolder = path.join(strapi.dirs.app.api, apiName);\n\n  await recursiveRemoveFiles(apiFolder, createDeleteApiFunction(modelName));\n  await deleteBackup(uid);\n}\n\n/**\n * Backups the API folder of a contentType\n * @param {string} uid content type uid\n */\nexport async function backup(uid: Internal.UID.ContentType) {\n  const { apiName } = strapi.contentTypes[uid] as any;\n\n  const apiFolder = path.join(strapi.dirs.app.api, apiName);\n  const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n  // backup the api folder\n  await fse.copy(apiFolder, backupFolder);\n}\n\n/**\n * Deletes an API backup folder\n */\nasync function deleteBackup(uid: Internal.UID.ContentType) {\n  const { apiName } = strapi.contentTypes[uid] as any;\n\n  const backupFolder = path.join(strapi.dirs.app.api, '.backup');\n  const apiBackupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n  await fse.remove(apiBackupFolder);\n\n  const list = await fse.readdir(backupFolder);\n  if (list.length === 0) {\n    await fse.remove(backupFolder);\n  }\n}\n\n/**\n * Rollbacks the API folder of a contentType\n */\nexport async function rollback(uid: Internal.UID.ContentType) {\n  const { apiName } = strapi.contentTypes[uid] as any;\n\n  const apiFolder = path.join(strapi.dirs.app.api, apiName);\n  const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n  try {\n    await fse.access(backupFolder);\n  } catch {\n    throw new Error('Cannot rollback api that was not backed up');\n  }\n\n  await fse.remove(apiFolder);\n  await fse.copy(backupFolder, apiFolder);\n  await deleteBackup(uid);\n}\n\n/**\n * Creates a delete function to clear an api folder\n */\nconst createDeleteApiFunction = (baseName: string) => {\n  /**\n   * Delets a file in an api.\n   * Will only update routes.json instead of deleting it if other routes are present\n   */\n  return async (filePath: string) => {\n    const fileName = path.basename(filePath, path.extname(filePath));\n\n    const isSchemaFile = filePath.endsWith(`${baseName}/schema.json`);\n    if (fileName === baseName || isSchemaFile) {\n      return fse.remove(filePath);\n    }\n  };\n};\n\n/**\n * Deletes a folder recursively using a delete function\n * @param {string} folder folder to delete\n */\nconst recursiveRemoveFiles = async (folder: string, deleteFn: (file: string) => unknown) => {\n  const filesName = await fse.readdir(folder);\n\n  for (const fileName of filesName) {\n    const filePath = path.join(folder, fileName);\n\n    const stat = await fse.stat(filePath);\n\n    if (stat.isDirectory()) {\n      await recursiveRemoveFiles(filePath, deleteFn);\n    } else {\n      await deleteFn(filePath);\n    }\n  }\n\n  const files = await fse.readdir(folder);\n  if (files.length === 0) {\n    await fse.remove(folder);\n  }\n};\n"],"names":["clear","uid","apiName","modelName","strapi","contentTypes","apiFolder","path","join","dirs","app","api","recursiveRemoveFiles","createDeleteApiFunction","deleteBackup","backup","backupFolder","fse","copy","apiBackupFolder","remove","list","readdir","length","rollback","access","Error","baseName","filePath","fileName","basename","extname","isSchemaFile","endsWith","folder","deleteFn","filesName","stat","isDirectory","files"],"mappings":"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"}