{"version":3,"file":"links.mjs","sources":["../../../../../../src/strapi/providers/local-destination/strategies/restore/links.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport type { Core } from '@strapi/types';\nimport { ProviderTransferError } from '../../../../../errors/providers';\nimport { ILink, Transaction } from '../../../../../types';\nimport { createLinkQuery } from '../../../../queries/link';\nimport { resolveLinkRef } from './resolve-link-ref';\n\ninterface ErrorWithCode extends Error {\n  code: string;\n}\n\nconst isErrorWithCode = (error: any): error is ErrorWithCode => {\n  return error && typeof error.code === 'string';\n};\n\nconst isForeignKeyConstraintError = (e: Error) => {\n  const MYSQL_FK_ERROR_CODES = ['1452', '1557', '1216', '1217', '1451'];\n  const POSTGRES_FK_ERROR_CODE = '23503';\n  const SQLITE_FK_ERROR_CODE = 'SQLITE_CONSTRAINT_FOREIGNKEY';\n\n  if (isErrorWithCode(e) && e.code) {\n    return [SQLITE_FK_ERROR_CODE, POSTGRES_FK_ERROR_CODE, ...MYSQL_FK_ERROR_CODES].includes(e.code);\n  }\n\n  return e.message.toLowerCase().includes('foreign key constraint');\n};\n\nexport const createLinksWriteStream = (\n  mapID: (uid: string, id: number) => number | undefined,\n  strapi: Core.Strapi,\n  transaction?: Transaction,\n  onWarning?: (message: string) => void\n) => {\n  return new Writable({\n    objectMode: true,\n    async write(link: ILink, _encoding, callback) {\n      await transaction?.attach(async (trx) => {\n        const { left, right } = link;\n        const query = createLinkQuery(strapi, trx);\n\n        const originalLeftRef = left.ref;\n        const originalRightRef = right.ref;\n\n        const mappedLeftRef = resolveLinkRef(strapi, link, 'left', mapID);\n        const mappedRightRef = resolveLinkRef(strapi, link, 'right', mapID);\n\n        // A missing mapping means the referenced row was never transferred\n        // during the entities stage (e.g. an orphaned component or a dangling\n        // reference in the source database). Falling back to the original ID\n        // would either violate a foreign key constraint — which aborts the\n        // whole transaction on PostgreSQL — or silently attach the link to an\n        // unrelated row, so the link is skipped instead.\n        if (mappedLeftRef === undefined || mappedRightRef === undefined) {\n          const missingRefs = [\n            ...(mappedLeftRef === undefined ? [`${left.type}:${originalLeftRef}`] : []),\n            ...(mappedRightRef === undefined ? [`${right.type}:${originalRightRef}`] : []),\n          ].join(' and ');\n\n          onWarning?.(\n            `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} because ${missingRefs} was not transferred during the entities stage.`\n          );\n\n          return callback(null);\n        }\n\n        left.ref = mappedLeftRef;\n        right.ref = mappedRightRef;\n\n        try {\n          await query().insert(link);\n        } catch (e) {\n          if (e instanceof Error) {\n            if (isForeignKeyConstraintError(e)) {\n              onWarning?.(\n                `Skipping link ${left.type}:${originalLeftRef} -> ${right.type}:${originalRightRef} due to a foreign key constraint.`\n              );\n              return callback(null);\n            }\n            return callback(e);\n          }\n\n          return callback(\n            new ProviderTransferError(\n              `An error happened while trying to import a ${left.type} link.`\n            )\n          );\n        }\n\n        callback(null);\n      });\n    },\n  });\n};\n"],"names":["isErrorWithCode","error","code","isForeignKeyConstraintError","e","MYSQL_FK_ERROR_CODES","POSTGRES_FK_ERROR_CODE","SQLITE_FK_ERROR_CODE","includes","message","toLowerCase","createLinksWriteStream","mapID","strapi","transaction","onWarning","Writable","objectMode","write","link","_encoding","callback","attach","trx","left","right","query","createLinkQuery","originalLeftRef","ref","originalRightRef","mappedLeftRef","resolveLinkRef","mappedRightRef","undefined","missingRefs","type","join","insert","Error","ProviderTransferError"],"mappings":"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"}