{"version":3,"file":"link.mjs","sources":["../../../src/strapi/queries/link.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport { clone, isNil } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\n\nimport { ILink } from '../../../types';\n\n// TODO: Remove any types when we'll have types for DB metadata\n\nexport const createLinkQuery = (strapi: Core.Strapi, trx?: Knex.Transaction) => {\n  const query = () => {\n    const { connection } = strapi.db;\n\n    // TODO: Export utils from database and use the addSchema that is already written\n    const addSchema = (tableName: string) => {\n      const schemaName = connection.client.connectionSettings.schema;\n      return schemaName ? `${schemaName}.${tableName}` : tableName;\n    };\n\n    async function* generateAllForAttribute(uid: string, fieldName: string): AsyncGenerator<ILink> {\n      const metadata = strapi.db.metadata.get(uid);\n\n      if (!metadata) {\n        throw new Error(`No metadata found for ${uid}`);\n      }\n\n      const attributes = filterValidRelationalAttributes(metadata.attributes);\n\n      if (!(fieldName in attributes)) {\n        throw new Error(`${fieldName} is not a valid relational attribute name`);\n      }\n\n      const attribute = attributes[fieldName];\n\n      const kind = getLinkKind(attribute, uid);\n      const { relation, target } = attribute;\n\n      // The relation is stored in the same table\n      // TODO: handle manyToOne joinColumn\n      if (attribute.joinColumn) {\n        const joinColumnName: string = attribute.joinColumn.name;\n\n        const qb = connection\n          .queryBuilder()\n          .select('id', joinColumnName)\n          .from(addSchema(metadata.tableName));\n\n        if (trx) {\n          qb.transacting(trx);\n        }\n\n        // TODO: stream the query to improve performances\n        const entries = await qb;\n\n        for (const entry of entries) {\n          const ref = entry[joinColumnName];\n\n          if (ref !== null) {\n            yield {\n              kind,\n              relation,\n              left: { type: uid, ref: entry.id, field: fieldName },\n              right: { type: target, ref },\n            };\n          }\n        }\n      }\n\n      // The relation uses a join table\n      if (attribute.joinTable) {\n        const {\n          name,\n          joinColumn,\n          inverseJoinColumn,\n          orderColumnName,\n          morphColumn,\n          inverseOrderColumnName,\n        } = attribute.joinTable;\n\n        const qb = connection.queryBuilder().from(addSchema(name));\n\n        type Columns = {\n          left: { ref: string | null; order?: string };\n          right: { ref: string | null; order?: string; type?: string; field?: string };\n        };\n\n        const columns: Columns = {\n          left: { ref: null },\n          right: { ref: null },\n        };\n\n        const left: Partial<ILink['left']> = { type: uid, field: fieldName };\n        const right: Partial<ILink['right']> = {};\n\n        if (kind === 'relation.basic' || kind === 'relation.circular') {\n          right.type = attribute.target;\n          right.field = attribute.inversedBy;\n\n          columns.left.ref = joinColumn.name;\n          columns.right.ref = inverseJoinColumn.name;\n\n          if (orderColumnName) {\n            columns.left.order = orderColumnName as string;\n          }\n\n          if (inverseOrderColumnName) {\n            columns.right.order = inverseOrderColumnName as string;\n          }\n        }\n\n        if (kind === 'relation.morph') {\n          columns.left.ref = joinColumn.name;\n\n          columns.right.ref = morphColumn.idColumn.name;\n          columns.right.type = morphColumn.typeColumn.name;\n          columns.right.field = 'field';\n          columns.right.order = 'order';\n        }\n\n        const validColumns = [\n          // Left\n          columns.left.ref,\n          columns.left.order,\n          // Right\n          columns.right.ref,\n          columns.right.type,\n          columns.right.field,\n          columns.right.order,\n        ].filter((column: string | null | undefined) => !isNil(column));\n\n        qb.select(validColumns);\n\n        if (trx) {\n          qb.transacting(trx);\n        }\n\n        // TODO: stream the query to improve performances\n        const entries = await qb;\n\n        for (const entry of entries) {\n          if (columns.left.ref) {\n            left.ref = entry[columns.left.ref];\n          }\n\n          if (columns.right.ref) {\n            right.ref = entry[columns.right.ref];\n          }\n\n          if (columns.left.order) {\n            left.pos = entry[columns.left.order as string];\n          }\n\n          if (columns.right.order) {\n            right.pos = entry[columns.right.order as string];\n          }\n\n          if (columns.right.type) {\n            right.type = entry[columns.right.type as string];\n          }\n\n          if (columns.right.field) {\n            right.field = entry[columns.right.field as string];\n          }\n\n          const link: ILink = {\n            kind,\n            relation,\n            left: clone(left as ILink['left']),\n            right: clone(right as ILink['right']),\n          };\n\n          yield link;\n        }\n      }\n\n      if (attribute.morphColumn) {\n        const { typeColumn, idColumn } = attribute.morphColumn;\n\n        const qb = connection\n          .queryBuilder()\n          .select('id', typeColumn.name, idColumn.name)\n          .from(addSchema(metadata.tableName))\n          .whereNotNull(typeColumn.name)\n          .whereNotNull(idColumn.name);\n\n        if (trx) {\n          qb.transacting(trx);\n        }\n\n        const entries = await qb;\n\n        for (const entry of entries) {\n          const ref = entry[idColumn.name];\n\n          yield {\n            kind,\n            relation,\n            left: { type: uid, ref: entry.id, field: fieldName },\n            right: { type: entry[typeColumn.name], ref },\n          };\n        }\n      }\n    }\n\n    async function* generateAll(uid: string): AsyncGenerator<ILink> {\n      const metadata = strapi.db.metadata.get(uid);\n\n      if (!metadata) {\n        throw new Error(`No metadata found for ${uid}`);\n      }\n\n      const attributes = filterValidRelationalAttributes(metadata.attributes);\n\n      for (const fieldName of Object.keys(attributes)) {\n        for await (const link of generateAllForAttribute(uid, fieldName)) {\n          yield link;\n        }\n      }\n    }\n\n    const insert = async (link: ILink) => {\n      const { kind, left, right } = link;\n\n      const metadata = strapi.db.metadata.get(left.type);\n      const attribute = metadata.attributes[left.field];\n\n      const payload = {};\n\n      /**\n       * This _should_ only happen for attributes that are added dynamically e.g. review-workflow stages\n       * and a user is importing EE data into a CE project.\n       */\n      if (!attribute) {\n        return;\n      }\n\n      if (attribute.type !== 'relation') {\n        throw new Error(`Attribute ${left.field} is not a relation`);\n      }\n\n      if ('joinColumn' in attribute && attribute.joinColumn) {\n        const joinColumnName = attribute.joinColumn.name;\n\n        // Note: this addSchema may not be necessary, but is added for safety\n        const qb = connection(addSchema(metadata.tableName))\n          .where('id', left.ref)\n          .update({ [joinColumnName]: right.ref });\n        if (trx) {\n          qb.transacting(trx);\n        }\n        await qb;\n      }\n\n      if ('joinTable' in attribute && attribute.joinTable) {\n        const { joinTable } = attribute;\n\n        if (joinTable.joinColumn) {\n          Object.assign(payload, { [joinTable.joinColumn.name]: left.ref });\n        }\n\n        const assignInverseColumn = () => {\n          if ('inverseJoinColumn' in joinTable && joinTable.inverseJoinColumn) {\n            Object.assign(payload, {\n              [joinTable.inverseJoinColumn.name]: right.ref,\n            });\n          }\n        };\n\n        const assignOrderColumns = () => {\n          if ('orderColumnName' in joinTable && joinTable.orderColumnName) {\n            Object.assign(payload, { [joinTable.orderColumnName]: left.pos ?? null });\n          }\n\n          if ('inverseOrderColumnName' in joinTable && joinTable.inverseOrderColumnName) {\n            Object.assign(payload, { [joinTable.inverseOrderColumnName]: right.pos ?? null });\n          }\n        };\n\n        const assignMorphColumns = () => {\n          if ('morphColumn' in joinTable && joinTable.morphColumn) {\n            const { idColumn, typeColumn } = joinTable.morphColumn ?? {};\n\n            if (idColumn) {\n              Object.assign(payload, { [idColumn.name]: right.ref });\n            }\n\n            if (typeColumn) {\n              Object.assign(payload, { [typeColumn.name]: right.type });\n            }\n\n            Object.assign(payload, { order: right.pos ?? null, field: right.field ?? null });\n          }\n        };\n\n        if (kind === 'relation.basic' || kind === 'relation.circular') {\n          assignInverseColumn();\n        }\n\n        if (kind === 'relation.morph') {\n          assignMorphColumns();\n        }\n\n        assignOrderColumns();\n        const qb = connection.insert(payload).into(addSchema(joinTable.name));\n        if (trx) {\n          await qb.transacting(trx);\n        }\n      }\n\n      if ('morphColumn' in attribute && attribute.morphColumn) {\n        const { morphColumn } = attribute;\n\n        const qb = connection(addSchema(metadata.tableName))\n          .where('id', left.ref)\n          .update({\n            [morphColumn.idColumn.name]: right.ref,\n            [morphColumn.typeColumn.name]: right.type,\n          });\n\n        if (trx) {\n          qb.transacting(trx);\n        }\n\n        await qb;\n      }\n    };\n\n    return { generateAll, generateAllForAttribute, insert };\n  };\n\n  return query;\n};\n\nexport const filterValidRelationalAttributes = (attributes: Record<string, any>) => {\n  const isOwner = (attribute: any) => {\n    return attribute.owner || (!attribute.mappedBy && !attribute.morphBy);\n  };\n\n  const isComponentLike = (attribute: any) => attribute.joinTable?.name.endsWith('_cmps');\n\n  return Object.entries(attributes)\n    .filter(([, attribute]) => {\n      return attribute.type === 'relation' && isOwner(attribute) && !isComponentLike(attribute);\n    })\n    .reduce<Record<string, any>>((acc, [key, attribute]) => ({ ...acc, [key]: attribute }), {});\n};\n\nconst getLinkKind = (attribute: any, uid: string): ILink['kind'] => {\n  if (attribute.relation.startsWith('morph')) {\n    return 'relation.morph';\n  }\n\n  if (attribute.target === uid) {\n    return 'relation.circular';\n  }\n\n  return 'relation.basic';\n};\n"],"names":["createLinkQuery","strapi","trx","query","connection","db","addSchema","tableName","schemaName","client","connectionSettings","schema","generateAllForAttribute","uid","fieldName","metadata","get","Error","attributes","filterValidRelationalAttributes","attribute","kind","getLinkKind","relation","target","joinColumn","joinColumnName","name","qb","queryBuilder","select","from","transacting","entries","entry","ref","left","type","id","field","right","joinTable","inverseJoinColumn","orderColumnName","morphColumn","inverseOrderColumnName","columns","inversedBy","order","idColumn","typeColumn","validColumns","filter","column","isNil","pos","link","clone","whereNotNull","generateAll","Object","keys","insert","payload","where","update","assign","assignInverseColumn","assignOrderColumns","assignMorphColumns","into","isOwner","owner","mappedBy","morphBy","isComponentLike","endsWith","reduce","acc","key","startsWith"],"mappings":"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"}