Skip to content

Commit 9aa77ab

Browse files
authored
Fix composite upsert (#16718)
Doing an upsert on existing value, composite field not updated properly. ``` Input: { id: "08ca34fe-fc39-474f-adac-4d89f844e922", name: "tom", linkedinLink: { primaryLinkUrl: "https://www.linkedin.com/in/etienneyaouni1982", primaryLinkLabel: "etienne", secondaryLinks: null, }, } ``` Building `overwrites` for upsert forgets `linkedinLink` because column names are not flattened yet. We don't want to call formatData yet on the input, because this is heavy. Overriding `overwrites` on execute.
1 parent 0849dda commit 9aa77ab

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

packages/twenty-server/src/engine/twenty-orm/repository/workspace-insert-query-builder.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,40 @@ export class WorkspaceInsertQueryBuilder<
115115
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
116116
});
117117

118+
// Fix overwrites for composite fields - valuesSet contains formatted/flattened column names
119+
// but overwrites was computed before formatData, missing composite field columns
120+
if (
121+
isDefined(this.expressionMap.onUpdate?.overwrite) &&
122+
isDefined(this.expressionMap.valuesSet)
123+
) {
124+
const valuesArray = Array.isArray(this.expressionMap.valuesSet)
125+
? this.expressionMap.valuesSet
126+
: [this.expressionMap.valuesSet];
127+
128+
const allValueKeys = new Set(
129+
valuesArray.flatMap((value) => Object.keys(value)),
130+
);
131+
132+
const mainAliasMetadata = this.expressionMap.mainAlias?.metadata;
133+
134+
if (mainAliasMetadata) {
135+
const missingColumns = mainAliasMetadata.columns
136+
.filter(
137+
(col) =>
138+
allValueKeys.has(col.databaseName) &&
139+
!this.expressionMap.onUpdate.overwrite!.includes(
140+
col.databaseName,
141+
),
142+
)
143+
.map((col) => col.databaseName);
144+
145+
this.expressionMap.onUpdate.overwrite = [
146+
...this.expressionMap.onUpdate.overwrite,
147+
...missingColumns,
148+
];
149+
}
150+
}
151+
118152
const mainAliasTarget = this.getMainAliasTarget();
119153

120154
const objectMetadata = getObjectMetadataFromEntityTarget(

0 commit comments

Comments
 (0)