Skip to content

Commit 5a13233

Browse files
authored
Merge pull request mlipscombe#37 from sterblue/fix/error-if-parent-not-update-or-selected
Nested mutation fails if parent row is not selected/updated
2 parents 54af64f + b52c0d5 commit 5a13233

4 files changed

+55
-49
lines changed

src/PostgraphileNestedConnectorsPlugin.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ module.exports = function PostGraphileNestedConnectorsPlugin(builder) {
7777
if (identifiers.length !== primaryKeys.length) {
7878
throw new Error('Invalid ID');
7979
}
80-
where = sql.fragment`${sql.join(
80+
where = sql.fragment`(${sql.join(
8181
primaryKeys.map(
8282
(key, idx) =>
8383
sql.fragment`${sql.identifier(key.name)} = ${gql2pg(
@@ -87,10 +87,10 @@ module.exports = function PostGraphileNestedConnectorsPlugin(builder) {
8787
)}`,
8888
),
8989
') and (',
90-
)}`;
90+
)})`;
9191
} else {
9292
const foreignPrimaryKeys = constraint.keyAttributes;
93-
where = sql.fragment`${sql.join(
93+
where = sql.fragment`(${sql.join(
9494
foreignPrimaryKeys.map(
9595
(k) => sql.fragment`
9696
${sql.identifier(k.name)} = ${gql2pg(
@@ -101,7 +101,7 @@ module.exports = function PostGraphileNestedConnectorsPlugin(builder) {
101101
`,
102102
),
103103
') and (',
104-
)}`;
104+
)})`;
105105
}
106106
const select = foreignKeys.map((k) => sql.identifier(k.name));
107107
const query = parentRow

src/PostgraphileNestedDeletersPlugin.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ module.exports = function PostGraphileNestedDeletersPlugin(builder) {
7777
if (identifiers.length !== primaryKeys.length) {
7878
throw new Error('Invalid ID');
7979
}
80-
where = sql.fragment`${sql.join(
80+
where = sql.fragment`(${sql.join(
8181
primaryKeys.map(
8282
(key, idx) =>
8383
sql.fragment`${sql.identifier(key.name)} = ${gql2pg(
@@ -87,10 +87,10 @@ module.exports = function PostGraphileNestedDeletersPlugin(builder) {
8787
)}`,
8888
),
8989
') and (',
90-
)}`;
90+
)})`;
9191
} else {
9292
const foreignPrimaryKeys = constraint.keyAttributes;
93-
where = sql.fragment`${sql.join(
93+
where = sql.fragment`(${sql.join(
9494
foreignPrimaryKeys.map(
9595
(k) => sql.fragment`
9696
${sql.identifier(k.name)} = ${gql2pg(
@@ -101,7 +101,7 @@ module.exports = function PostGraphileNestedDeletersPlugin(builder) {
101101
`,
102102
),
103103
') and (',
104-
)}`;
104+
)})`;
105105
}
106106
const select = foreignKeys.map((k) => sql.identifier(k.name));
107107
const query = parentRow

src/PostgraphileNestedMutationsPlugin.js

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ module.exports = function PostGraphileNestedMutationPlugin(builder) {
322322
if (identifiers.length !== primaryKeys.length) {
323323
throw new Error('Invalid ID');
324324
}
325-
condition = sql.fragment`${sql.join(
325+
condition = sql.fragment`(${sql.join(
326326
table.primaryKeyConstraint.keyAttributes.map(
327327
(key, idx) =>
328328
sql.fragment`${sql.identifier(key.name)} = ${gql2pg(
@@ -332,7 +332,7 @@ module.exports = function PostGraphileNestedMutationPlugin(builder) {
332332
)}`,
333333
),
334334
') and (',
335-
)}`;
335+
)})`;
336336
} catch (e) {
337337
debug(e);
338338
throw e;
@@ -438,6 +438,11 @@ module.exports = function PostGraphileNestedMutationPlugin(builder) {
438438
});
439439

440440
if (primaryKeys) {
441+
if (!connectedRow) {
442+
throw new Error(
443+
'Unable to update/select parent row.',
444+
);
445+
}
441446
const rowKeyValues = {};
442447
primaryKeys.forEach((col) => {
443448
rowKeyValues[col.name] = connectedRow[col.name];
@@ -486,15 +491,15 @@ module.exports = function PostGraphileNestedMutationPlugin(builder) {
486491
await Promise.all(
487492
updaterField.map(async (node) => {
488493
const where = sql.fragment`
489-
${sql.join(
494+
(${sql.join(
490495
keys.map(
491496
(k, i) =>
492497
sql.fragment`${sql.identifier(k.name)} = ${sql.value(
493498
row[foreignKeys[i].name],
494499
)}`,
495500
),
496501
') and (',
497-
)}
502+
)})
498503
`;
499504
const updatedRow = await pgNestedTableUpdate({
500505
nestedField,
@@ -521,39 +526,6 @@ module.exports = function PostGraphileNestedMutationPlugin(builder) {
521526
}),
522527
);
523528

524-
if (fieldValue.create) {
525-
await Promise.all(
526-
fieldValue.create.map(async (rowData) => {
527-
const resolver = pgNestedResolvers[foreignTable.id];
528-
const tableVar = inflection.tableFieldName(foreignTable);
529-
530-
const keyData = {};
531-
keys.forEach((k, idx) => {
532-
const columnName = inflection.column(k);
533-
keyData[columnName] = row[foreignKeys[idx].name];
534-
});
535-
536-
const { data: reverseRow } = await resolver(
537-
data,
538-
{
539-
input: {
540-
[tableVar]: Object.assign({}, rowData, keyData),
541-
},
542-
},
543-
{ pgClient },
544-
resolveInfo,
545-
);
546-
547-
const rowKeyValues = {};
548-
if (primaryKeys) {
549-
primaryKeys.forEach((k) => {
550-
rowKeyValues[k.name] = reverseRow[`__pk__${k.name}`];
551-
});
552-
}
553-
modifiedRows.push(rowKeyValues);
554-
}),
555-
);
556-
}
557529
if (fieldValue.deleteOthers) {
558530
// istanbul ignore next
559531
if (!primaryKeys) {
@@ -604,6 +576,40 @@ module.exports = function PostGraphileNestedMutationPlugin(builder) {
604576
} = sql.compile(deleteQuery);
605577
await pgClient.query(deleteQueryText, deleteQueryValues);
606578
}
579+
580+
if (fieldValue.create) {
581+
await Promise.all(
582+
fieldValue.create.map(async (rowData) => {
583+
const resolver = pgNestedResolvers[foreignTable.id];
584+
const tableVar = inflection.tableFieldName(foreignTable);
585+
586+
const keyData = {};
587+
keys.forEach((k, idx) => {
588+
const columnName = inflection.column(k);
589+
keyData[columnName] = row[foreignKeys[idx].name];
590+
});
591+
592+
const { data: reverseRow } = await resolver(
593+
data,
594+
{
595+
input: {
596+
[tableVar]: Object.assign({}, rowData, keyData),
597+
},
598+
},
599+
{ pgClient },
600+
resolveInfo,
601+
);
602+
603+
const rowKeyValues = {};
604+
if (primaryKeys) {
605+
primaryKeys.forEach((k) => {
606+
rowKeyValues[k.name] = reverseRow[`__pk__${k.name}`];
607+
});
608+
}
609+
modifiedRows.push(rowKeyValues);
610+
}),
611+
);
612+
}
607613
}),
608614
);
609615

src/PostgraphileNestedUpdatersPlugin.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ module.exports = function PostGraphileNestedUpdatersPlugin(builder) {
9292
if (identifiers.length !== primaryKeys.length) {
9393
throw new Error('Invalid ID');
9494
}
95-
keyWhere = sql.fragment`${sql.join(
95+
keyWhere = sql.fragment`(${sql.join(
9696
primaryKeys.map(
9797
(key, idx) =>
9898
sql.fragment`${sql.identifier(key.name)} = ${gql2pg(
@@ -102,10 +102,10 @@ module.exports = function PostGraphileNestedUpdatersPlugin(builder) {
102102
)}`,
103103
),
104104
') and (',
105-
)}`;
105+
)})`;
106106
} else {
107107
const foreignPrimaryKeys = constraint.keyAttributes;
108-
keyWhere = sql.fragment`${sql.join(
108+
keyWhere = sql.fragment`(${sql.join(
109109
foreignPrimaryKeys.map(
110110
(k) => sql.fragment`
111111
${sql.identifier(k.name)} = ${gql2pg(
@@ -116,7 +116,7 @@ module.exports = function PostGraphileNestedUpdatersPlugin(builder) {
116116
`,
117117
),
118118
') and (',
119-
)}`;
119+
)})`;
120120
}
121121

122122
const patchField =

0 commit comments

Comments
 (0)