Fix upsert in ORM (#13589)

Before:
<img width="1496" height="850" alt="image"
src="https://github.com/user-attachments/assets/bb334c4d-99c3-4237-90e3-02400ab566f5"
/>

After: 
<img width="1496" height="850" alt="image"
src="https://github.com/user-attachments/assets/4e53bdf0-6f2c-4a11-9836-d83f44291a0b"
/>


Query:
```
mutation CreatePerson($upsert: Boolean, $data: PersonCreateInput) {
  createPerson(upsert: $upsert, data: $data) {
    jobTitle
    id
  }
}
```

Variables:
```
{
  "upsert": true,
  "data": {
    "name": { "firstName": "marie"}
  }
}
```
This commit is contained in:
Charles Bochet
2025-08-04 14:13:55 +02:00
committed by GitHub
parent b85918fc7a
commit ae17640fbc
3 changed files with 17 additions and 13 deletions
@@ -190,8 +190,8 @@ export class WorkspaceEntityManager extends EntityManager {
override upsert<Entity extends ObjectLiteral>(
target: EntityTarget<Entity>,
entityOrEntities:
| QueryDeepPartialEntity<Entity>
| QueryDeepPartialEntity<Entity>[],
| QueryDeepPartialEntityWithNestedRelationFields<Entity>
| QueryDeepPartialEntityWithNestedRelationFields<Entity>[],
conflictPathsOrOptions: string[] | UpsertOptions<Entity>,
permissionOptions?: {
shouldBypassPermissionChecks?: boolean;
@@ -209,7 +209,7 @@ export class WorkspaceEntityManager extends EntityManager {
} else {
options = conflictPathsOrOptions;
}
let entities: QueryDeepPartialEntity<Entity>[];
let entities: QueryDeepPartialEntityWithNestedRelationFields<Entity>[];
if (!Array.isArray(entityOrEntities)) {
entities = [entityOrEntities];
@@ -29,6 +29,7 @@ import { WorkspaceUpdateQueryBuilder } from 'src/engine/twenty-orm/repository/wo
import { formatData } from 'src/engine/twenty-orm/utils/format-data.util';
import { formatResult } from 'src/engine/twenty-orm/utils/format-result.util';
import { getObjectMetadataFromEntityTarget } from 'src/engine/twenty-orm/utils/get-object-metadata-from-entity-target.util';
import { WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manager/workspace-entity-manager';
export class WorkspaceInsertQueryBuilder<
T extends ObjectLiteral,
@@ -137,16 +138,17 @@ export class WorkspaceInsertQueryBuilder<
}
const result = await super.execute();
const eventSelectQueryBuilder = new WorkspaceSelectQueryBuilder(
this as unknown as WorkspaceSelectQueryBuilder<T>,
this.objectRecordsPermissions,
this.internalContext,
true,
this.authContext,
this.featureFlagMap,
);
const eventSelectQueryBuilder = (
this.connection.manager as WorkspaceEntityManager
).createQueryBuilder(
mainAliasTarget,
this.expressionMap.mainAlias?.metadata.name ?? '',
undefined,
{
shouldBypassPermissionChecks: true,
},
) as WorkspaceSelectQueryBuilder<T>;
eventSelectQueryBuilder.expressionMap.aliases = this.expressionMap.aliases;
eventSelectQueryBuilder.whereInIds(
result.identifiers.map((identifier) => identifier.id),
);
@@ -622,7 +622,9 @@ export class WorkspaceRepository<
}
override async upsert(
entityOrEntities: QueryDeepPartialEntity<T> | QueryDeepPartialEntity<T>[],
entityOrEntities:
| QueryDeepPartialEntityWithNestedRelationFields<T>
| QueryDeepPartialEntityWithNestedRelationFields<T>[],
conflictPathsOrOptions: string[] | UpsertOptions<T>,
entityManager?: WorkspaceEntityManager,
selectedColumns: string[] = [],