{"version":3,"file":"folderAfterChange.mjs","names":["folderAfterChangeHook: CollectionAfterChangeHook","collectionSlug: string"],"sources":["../../src/collectionHooks/folderAfterChange.ts"],"sourcesContent":["import { MediaCloudErrors } from '../types/errors'\nimport { useErrorHandler } from '../hooks/useErrorHandler'\nimport { buildS3Path } from '../utils/buildS3Path'\n\nimport type { CollectionAfterChangeHook } from 'payload'\n\nexport const folderAfterChangeHook: CollectionAfterChangeHook = async ({\n  doc,\n  previousDoc,\n  req,\n}) => {\n  const { throwError } = useErrorHandler()\n\n  // Only proceed if the folder name has actually changed\n  if (doc.name === previousDoc.name) {\n    return doc\n  }\n\n  const { custom } = req?.payload?.config ?? {}\n  const collectionSlug: string =\n    custom?.mediaCloud?.options?.collection ?? 'media'\n\n  const foldersSlug =\n    typeof req.payload.config.folders === 'object'\n      ? req.payload.config.folders.slug\n      : 'payload-folders'\n\n  // Fetch the renamed folder with fully populated parent folders so we can\n  // reconstruct the full path prefix (e.g. \"grandparent/parent/thisFolder\")\n  let populatedFolder\n  try {\n    populatedFolder = await req.payload.findByID({\n      id: doc.id,\n      collection: foldersSlug,\n      select: { name: true, folder: true },\n      depth: 20,\n    })\n  } catch (error) {\n    throwError({ ...MediaCloudErrors.FOLDER_FETCH_ERROR, cause: error })\n    return doc\n  }\n\n  if (!populatedFolder) {\n    return doc\n  }\n\n  // Build the new path prefix using the current (already renamed) folder document\n  const newPrefix = buildS3Path(populatedFolder)\n\n  // Build the old path prefix by substituting the previous name into the same\n  // folder structure – the parent chain is identical, only the leaf name changed\n  const oldPrefix = buildS3Path({ ...populatedFolder, name: previousDoc.name })\n\n  if (!oldPrefix || !newPrefix || oldPrefix === newPrefix) {\n    return doc\n  }\n\n  // Find and update all media items whose path starts with the old folder prefix.\n  // Pagination ensures every item is processed regardless of collection size.\n  let page = 1\n  let hasNextPage = true\n\n  while (hasNextPage) {\n    let mediaItems\n    try {\n      mediaItems = await req.payload.find({\n        collection: collectionSlug,\n        where: {\n          path: {\n            contains: oldPrefix,\n          },\n        },\n        limit: 100,\n        page,\n        depth: 0,\n      })\n    } catch (error) {\n      throwError({ ...MediaCloudErrors.FOLDER_FETCH_ERROR, cause: error })\n      break\n    }\n\n    // Only update items whose path starts with `oldPrefix` exactly\n    const itemsToUpdate = mediaItems.docs.filter((item) =>\n      item.path?.startsWith(`${oldPrefix}/`)\n    )\n\n    await Promise.all(\n      itemsToUpdate.map(async (item) => {\n        const newPath = (item.path as string).replace(oldPrefix, newPrefix)\n\n        try {\n          await req.payload.update({\n            collection: collectionSlug,\n            id: item.id,\n            data: { path: newPath },\n          })\n        } catch (error) {\n          throwError({ ...MediaCloudErrors.PATH_UPDATE_ERROR, cause: error })\n        }\n      })\n    )\n\n    hasNextPage = mediaItems.hasNextPage\n    page++\n  }\n\n  return doc\n}\n"],"mappings":";;;;;AAMA,MAAaA,wBAAmD,OAAO,EACrE,KACA,aACA,UACI;CACJ,MAAM,EAAE,eAAe,iBAAiB;AAGxC,KAAI,IAAI,SAAS,YAAY,KAC3B,QAAO;CAGT,MAAM,EAAE,WAAW,KAAK,SAAS,UAAU,EAAE;CAC7C,MAAMC,iBACJ,QAAQ,YAAY,SAAS,cAAc;CAE7C,MAAM,cACJ,OAAO,IAAI,QAAQ,OAAO,YAAY,WAClC,IAAI,QAAQ,OAAO,QAAQ,OAC3B;CAIN,IAAI;AACJ,KAAI;AACF,oBAAkB,MAAM,IAAI,QAAQ,SAAS;GAC3C,IAAI,IAAI;GACR,YAAY;GACZ,QAAQ;IAAE,MAAM;IAAM,QAAQ;IAAM;GACpC,OAAO;GACR,CAAC;UACK,OAAO;AACd,aAAW;GAAE,GAAG,iBAAiB;GAAoB,OAAO;GAAO,CAAC;AACpE,SAAO;;AAGT,KAAI,CAAC,gBACH,QAAO;CAIT,MAAM,YAAY,YAAY,gBAAgB;CAI9C,MAAM,YAAY,YAAY;EAAE,GAAG;EAAiB,MAAM,YAAY;EAAM,CAAC;AAE7E,KAAI,CAAC,aAAa,CAAC,aAAa,cAAc,UAC5C,QAAO;CAKT,IAAI,OAAO;CACX,IAAI,cAAc;AAElB,QAAO,aAAa;EAClB,IAAI;AACJ,MAAI;AACF,gBAAa,MAAM,IAAI,QAAQ,KAAK;IAClC,YAAY;IACZ,OAAO,EACL,MAAM,EACJ,UAAU,WACX,EACF;IACD,OAAO;IACP;IACA,OAAO;IACR,CAAC;WACK,OAAO;AACd,cAAW;IAAE,GAAG,iBAAiB;IAAoB,OAAO;IAAO,CAAC;AACpE;;EAIF,MAAM,gBAAgB,WAAW,KAAK,QAAQ,SAC5C,KAAK,MAAM,WAAW,GAAG,UAAU,GAAG,CACvC;AAED,QAAM,QAAQ,IACZ,cAAc,IAAI,OAAO,SAAS;GAChC,MAAM,UAAW,KAAK,KAAgB,QAAQ,WAAW,UAAU;AAEnE,OAAI;AACF,UAAM,IAAI,QAAQ,OAAO;KACvB,YAAY;KACZ,IAAI,KAAK;KACT,MAAM,EAAE,MAAM,SAAS;KACxB,CAAC;YACK,OAAO;AACd,eAAW;KAAE,GAAG,iBAAiB;KAAmB,OAAO;KAAO,CAAC;;IAErE,CACH;AAED,gBAAc,WAAW;AACzB;;AAGF,QAAO"}