{"version":3,"file":"folder.mjs","sources":["../../../../../server/src/controllers/validation/admin/folder.ts"],"sourcesContent":["import { isUndefined, get, isNil } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\nimport { getService } from '../../../utils';\nimport { FOLDER_MODEL_UID } from '../../../constants';\nimport { folderExists } from './utils';\nimport { isFolderOrChild } from '../../utils/folders';\n\nconst NO_SLASH_REGEX = /^[^/]+$/;\nconst NO_SPACES_AROUND = /^(?! ).+(?<! )$/;\n\nconst isNameUniqueInFolder = (id?: number): yup.TestFunction<string | undefined> => {\n  return async function test(name?: string) {\n    const { exists } = getService('folder');\n    const filters: Record<string, unknown> = { name, parent: this.parent.parent || null };\n    if (id) {\n      filters.id = { $ne: id };\n\n      if (isUndefined(name)) {\n        const existingFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({ where: { id } });\n        filters.name = get('name', existingFolder);\n      }\n    }\n\n    const doesExist = await exists(filters);\n    return !doesExist;\n  };\n};\n\nconst validateCreateFolderSchema = yup\n  .object()\n  .shape({\n    name: yup\n      .string()\n      .min(1)\n      .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n      .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n      .required()\n      .test('is-folder-unique', 'A folder with this name already exists', isNameUniqueInFolder()),\n    parent: yup\n      .strapiID()\n      .nullable()\n      .test('folder-exists', 'parent folder does not exist', folderExists),\n  })\n  .noUnknown()\n  .required();\n\nconst validateUpdateFolderSchema = (id: number) =>\n  yup\n    .object()\n    .shape({\n      name: yup\n        .string()\n        .min(1)\n        .matches(NO_SLASH_REGEX, 'name cannot contain slashes')\n        .matches(NO_SPACES_AROUND, 'name cannot start or end with a whitespace')\n        .test(\n          'is-folder-unique',\n          'A folder with this name already exists',\n          isNameUniqueInFolder(id)\n        ),\n      parent: yup\n        .strapiID()\n        .nullable()\n        .test('folder-exists', 'parent folder does not exist', folderExists)\n        .test(\n          'dont-move-inside-self',\n          'folder cannot be moved inside itself',\n          async function test(parent) {\n            if (isNil(parent)) return true;\n\n            const destinationFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n              select: ['path'],\n              where: { id: parent },\n            });\n\n            const currentFolder = await strapi.db.query(FOLDER_MODEL_UID).findOne({\n              select: ['path'],\n              where: { id },\n            });\n\n            if (!destinationFolder || !currentFolder) return true;\n\n            return !isFolderOrChild(destinationFolder, currentFolder);\n          }\n        ),\n    })\n    .noUnknown()\n    .required();\n\nexport const validateCreateFolder = validateYupSchema(validateCreateFolderSchema);\nexport const validateUpdateFolder = (id: number) =>\n  validateYupSchema(validateUpdateFolderSchema(id));\n"],"names":["NO_SLASH_REGEX","NO_SPACES_AROUND","isNameUniqueInFolder","id","test","name","exists","getService","filters","parent","$ne","isUndefined","existingFolder","strapi","db","query","FOLDER_MODEL_UID","findOne","where","get","doesExist","validateCreateFolderSchema","yup","object","shape","string","min","matches","required","strapiID","nullable","folderExists","noUnknown","validateUpdateFolderSchema","isNil","destinationFolder","select","currentFolder","isFolderOrChild","validateCreateFolder","validateYupSchema","validateUpdateFolder"],"mappings":"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"}