{"version":3,"file":"index.mjs","sources":["../../src/entity-manager/index.ts"],"sourcesContent":["import {\n  castArray,\n  compact,\n  difference,\n  differenceWith,\n  has,\n  isArray,\n  isEmpty,\n  isEqual,\n  isInteger,\n  isNil,\n  isNull,\n  isNumber,\n  isObject,\n  isPlainObject,\n  isString,\n  isUndefined,\n  map,\n  pick,\n  uniqBy,\n  uniqWith,\n} from 'lodash/fp';\n\nimport * as types from '../utils/types';\nimport { createField } from '../fields';\nimport { createQueryBuilder } from '../query';\nimport { createRepository } from './entity-repository';\nimport {\n  deleteRelatedMorphOneRelationsAfterMorphToManyUpdate,\n  encodePolymorphicRelation,\n  encodePolymorphicId,\n} from './morph-relations';\nimport {\n  isBidirectional,\n  isAnyToOne,\n  isOneToAny,\n  hasOrderColumn,\n  hasInverseOrderColumn,\n} from '../metadata';\nimport {\n  deletePreviousOneToAnyRelations,\n  deletePreviousAnyToOneRelations,\n  deleteRelations,\n  cleanOrderColumns,\n} from './regular-relations';\nimport { relationsOrderer } from './relations-orderer';\nimport type { Database } from '..';\nimport type { Meta } from '../metadata';\nimport type { ID } from '../types';\nimport { EntityManager, Repository, Entity } from './types';\n\nexport * from './types';\n\n/**\n * Batched join-table insert for SQLite etc. (GH#25198). Uses dialect.getBatchInsertSize().\n * All batches run in the same transaction so the operation is atomic; no partial state on failure.\n * Caller must pass an active transaction (trx) — do not call without one.\n */\nasync function batchInsertJoinTable(\n  db: Database,\n  joinTableName: string,\n  rows: Record<string, unknown>[],\n  trx: any,\n  options?: { onConflict?: string[]; merge?: string[]; ignore?: boolean }\n): Promise<void> {\n  if (rows.length === 0) return;\n  if (trx == null) {\n    throw new Error(\n      'batchInsertJoinTable requires a transaction so all batches commit or roll back atomically'\n    );\n  }\n  const batchSize = db.dialect.getBatchInsertSize();\n  for (let i = 0; i < rows.length; i += batchSize) {\n    const chunk = rows.slice(i, i + batchSize);\n    let qb = createQueryBuilder(joinTableName, db).insert(chunk).transacting(trx);\n    if (options?.onConflict) {\n      qb = qb.onConflict(options.onConflict);\n      if (options.merge) qb.merge(options.merge);\n      else if (options.ignore) qb.ignore();\n    }\n    await qb.execute();\n  }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  isObject(value) && !isNil(value);\n\nconst toId = (value: unknown | { id: unknown }): ID => {\n  if (isRecord(value) && 'id' in value && isValidId(value.id)) {\n    return value.id;\n  }\n\n  if (isValidId(value)) {\n    return value;\n  }\n\n  throw new Error(`Invalid id, expected a string or integer, got ${JSON.stringify(value)}`);\n};\nconst toIds = (value: unknown): ID[] => castArray(value || []).map(toId);\n\nconst isValidId = (value: unknown): value is ID => isString(value) || isInteger(value);\n\nconst isValidObjectId = (value: unknown): value is Entity =>\n  isRecord(value) && 'id' in value && isValidId(value.id);\n\nconst toIdArray = (\n  data: unknown\n): {\n  id: ID;\n  __pivot?: { [key: string]: any };\n  [key: string]: any;\n}[] => {\n  const array = castArray(data)\n    .filter((datum) => !isNil(datum))\n    .map((datum) => {\n      // if it is a string or an integer return an obj with id = to datum\n      if (isValidId(datum)) {\n        return { id: datum, __pivot: {} };\n      }\n\n      // if it is an object check it has at least a valid id\n      if (!isValidObjectId(datum)) {\n        throw new Error(`Invalid id, expected a string or integer, got ${datum}`);\n      }\n\n      return datum;\n    });\n\n  return uniqWith(isEqual, array);\n};\n\ntype ScalarAssoc = string | number | null;\ntype Assocs =\n  | ScalarAssoc\n  | { id: ScalarAssoc | Array<ScalarAssoc> }\n  | Array<ScalarAssoc>\n  | {\n      set?: Array<ScalarAssoc> | null;\n      options?: { strict?: boolean };\n      connect?: Array<{\n        id: ScalarAssoc;\n        position?: { start?: boolean; end?: boolean; before?: ID; after?: ID };\n        __pivot?: any;\n        __type?: any;\n      }> | null;\n      disconnect?: Array<ScalarAssoc> | null;\n    };\n\nconst toAssocs = (data: Assocs) => {\n  if (\n    isArray(data) ||\n    isString(data) ||\n    isNumber(data) ||\n    isNull(data) ||\n    (isRecord(data) && 'id' in data)\n  ) {\n    return {\n      set: isNull(data) ? data : toIdArray(data),\n    };\n  }\n\n  if (data?.set) {\n    return {\n      set: isNull(data.set) ? data.set : toIdArray(data.set),\n    };\n  }\n\n  return {\n    options: {\n      strict: data?.options?.strict,\n    },\n    connect: toIdArray(data?.connect).map((elm) => ({\n      id: elm.id,\n      position: elm.position ? elm.position : { end: true },\n      __pivot: elm.__pivot ?? {},\n      __type: elm.__type,\n    })),\n    disconnect: toIdArray(data?.disconnect),\n  };\n};\n\nconst processData = (\n  metadata: Meta,\n  data: Record<string, unknown> = {},\n  { withDefaults = false } = {}\n) => {\n  const { attributes } = metadata;\n\n  const obj: Record<string, unknown> = {};\n\n  for (const attributeName of Object.keys(attributes)) {\n    const attribute = attributes[attributeName];\n\n    if (types.isScalarAttribute(attribute)) {\n      const field = createField(attribute);\n\n      if (isUndefined(data[attributeName])) {\n        if (!isUndefined(attribute.default) && withDefaults) {\n          if (typeof attribute.default === 'function') {\n            obj[attributeName] = attribute.default();\n          } else {\n            obj[attributeName] = attribute.default;\n          }\n        }\n        continue;\n      }\n\n      if (\n        'validate' in field &&\n        typeof field.validate === 'function' &&\n        data[attributeName] !== null\n      ) {\n        field.validate(data[attributeName]);\n      }\n\n      const val = data[attributeName] === null ? null : field.toDB(data[attributeName]);\n\n      obj[attributeName] = val;\n    }\n\n    if (types.isRelationalAttribute(attribute)) {\n      // oneToOne & manyToOne\n      if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner) {\n        const joinColumnName = attribute.joinColumn.name;\n\n        // allow setting to null\n        let attrValue = !isUndefined(data[attributeName])\n          ? data[attributeName]\n          : data[joinColumnName];\n\n        // Legacy single-column storage: only one id fits. Take the last\n        // and warn — modern schemas use a join table that can hold both\n        // the draft and published rows of the related entry.\n        if (\n          isObject(attrValue) &&\n          !Array.isArray(attrValue) &&\n          'set' in attrValue &&\n          Array.isArray(attrValue.set)\n        ) {\n          const setIds = attrValue.set;\n          if (setIds.length > 1) {\n            strapi?.log?.warn?.(\n              `Multiple ids provided for xToOne relation \"${attributeName}\" stored in a single FK column; keeping only the last id. Consider using a join table (useJoinTable: true) to support multiple versions of a Draft-and-Publish target.`\n            );\n          }\n          attrValue = setIds.length > 0 ? setIds[setIds.length - 1] : null;\n        }\n\n        if (isNull(attrValue)) {\n          obj[joinColumnName] = attrValue;\n        } else if (!isUndefined(attrValue)) {\n          obj[joinColumnName] = toId(attrValue);\n        }\n\n        continue;\n      }\n\n      if ('morphColumn' in attribute && attribute.morphColumn && attribute.owner) {\n        const { idColumn, typeColumn, typeField = '__type' } = attribute.morphColumn;\n\n        const value = data[attributeName] as Record<string, unknown>;\n\n        if (value === null) {\n          Object.assign(obj, {\n            [idColumn.name]: null,\n            [typeColumn.name]: null,\n          });\n\n          continue;\n        }\n\n        if (!isUndefined(value)) {\n          if (!has('id', value) || !has(typeField, value)) {\n            throw new Error(`Expects properties ${typeField} an id to make a morph association`);\n          }\n\n          Object.assign(obj, {\n            [idColumn.name]: value.id,\n            [typeColumn.name]: value[typeField],\n          });\n        }\n      }\n    }\n  }\n\n  return obj;\n};\nexport const createEntityManager = (db: Database): EntityManager => {\n  const repoMap: Record<string, Repository> = {};\n\n  return {\n    async findOne(uid, params) {\n      const states = await db.lifecycles.run('beforeFindOne', uid, { params });\n\n      const result = await this.createQueryBuilder(uid)\n        .init(params)\n        .first()\n        .execute<Entity | null>();\n\n      await db.lifecycles.run('afterFindOne', uid, { params, result }, states);\n\n      return result;\n    },\n\n    // should we name it findOne because people are used to it ?\n    async findMany(uid, params) {\n      const states = await db.lifecycles.run('beforeFindMany', uid, { params });\n\n      const result = await this.createQueryBuilder(uid).init(params).execute<any[]>();\n\n      await db.lifecycles.run('afterFindMany', uid, { params, result }, states);\n\n      return result;\n    },\n\n    async count(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeCount', uid, { params });\n\n      const res = await this.createQueryBuilder(uid)\n        .init(pick(['_q', 'where', 'filters'], params))\n        .count()\n        .first()\n        .execute<{ count: number }>();\n\n      const result = Number(res.count);\n\n      await db.lifecycles.run('afterCount', uid, { params, result }, states);\n\n      return result;\n    },\n\n    async create(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeCreate', uid, { params });\n\n      const metadata = db.metadata.get(uid);\n      const { data } = params;\n\n      if (!isPlainObject(data)) {\n        throw new Error('Create expects a data object');\n      }\n\n      const dataToInsert = processData(metadata, data, { withDefaults: true });\n\n      const res = await this.createQueryBuilder(uid)\n        .insert(dataToInsert)\n        .execute<Array<ID | { id: ID }>>();\n\n      const id = isRecord(res[0]) ? res[0].id : res[0];\n\n      const trx = await strapi.db.transaction();\n      try {\n        await this.attachRelations(uid, id, data, { transaction: trx.get() });\n\n        await trx.commit();\n      } catch (e) {\n        await trx.rollback();\n        await this.createQueryBuilder(uid).where({ id }).delete().execute();\n        throw e;\n      }\n\n      // TODO: in case there is no select or populate specified return the inserted data ?\n      // TODO: do not trigger the findOne lifecycles ?\n      const result = await this.findOne(uid, {\n        where: { id },\n        select: params.select,\n        populate: params.populate,\n        filters: params.filters,\n      });\n\n      await db.lifecycles.run('afterCreate', uid, { params, result }, states);\n\n      return result;\n    },\n\n    // TODO: where do we handle relation processing for many queries ?\n    async createMany(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeCreateMany', uid, { params });\n\n      const metadata = db.metadata.get(uid);\n      const { data } = params;\n\n      if (!isArray(data)) {\n        throw new Error('CreateMany expects data to be an array');\n      }\n\n      const dataToInsert = data.map((datum) =>\n        processData(metadata, datum, { withDefaults: true })\n      );\n\n      if (isEmpty(dataToInsert)) {\n        throw new Error('Nothing to insert');\n      }\n\n      const batchSize = db.dialect.getBatchInsertSize();\n      const trx = await db.transaction();\n      let createdEntries: Array<ID | { id: ID }> = [];\n      try {\n        for (let i = 0; i < dataToInsert.length; i += batchSize) {\n          const chunk = dataToInsert.slice(i, i + batchSize);\n          const chunkResult = await this.createQueryBuilder(uid)\n            .insert(chunk)\n            .transacting(trx.get())\n            .execute<Array<ID | { id: ID }>>();\n          createdEntries = createdEntries.concat(\n            Array.isArray(chunkResult) ? chunkResult : [chunkResult]\n          );\n        }\n        await trx.commit();\n      } catch (e) {\n        await trx.rollback();\n        throw e;\n      }\n\n      const result = {\n        count: data.length,\n        ids: createdEntries.map((entry) => (typeof entry === 'object' ? entry?.id : entry)),\n      };\n\n      await db.lifecycles.run('afterCreateMany', uid, { params, result }, states);\n\n      return result;\n    },\n\n    async update(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeUpdate', uid, { params });\n\n      const metadata = db.metadata.get(uid);\n      const { where, data } = params;\n\n      if (!isPlainObject(data)) {\n        throw new Error('Update requires a data object');\n      }\n\n      if (isEmpty(where)) {\n        throw new Error('Update requires a where parameter');\n      }\n\n      const entity = await this.createQueryBuilder(uid)\n        .select('*')\n        .where(where)\n        .first()\n        .execute<{ id: ID }>({ mapResults: false });\n\n      if (!entity) {\n        return null;\n      }\n\n      const { id } = entity;\n\n      const dataToUpdate = processData(metadata, data);\n\n      if (!isEmpty(dataToUpdate)) {\n        await this.createQueryBuilder(uid).where({ id }).update(dataToUpdate).execute();\n      }\n\n      const trx = await strapi.db.transaction();\n      try {\n        await this.updateRelations(uid, id, data, { transaction: trx.get() });\n        await trx.commit();\n      } catch (e) {\n        await trx.rollback();\n        await this.createQueryBuilder(uid).where({ id }).update(entity).execute();\n        throw e;\n      }\n\n      // TODO: do not trigger the findOne lifecycles ?\n      const result = await this.findOne(uid, {\n        where: { id },\n        select: params.select,\n        populate: params.populate,\n        filters: params.filters,\n      });\n\n      await db.lifecycles.run('afterUpdate', uid, { params, result }, states);\n\n      return result;\n    },\n\n    // TODO: where do we handle relation processing for many queries ?\n    async updateMany(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeUpdateMany', uid, { params });\n\n      const metadata = db.metadata.get(uid);\n      const { where, data } = params;\n\n      const dataToUpdate = processData(metadata, data);\n\n      if (isEmpty(dataToUpdate)) {\n        throw new Error('Update requires data');\n      }\n\n      const updatedRows = await this.createQueryBuilder(uid)\n        .where(where)\n        .update(dataToUpdate)\n        .execute<number>();\n\n      const result = { count: updatedRows };\n\n      await db.lifecycles.run('afterUpdateMany', uid, { params, result }, states);\n\n      return result;\n    },\n\n    async delete(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeDelete', uid, { params });\n\n      const { where, select, populate } = params;\n\n      if (isEmpty(where)) {\n        throw new Error('Delete requires a where parameter');\n      }\n\n      // TODO: do not trigger the findOne lifecycles ?\n      const entity = await this.findOne(uid, {\n        select: select && ['id'].concat(select),\n        where,\n        populate,\n      });\n\n      if (!entity) {\n        return null;\n      }\n\n      const { id } = entity;\n\n      await this.createQueryBuilder(uid).where({ id }).delete().execute();\n\n      const trx = await strapi.db.transaction();\n      try {\n        await this.deleteRelations(uid, id, { transaction: trx.get() });\n\n        await trx.commit();\n      } catch (e) {\n        await trx.rollback();\n        throw e;\n      }\n\n      await db.lifecycles.run('afterDelete', uid, { params, result: entity }, states);\n\n      return entity;\n    },\n\n    // TODO: unlike delete(), deleteMany does not run deleteRelations() per removed row.\n    async deleteMany(uid, params = {}) {\n      const states = await db.lifecycles.run('beforeDeleteMany', uid, { params });\n\n      // Only apply filter criteria (_q / where / filters), same as count — not full findMany params.\n      // limit, offset, orderBy, populate, etc. must be ignored: populate throws on delete results,\n      // and pagination keys can make deleteMany diverge from findMany or delete an unexpected slice.\n      const deletedRows = await this.createQueryBuilder(uid)\n        .init(pick(['_q', 'where', 'filters'], params))\n        .delete()\n        .execute<number>({ mapResults: false });\n\n      const result = { count: deletedRows };\n\n      await db.lifecycles.run('afterDeleteMany', uid, { params, result }, states);\n\n      return result;\n    },\n\n    /**\n     * Attach relations to a new entity\n     */\n    async attachRelations(uid, id, data, options) {\n      const { attributes } = db.metadata.get(uid);\n      const { transaction: trx } = options ?? {};\n\n      for (const attributeName of Object.keys(attributes)) {\n        const attribute = attributes[attributeName];\n\n        const isValidLink = has(attributeName, data) && !isNil(data[attributeName]);\n\n        if (attribute.type !== 'relation' || !isValidLink) {\n          continue;\n        }\n\n        const cleanRelationData = toAssocs(data[attributeName]);\n\n        if (attribute.relation === 'morphOne' || attribute.relation === 'morphMany') {\n          /**\n           * morphOne and morphMany relations\n           */\n          const { target, morphBy } = attribute;\n\n          const targetAttribute = db.metadata.get(target).attributes[morphBy];\n          if (targetAttribute.type !== 'relation') {\n            throw new Error(\n              `Expected target attribute ${target}.${morphBy} to be a relation attribute`\n            );\n          }\n\n          if (targetAttribute.relation === 'morphToOne') {\n            // set columns\n            const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n            const relId = toId(cleanRelationData.set?.[0]);\n\n            await this.createQueryBuilder(target)\n              .update({ [idColumn.name]: id, [typeColumn.name]: uid })\n              .where({ id: relId })\n              .transacting(trx)\n              .execute();\n          } else if (targetAttribute.relation === 'morphToMany') {\n            const { joinTable } = targetAttribute;\n            const { joinColumn, morphColumn } = joinTable;\n\n            const { idColumn, typeColumn } = morphColumn;\n\n            if (isEmpty(cleanRelationData.set)) {\n              continue;\n            }\n\n            const rows =\n              cleanRelationData.set?.map((data, idx) => {\n                return {\n                  [joinColumn.name]: data.id,\n                  [idColumn.name]: id,\n                  [typeColumn.name]: uid,\n                  ...(('on' in joinTable && joinTable.on) || {}),\n                  ...(data.__pivot || {}),\n                  order: idx + 1,\n                  field: attributeName,\n                };\n              }) ?? [];\n\n            await batchInsertJoinTable(db, joinTable.name, rows, trx);\n          }\n\n          continue;\n        } else if (attribute.relation === 'morphToOne') {\n          /**\n           * morphToOne\n           */\n          // handled on the entry itself\n          continue;\n        } else if (attribute.relation === 'morphToMany') {\n          /**\n           * morphToMany\n           */\n          const { joinTable } = attribute;\n          const { joinColumn, morphColumn } = joinTable;\n\n          const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n          if (isEmpty(cleanRelationData.set) && isEmpty(cleanRelationData.connect)) {\n            continue;\n          }\n\n          // set happens before connect/disconnect\n          const dataset = cleanRelationData.set || cleanRelationData.connect || [];\n\n          const rows = dataset.map((data, idx) => ({\n            [joinColumn.name]: id,\n            [idColumn.name]: data.id,\n            [typeColumn.name]: data[typeField as '__type'],\n            ...(('on' in joinTable && joinTable.on) || {}),\n            ...(data.__pivot || {}),\n            order: idx + 1,\n          })) satisfies Record<string, any>[];\n\n          const orderMap = relationsOrderer(\n            [],\n            morphColumn.idColumn.name,\n            'order',\n            true // Always make a strict connect when inserting\n          )\n            .connect(\n              // Merge id & __type to get a single id key\n              dataset.map(encodePolymorphicRelation({ idColumn: 'id', typeColumn: typeField }))\n            )\n            .get()\n            // set the order based on the order of the ids\n            .reduce((acc, rel, idx) => ({ ...acc, [rel.id]: idx + 1 }), {} as Record<ID, number>);\n\n          rows.forEach((row: Record<string, unknown>) => {\n            const rowId = row[morphColumn.idColumn.name] as ID;\n            const rowType = row[morphColumn.typeColumn.name] as string;\n            const encodedId = encodePolymorphicId(rowId, rowType);\n\n            row.order = orderMap[encodedId];\n          });\n\n          // delete previous relations\n          await deleteRelatedMorphOneRelationsAfterMorphToManyUpdate(rows as any, {\n            uid,\n            attributeName,\n            joinTable,\n            db,\n            transaction: trx,\n          });\n\n          await batchInsertJoinTable(db, joinTable.name, rows, trx);\n\n          continue;\n        }\n\n        if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner) {\n          const relIdsToAdd = toIds(cleanRelationData.set);\n          if (\n            attribute.relation === 'oneToOne' &&\n            isBidirectional(attribute) &&\n            relIdsToAdd.length\n          ) {\n            await this.createQueryBuilder(uid)\n              .where({ [attribute.joinColumn.name]: relIdsToAdd, id: { $ne: id } })\n              .update({ [attribute.joinColumn.name]: null })\n              .transacting(trx)\n              .execute();\n          }\n\n          continue;\n        }\n\n        // oneToOne oneToMany on the non owning side\n        if ('joinColumn' in attribute && attribute.joinColumn && !attribute.owner) {\n          // need to set the column on the target\n          const { target } = attribute;\n\n          // TODO: check it is an id & the entity exists (will throw due to FKs otherwise so not a big pbl in SQL)\n          const relIdsToAdd = toIds(cleanRelationData.set);\n\n          await this.createQueryBuilder(target)\n            .where({ [attribute.joinColumn.referencedColumn]: id })\n            .update({ [attribute.joinColumn.referencedColumn]: null })\n            .transacting(trx)\n            .execute();\n\n          await this.createQueryBuilder(target)\n            .update({ [attribute.joinColumn.referencedColumn]: id })\n            // NOTE: works if it is an array or a single id\n            .where({ id: relIdsToAdd })\n            .transacting(trx)\n            .execute();\n        }\n\n        if ('joinTable' in attribute && attribute.joinTable) {\n          // need to set the column on the target\n\n          const { joinTable } = attribute;\n          const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } =\n            joinTable;\n\n          const relsToAdd = (cleanRelationData.set || cleanRelationData.connect) ?? [];\n          const relIdsToadd = toIds(relsToAdd);\n\n          if (isBidirectional(attribute) && isOneToAny(attribute)) {\n            await deletePreviousOneToAnyRelations({\n              id,\n              attribute,\n              relIdsToadd,\n              db,\n              transaction: trx,\n            });\n          }\n\n          // prepare new relations to insert\n          const insert = uniqBy('id', relsToAdd).map((data) => {\n            return {\n              [joinColumn.name]: id,\n              [inverseJoinColumn.name]: data.id,\n              ...(('on' in joinTable && joinTable.on) || {}),\n              ...(data.__pivot || {}),\n            };\n          }) satisfies Record<string, any>[];\n\n          // add order value\n          if (cleanRelationData.set && hasOrderColumn(attribute)) {\n            insert.forEach((data: Record<string, unknown>, idx) => {\n              data[orderColumnName] = idx + 1;\n            });\n          } else if (cleanRelationData.connect && hasOrderColumn(attribute)) {\n            // use position attributes to calculate order\n            const orderMap = relationsOrderer(\n              [],\n              inverseJoinColumn.name,\n              joinTable.orderColumnName,\n              true // Always make an strict connect when inserting\n            )\n              .connect(relsToAdd)\n              .get()\n              // set the order based on the order of the ids\n              .reduce((acc, rel, idx) => ({ ...acc, [rel.id]: idx }), {} as Record<ID, number>);\n\n            insert.forEach((row: Record<string, unknown>) => {\n              row[orderColumnName] = orderMap[row[inverseJoinColumn.name] as number];\n            });\n          }\n\n          // add inv_order value\n          if (hasInverseOrderColumn(attribute)) {\n            const maxResults = await db\n              .getConnection()\n              .select(inverseJoinColumn.name)\n              .max(inverseOrderColumnName, { as: 'max' })\n              .whereIn(inverseJoinColumn.name, relIdsToadd)\n              .where(joinTable.on || {})\n              .groupBy(inverseJoinColumn.name)\n              .from(joinTable.name)\n              .transacting(trx);\n\n            const maxMap = maxResults.reduce(\n              (acc, res) => Object.assign(acc, { [res[inverseJoinColumn.name]]: res.max }),\n              {} as Record<string, number>\n            );\n\n            insert.forEach((rel) => {\n              rel[inverseOrderColumnName] = (maxMap[rel[inverseJoinColumn.name]] || 0) + 1;\n            });\n          }\n\n          if (insert.length === 0) {\n            continue;\n          }\n\n          // insert new relations\n          await batchInsertJoinTable(db, joinTable.name, insert, trx);\n        }\n      }\n    },\n\n    /**\n     * Updates relations of an existing entity\n     */\n    // TODO: check relation exists (handled by FKs except for polymorphics)\n    async updateRelations(uid, id, data, options) {\n      const { attributes } = db.metadata.get(uid);\n      const { transaction: trx } = options ?? {};\n\n      for (const attributeName of Object.keys(attributes)) {\n        const attribute = attributes[attributeName];\n\n        if (attribute.type !== 'relation' || !has(attributeName, data)) {\n          continue;\n        }\n        const cleanRelationData = toAssocs(data[attributeName]);\n\n        if (attribute.relation === 'morphOne' || attribute.relation === 'morphMany') {\n          const { target, morphBy } = attribute;\n\n          const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n          if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n            // set columns\n            const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n            // update instead of deleting because the relation is directly on the entity table\n            // and not in a join table\n            await this.createQueryBuilder(target)\n              .update({ [idColumn.name]: null, [typeColumn.name]: null })\n              .where({ [idColumn.name]: id, [typeColumn.name]: uid })\n              .transacting(trx)\n              .execute();\n\n            if (!isNull(cleanRelationData.set)) {\n              const relId = toIds(cleanRelationData.set?.[0]);\n              await this.createQueryBuilder(target)\n                .update({ [idColumn.name]: id, [typeColumn.name]: uid })\n                .where({ id: relId })\n                .transacting(trx)\n                .execute();\n            }\n          } else if (\n            targetAttribute.type === 'relation' &&\n            targetAttribute.relation === 'morphToMany'\n          ) {\n            const { joinTable } = targetAttribute;\n            const { joinColumn, morphColumn } = joinTable;\n\n            const { idColumn, typeColumn } = morphColumn;\n\n            const hasSet = !isEmpty(cleanRelationData.set);\n            const hasConnect = !isEmpty(cleanRelationData.connect);\n            const hasDisconnect = !isEmpty(cleanRelationData.disconnect);\n\n            // for connect/disconnect without a set, only modify those relations\n            if (!hasSet && (hasConnect || hasDisconnect)) {\n              // delete disconnects and connects (to prevent duplicates when we add them later)\n              const idsToDelete = [\n                ...(cleanRelationData.disconnect || []),\n                ...(cleanRelationData.connect || []),\n              ];\n\n              if (!isEmpty(idsToDelete)) {\n                const where = {\n                  $or: idsToDelete.map((item: any) => {\n                    return {\n                      [idColumn.name]: id,\n                      [typeColumn.name]: uid,\n                      [joinColumn.name]: item.id,\n                      ...(joinTable.on || {}),\n                      field: attributeName,\n                    };\n                  }),\n                };\n\n                await this.createQueryBuilder(joinTable.name)\n                  .delete()\n                  .where(where)\n                  .transacting(trx)\n                  .execute();\n              }\n\n              // connect relations\n              if (hasConnect) {\n                // Query database to find the order of the last relation\n                const start = await this.createQueryBuilder(joinTable.name)\n                  .where({\n                    [idColumn.name]: id,\n                    [typeColumn.name]: uid,\n                    ...(joinTable.on || {}),\n                    ...(data.__pivot || {}),\n                  })\n                  .max('order')\n                  .first()\n                  .transacting(trx)\n                  .execute();\n\n                const startOrder = (start as any)?.max || 0;\n\n                const rows = (cleanRelationData.connect ?? []).map((data, idx) => ({\n                  [joinColumn.name]: data.id,\n                  [idColumn.name]: id,\n                  [typeColumn.name]: uid,\n                  ...(joinTable.on || {}),\n                  ...(data.__pivot || {}),\n                  order: startOrder + idx + 1,\n                  field: attributeName,\n                })) satisfies Record<string, any>[];\n\n                await batchInsertJoinTable(db, joinTable.name, rows, trx);\n              }\n\n              continue;\n            }\n\n            // delete all relations\n            await this.createQueryBuilder(joinTable.name)\n              .delete()\n              .where({\n                [idColumn.name]: id,\n                [typeColumn.name]: uid,\n                ...(joinTable.on || {}),\n                field: attributeName,\n              })\n              .transacting(trx)\n              .execute();\n\n            if (hasSet) {\n              const rows = (cleanRelationData.set ?? []).map((data, idx) => ({\n                [joinColumn.name]: data.id,\n                [idColumn.name]: id,\n                [typeColumn.name]: uid,\n                ...(joinTable.on || {}),\n                ...(data.__pivot || {}),\n                order: idx + 1,\n                field: attributeName,\n              })) satisfies Record<string, any>[];\n\n              await batchInsertJoinTable(db, joinTable.name, rows, trx);\n            }\n          }\n\n          continue;\n        }\n\n        if (attribute.relation === 'morphToOne') {\n          // handled on the entry itself\n          continue;\n        }\n\n        if (attribute.relation === 'morphToMany') {\n          const { joinTable } = attribute;\n          const { joinColumn, morphColumn } = joinTable;\n\n          const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n          const hasSet = !isEmpty(cleanRelationData.set);\n          const hasConnect = !isEmpty(cleanRelationData.connect);\n          const hasDisconnect = !isEmpty(cleanRelationData.disconnect);\n\n          // for connect/disconnect without a set, only modify those relations\n          if (!hasSet && (hasConnect || hasDisconnect)) {\n            // delete disconnects and connects (to prevent duplicates when we add them later)\n            const idsToDelete = [\n              ...(cleanRelationData.disconnect || []),\n              ...(cleanRelationData.connect || []),\n            ];\n\n            const rowsToDelete = [\n              ...(cleanRelationData.disconnect ?? []).map((data, idx) => ({\n                [joinColumn.name]: id,\n                [idColumn.name]: data.id,\n                [typeColumn.name]: data[typeField],\n                ...(('on' in joinTable && joinTable.on) || {}),\n                ...(data.__pivot || {}),\n                order: idx + 1,\n              })),\n              ...(cleanRelationData.connect ?? []).map((data, idx) => ({\n                [joinColumn.name]: id,\n                [idColumn.name]: data.id,\n                // @ts-expect-error TODO\n                [typeColumn.name]: data[typeField],\n                ...(('on' in joinTable && joinTable.on) || {}),\n                ...(data.__pivot || {}),\n                order: idx + 1,\n              })),\n            ];\n\n            const adjacentRelations = await this.createQueryBuilder(joinTable.name)\n              .where({\n                $or: [\n                  {\n                    [joinColumn.name]: id,\n                    [idColumn.name]: {\n                      $in: compact(\n                        cleanRelationData.connect?.map(\n                          (r) => r.position?.after || r.position?.before\n                        )\n                      ),\n                    },\n                  },\n                  {\n                    [joinColumn.name]: id,\n                    order: this.createQueryBuilder(joinTable.name)\n                      .max('order')\n                      .where({ [joinColumn.name]: id })\n                      .where(joinTable.on || {})\n                      .transacting(trx)\n                      .getKnexQuery(),\n                  },\n                ],\n              })\n              .where(joinTable.on || {})\n              .transacting(trx)\n              .execute<Array<Record<string, any>>>();\n\n            if (!isEmpty(idsToDelete)) {\n              const where = {\n                $or: idsToDelete.map((item: any) => {\n                  return {\n                    [idColumn.name]: item.id,\n                    [typeColumn.name]: item[typeField],\n                    [joinColumn.name]: id,\n                    ...(joinTable.on || {}),\n                  };\n                }),\n              };\n\n              // delete previous relations\n              await this.createQueryBuilder(joinTable.name)\n                .delete()\n                .where(where)\n                .transacting(trx)\n                .execute();\n\n              await deleteRelatedMorphOneRelationsAfterMorphToManyUpdate(rowsToDelete as any, {\n                uid,\n                attributeName,\n                joinTable,\n                db,\n                transaction: trx,\n              });\n            }\n\n            // connect relations\n            if (hasConnect) {\n              const dataset = cleanRelationData.connect || [];\n\n              const rows = dataset.map((data) => ({\n                [joinColumn.name]: id,\n                [idColumn.name]: data.id,\n                [typeColumn.name]: data[typeField as '__type'],\n                ...(joinTable.on || {}),\n                ...(data.__pivot || {}),\n                field: attributeName,\n              })) satisfies Record<string, any>[];\n\n              const orderMap = relationsOrderer(\n                // Merge id & __type to get a single id key\n                adjacentRelations.map(\n                  encodePolymorphicRelation({\n                    idColumn: idColumn.name,\n                    typeColumn: typeColumn.name,\n                  })\n                ),\n                idColumn.name,\n                'order',\n                cleanRelationData.options?.strict\n              )\n                .connect(\n                  // Merge id & __type to get a single id key\n                  dataset.map(encodePolymorphicRelation({ idColumn: 'id', typeColumn: '__type' }))\n                )\n                .getOrderMap();\n\n              rows.forEach((row: Record<string, unknown>) => {\n                const rowId = row[idColumn.name] as number;\n                const rowType = row[typeColumn.name] as string;\n                const encodedId = encodePolymorphicId(rowId, rowType);\n\n                row.order = orderMap[encodedId];\n              });\n\n              await batchInsertJoinTable(db, joinTable.name, rows, trx);\n            }\n\n            continue;\n          }\n\n          if (hasSet) {\n            // delete all relations for this entity\n            await this.createQueryBuilder(joinTable.name)\n              .delete()\n              .where({\n                [joinColumn.name]: id,\n                ...(joinTable.on || {}),\n              })\n              .transacting(trx)\n              .execute();\n\n            const rows = (cleanRelationData.set ?? []).map((data, idx) => ({\n              [joinColumn.name]: id,\n              [idColumn.name]: data.id,\n              [typeColumn.name]: data[typeField],\n              field: attributeName,\n              ...(joinTable.on || {}),\n              ...(data.__pivot || {}),\n              order: idx + 1,\n            })) satisfies Record<string, any>[];\n\n            await deleteRelatedMorphOneRelationsAfterMorphToManyUpdate(rows, {\n              uid,\n              attributeName,\n              joinTable,\n              db,\n              transaction: trx,\n            });\n\n            await batchInsertJoinTable(db, joinTable.name, rows, trx);\n          }\n\n          continue;\n        }\n\n        if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner) {\n          // handled in the row itself\n          continue;\n        }\n\n        // oneToOne oneToMany on the non owning side.\n        // Since it is a join column no need to remove previous relations\n        if ('joinColumn' in attribute && attribute.joinColumn && !attribute.owner) {\n          // need to set the column on the target\n          const { target } = attribute;\n\n          await this.createQueryBuilder(target)\n            .where({ [attribute.joinColumn.referencedColumn]: id })\n            .update({ [attribute.joinColumn.referencedColumn]: null })\n            .transacting(trx)\n            .execute();\n\n          if (!isNull(cleanRelationData.set)) {\n            const relIdsToAdd = toIds(cleanRelationData.set);\n            await this.createQueryBuilder(target)\n              .where({ id: relIdsToAdd })\n              .update({ [attribute.joinColumn.referencedColumn]: id })\n              .transacting(trx)\n              .execute();\n          }\n        }\n\n        if (attribute.joinTable) {\n          const { joinTable } = attribute;\n          const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } =\n            joinTable;\n          const select = [joinColumn.name, inverseJoinColumn.name];\n          if (hasOrderColumn(attribute)) {\n            select.push(orderColumnName);\n          }\n          if (hasInverseOrderColumn(attribute)) {\n            select.push(inverseOrderColumnName);\n          }\n\n          // only delete relations\n          if (isNull(cleanRelationData.set)) {\n            await deleteRelations({ id, attribute, db, relIdsToDelete: 'all', transaction: trx });\n          } else {\n            const isPartialUpdate = !has('set', cleanRelationData);\n            let relIdsToaddOrMove: ID[];\n\n            if (isPartialUpdate) {\n              if (isAnyToOne(attribute)) {\n                // TODO: V5 find a fix to connect multiple versions of a document at the same time on xToOne relations\n                // cleanRelationData.connect = cleanRelationData.connect?.slice(-1);\n              }\n              relIdsToaddOrMove = toIds(cleanRelationData.connect);\n              const relIdsToDelete = toIds(\n                differenceWith(\n                  isEqual,\n                  cleanRelationData.disconnect,\n                  cleanRelationData.connect ?? []\n                )\n              );\n\n              if (!isEmpty(relIdsToDelete)) {\n                await deleteRelations({ id, attribute, db, relIdsToDelete, transaction: trx });\n              }\n\n              if (isEmpty(cleanRelationData.connect)) {\n                continue;\n              }\n\n              // Fetch current relations to handle ordering\n              let currentMovingRels: Record<string, ID>[] = [];\n\n              if (hasOrderColumn(attribute) || hasInverseOrderColumn(attribute)) {\n                currentMovingRels = await this.createQueryBuilder(joinTable.name)\n                  .select(select)\n                  .where({\n                    [joinColumn.name]: id,\n                    [inverseJoinColumn.name]: { $in: relIdsToaddOrMove },\n                  })\n                  .where(joinTable.on || {})\n                  .transacting(trx)\n                  .execute();\n              }\n\n              // prepare relations to insert\n              const insert = uniqBy('id', cleanRelationData.connect).map((relToAdd) => ({\n                [joinColumn.name]: id,\n                [inverseJoinColumn.name]: relToAdd.id,\n                ...(joinTable.on || {}),\n                ...(relToAdd.__pivot || {}),\n              }));\n\n              if (hasOrderColumn(attribute)) {\n                // Get all adjacent relations and the one with the highest order\n                const adjacentRelations = await this.createQueryBuilder(joinTable.name)\n                  .where({\n                    $or: [\n                      {\n                        [joinColumn.name]: id,\n                        [inverseJoinColumn.name]: {\n                          $in: compact(\n                            cleanRelationData.connect?.map(\n                              (r) => r.position?.after || r.position?.before\n                            )\n                          ),\n                        },\n                      },\n                      {\n                        [joinColumn.name]: id,\n                        [orderColumnName]: this.createQueryBuilder(joinTable.name)\n                          .max(orderColumnName)\n                          .where({ [joinColumn.name]: id })\n                          .where(joinTable.on || {})\n                          .transacting(trx)\n                          .getKnexQuery(),\n                      },\n                    ],\n                  })\n                  .where(joinTable.on || {})\n                  .transacting(trx)\n                  .execute<Array<Record<string, any>>>();\n\n                const orderMap = relationsOrderer(\n                  adjacentRelations,\n                  inverseJoinColumn.name,\n                  joinTable.orderColumnName,\n                  cleanRelationData.options?.strict\n                )\n                  .connect(cleanRelationData.connect ?? [])\n                  .getOrderMap();\n\n                insert.forEach((row) => {\n                  row[orderColumnName] = orderMap[row[inverseJoinColumn.name]];\n                });\n              }\n\n              // add inv order value\n              if (hasInverseOrderColumn(attribute)) {\n                const nonExistingRelsIds: ID[] = difference(\n                  relIdsToaddOrMove,\n                  map(inverseJoinColumn.name, currentMovingRels)\n                );\n\n                const maxResults = await db\n                  .getConnection()\n                  .select(inverseJoinColumn.name)\n                  .max(inverseOrderColumnName, { as: 'max' })\n                  .whereIn(inverseJoinColumn.name, nonExistingRelsIds)\n                  .where(joinTable.on || {})\n                  .groupBy(inverseJoinColumn.name)\n                  .from(joinTable.name)\n                  .transacting(trx);\n\n                const maxMap = maxResults.reduce(\n                  (acc, res) => Object.assign(acc, { [res[inverseJoinColumn.name]]: res.max }),\n                  {}\n                );\n\n                insert.forEach((row) => {\n                  row[inverseOrderColumnName] = (maxMap[row[inverseJoinColumn.name]] || 0) + 1;\n                });\n              }\n\n              // insert rows\n              await batchInsertJoinTable(db, joinTable.name, insert, trx, {\n                onConflict: joinTable.pivotColumns,\n                merge: hasOrderColumn(attribute) ? [orderColumnName] : undefined,\n                ignore: !hasOrderColumn(attribute),\n              });\n\n              // remove gap between orders\n              await cleanOrderColumns({ attribute, db, id, transaction: trx });\n            } else {\n              // Keep every row. The payload was already collapsed to a\n              // single related entry upstream; what's left here may still\n              // be two rows for the same entry (its draft and published\n              // sides) and both need to be linked, otherwise the entry\n              // vanishes from the Edit View on save.\n\n              // overwrite all relations\n              relIdsToaddOrMove = toIds(cleanRelationData.set);\n              await deleteRelations({\n                id,\n                attribute,\n                db,\n                relIdsToDelete: 'all',\n                relIdsToNotDelete: relIdsToaddOrMove,\n                transaction: trx,\n              });\n\n              if (isEmpty(cleanRelationData.set)) {\n                continue;\n              }\n\n              const insert = uniqBy('id', cleanRelationData.set).map((relToAdd) => ({\n                [joinColumn.name]: id,\n                [inverseJoinColumn.name]: relToAdd.id,\n                ...(joinTable.on || {}),\n                ...(relToAdd.__pivot || {}),\n              }));\n\n              // add order value\n              if (hasOrderColumn(attribute)) {\n                insert.forEach((row, idx) => {\n                  row[orderColumnName] = idx + 1;\n                });\n              }\n\n              // add inv order value\n              if (hasInverseOrderColumn(attribute)) {\n                const existingRels = await this.createQueryBuilder(joinTable.name)\n                  .select(inverseJoinColumn.name)\n                  .where({\n                    [joinColumn.name]: id,\n                    [inverseJoinColumn.name]: { $in: relIdsToaddOrMove },\n                  })\n                  .where(joinTable.on || {})\n                  .transacting(trx)\n                  .execute<Array<Record<string, ID>>>();\n\n                const inverseRelsIds = map(inverseJoinColumn.name, existingRels);\n\n                const nonExistingRelsIds = difference(relIdsToaddOrMove, inverseRelsIds);\n\n                const maxResults = await db\n                  .getConnection()\n                  .select(inverseJoinColumn.name)\n                  .max(inverseOrderColumnName, { as: 'max' })\n                  .whereIn(inverseJoinColumn.name, nonExistingRelsIds)\n                  .where(joinTable.on || {})\n                  .groupBy(inverseJoinColumn.name)\n                  .from(joinTable.name)\n                  .transacting(trx);\n\n                const maxMap = maxResults.reduce(\n                  (acc, res) => Object.assign(acc, { [res[inverseJoinColumn.name]]: res.max }),\n                  {}\n                );\n\n                insert.forEach((row: any) => {\n                  row[inverseOrderColumnName] = (maxMap[row[inverseJoinColumn.name]] || 0) + 1;\n                });\n              }\n\n              // insert rows\n              await batchInsertJoinTable(db, joinTable.name, insert, trx, {\n                onConflict: joinTable.pivotColumns,\n                merge: hasOrderColumn(attribute) ? [orderColumnName] : undefined,\n                ignore: !hasOrderColumn(attribute),\n              });\n            }\n\n            // Delete the previous relations for oneToAny relations\n            if (isBidirectional(attribute) && isOneToAny(attribute)) {\n              await deletePreviousOneToAnyRelations({\n                id,\n                attribute,\n                relIdsToadd: relIdsToaddOrMove,\n                db,\n                transaction: trx,\n              });\n            }\n\n            // Delete the previous relations for anyToOne relations\n            if (isAnyToOne(attribute)) {\n              await deletePreviousAnyToOneRelations({\n                id,\n                attribute,\n                relIdToadd: relIdsToaddOrMove[0],\n                db,\n                transaction: trx,\n              });\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Delete relational associations of an existing entity\n     * This removes associations but doesn't do cascade deletions for components for example. This will be handled on the entity service layer instead\n     * NOTE: Most of the deletion should be handled by ON DELETE CASCADE for dialects that have FKs\n     *\n     * @param {EntityManager} em - entity manager instance\n     * @param {Metadata} metadata - model metadta\n     * @param {ID} id - entity ID\n     */\n    async deleteRelations(uid, id, options) {\n      const { attributes } = db.metadata.get(uid);\n      const { transaction: trx } = options ?? {};\n\n      for (const attributeName of Object.keys(attributes)) {\n        const attribute = attributes[attributeName];\n\n        if (attribute.type !== 'relation') {\n          continue;\n        }\n\n        /*\n          if morphOne | morphMany\n            if morphBy is morphToOne\n              set null\n            if morphBy is morphToOne\n              delete links\n        */\n        if (attribute.relation === 'morphOne' || attribute.relation === 'morphMany') {\n          const { target, morphBy } = attribute;\n\n          const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n          if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n            // set columns\n            const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n            await this.createQueryBuilder(target)\n              .update({ [idColumn.name]: null, [typeColumn.name]: null })\n              .where({ [idColumn.name]: id, [typeColumn.name]: uid })\n              .transacting(trx)\n              .execute();\n          } else if (\n            targetAttribute.type === 'relation' &&\n            targetAttribute.relation === 'morphToMany'\n          ) {\n            const { joinTable } = targetAttribute;\n            const { morphColumn } = joinTable;\n\n            const { idColumn, typeColumn } = morphColumn;\n\n            await this.createQueryBuilder(joinTable.name)\n              .delete()\n              .where({\n                [idColumn.name]: id,\n                [typeColumn.name]: uid,\n                ...(joinTable.on || {}),\n                field: attributeName,\n              })\n              .transacting(trx)\n              .execute();\n          }\n\n          continue;\n        }\n\n        /*\n          if morphToOne\n            nothing to do\n        */\n        if (attribute.relation === 'morphToOne') {\n          // do nothing\n        }\n\n        /*\n            if morphToMany\n            delete links\n        */\n        if (attribute.relation === 'morphToMany') {\n          const { joinTable } = attribute;\n          const { joinColumn } = joinTable;\n\n          await this.createQueryBuilder(joinTable.name)\n            .delete()\n            .where({\n              [joinColumn.name]: id,\n              ...(joinTable.on || {}),\n            })\n            .transacting(trx)\n            .execute();\n\n          continue;\n        }\n\n        // do not need to delete links when using foreign keys\n        if (db.dialect.usesForeignKeys()) {\n          continue;\n        }\n\n        // NOTE: we do not remove existing associations with the target as it should handled by unique FKs instead\n        if ('joinColumn' in attribute && attribute.joinColumn && attribute.owner) {\n          // nothing to do => relation already added on the table\n          continue;\n        }\n\n        // oneToOne oneToMany on the non owning side.\n        if ('joinColumn' in attribute && attribute.joinColumn && !attribute.owner) {\n          // need to set the column on the target\n          const { target } = attribute;\n\n          await this.createQueryBuilder(target)\n            .where({ [attribute.joinColumn.referencedColumn]: id })\n            .update({ [attribute.joinColumn.referencedColumn]: null })\n            .transacting(trx)\n            .execute();\n        }\n\n        if ('joinTable' in attribute && attribute.joinTable) {\n          await deleteRelations({ id, attribute, db, relIdsToDelete: 'all', transaction: trx });\n        }\n      }\n    },\n\n    // TODO: add lifecycle events\n    async populate(uid, entity, populate) {\n      const entry = await this.findOne(uid, {\n        select: ['id'],\n        where: { id: entity.id },\n        populate,\n      });\n\n      return { ...entity, ...entry };\n    },\n\n    // TODO: add lifecycle events\n    async load(uid, entity, fields, populate) {\n      const { attributes } = db.metadata.get(uid);\n\n      const fieldsArr = castArray(fields);\n      fieldsArr.forEach((field) => {\n        const attribute = attributes[field];\n\n        if (!attribute || attribute.type !== 'relation') {\n          throw new Error(`Invalid load. Expected ${field} to be a relational attribute`);\n        }\n      });\n\n      const entry = await this.findOne(uid, {\n        select: ['id'],\n        where: { id: entity.id },\n        populate: fieldsArr.reduce(\n          (acc, field) => {\n            acc[field] = populate || true;\n            return acc;\n          },\n          {} as Record<string, unknown>\n        ),\n      });\n\n      if (!entry) {\n        return null;\n      }\n\n      if (Array.isArray(fields)) {\n        return pick(fields, entry);\n      }\n\n      return entry[fields];\n    },\n\n    // cascading\n    // aggregations\n    // -> avg\n    // -> min\n    // -> max\n    // -> grouping\n\n    // formulas\n    // custom queries\n\n    // utilities\n    // -> map result\n    // -> map input\n\n    // extra features\n    // -> virtuals\n    // -> private\n\n    /**\n     * Insert join-table rows in batches (GH#25198).\n     * Uses dialect.getBatchInsertSize() so SQLite etc. can enforce a safe batch size.\n     * All batches run in the same transaction; caller must pass an active transaction.\n     */\n    async insertJoinTableRows(\n      joinTableName: string,\n      rows: Record<string, unknown>[],\n      trx: any,\n      options?: { onConflict?: string[]; merge?: string[]; ignore?: boolean }\n    ) {\n      if (rows.length === 0) return;\n      if (trx == null) {\n        throw new Error(\n          'insertJoinTableRows requires a transaction so all batches commit or roll back atomically'\n        );\n      }\n      const batchSize = db.dialect.getBatchInsertSize();\n      for (let i = 0; i < rows.length; i += batchSize) {\n        const chunk = rows.slice(i, i + batchSize);\n        let qb = this.createQueryBuilder(joinTableName).insert(chunk).transacting(trx);\n        if (options?.onConflict) {\n          qb = qb.onConflict(options.onConflict);\n          if (options.merge) qb.merge(options.merge);\n          else if (options.ignore) qb.ignore();\n        }\n        await qb.execute();\n      }\n    },\n\n    createQueryBuilder(uid) {\n      return createQueryBuilder(uid, db);\n    },\n\n    getRepository(uid) {\n      if (!repoMap[uid]) {\n        repoMap[uid] = createRepository(uid, db);\n      }\n\n      return repoMap[uid];\n    },\n  };\n};\n"],"names":["batchInsertJoinTable","db","joinTableName","rows","trx","options","length","Error","batchSize","dialect","getBatchInsertSize","i","chunk","slice","qb","createQueryBuilder","insert","transacting","onConflict","merge","ignore","execute","isRecord","value","isObject","isNil","toId","isValidId","id","JSON","stringify","toIds","castArray","map","isString","isInteger","isValidObjectId","toIdArray","data","array","filter","datum","__pivot","uniqWith","isEqual","toAssocs","isArray","isNumber","isNull","set","strict","connect","elm","position","end","__type","disconnect","processData","metadata","withDefaults","attributes","obj","attributeName","Object","keys","attribute","types","field","createField","isUndefined","default","validate","val","toDB","joinColumn","owner","joinColumnName","name","attrValue","Array","setIds","strapi","log","warn","morphColumn","idColumn","typeColumn","typeField","assign","has","createEntityManager","repoMap","findOne","uid","params","states","lifecycles","run","result","init","first","findMany","count","res","pick","Number","create","get","isPlainObject","dataToInsert","transaction","attachRelations","commit","e","rollback","where","delete","select","populate","filters","createMany","isEmpty","createdEntries","chunkResult","concat","ids","entry","update","entity","mapResults","dataToUpdate","updateRelations","updateMany","updatedRows","deleteRelations","deleteMany","deletedRows","isValidLink","type","cleanRelationData","relation","target","morphBy","targetAttribute","relId","joinTable","idx","on","order","dataset","orderMap","relationsOrderer","encodePolymorphicRelation","reduce","acc","rel","forEach","row","rowId","rowType","encodedId","encodePolymorphicId","deleteRelatedMorphOneRelationsAfterMorphToManyUpdate","relIdsToAdd","isBidirectional","$ne","referencedColumn","inverseJoinColumn","orderColumnName","inverseOrderColumnName","relsToAdd","relIdsToadd","isOneToAny","deletePreviousOneToAnyRelations","uniqBy","hasOrderColumn","hasInverseOrderColumn","maxResults","getConnection","max","as","whereIn","groupBy","from","maxMap","hasSet","hasConnect","hasDisconnect","idsToDelete","$or","item","start","startOrder","rowsToDelete","adjacentRelations","$in","compact","r","after","before","getKnexQuery","getOrderMap","push","relIdsToDelete","isPartialUpdate","relIdsToaddOrMove","isAnyToOne","differenceWith","currentMovingRels","relToAdd","nonExistingRelsIds","difference","pivotColumns","undefined","cleanOrderColumns","relIdsToNotDelete","existingRels","inverseRelsIds","deletePreviousAnyToOneRelations","relIdToadd","usesForeignKeys","load","fields","fieldsArr","insertJoinTableRows","getRepository","createRepository"],"mappings":"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"}