Skip to content

Commit 37bc551

Browse files
author
Josue Ruiz
authored
fix(graphql-model-transformer): use modelobject key for mutation resolver creation (#7419)
create update and delete resolvers should check for model object key fix #i7417
1 parent 53c115f commit 37bc551

File tree

7 files changed

+288
-109
lines changed

7 files changed

+288
-109
lines changed

packages/amplify-util-mock/src/__e2e__/key-transformer.e2e.test.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { KeyTransformer } from 'graphql-key-transformer';
77

88
jest.setTimeout(2000000);
99

10-
let GRAPHQL_ENDPOINT = undefined;
11-
let GRAPHQL_CLIENT = undefined;
10+
let GRAPHQL_ENDPOINT: string = undefined;
11+
let GRAPHQL_CLIENT: GraphQLClient = undefined;
1212
let ddbEmulator = null;
1313
let dbPath = null;
1414
let server;
@@ -351,14 +351,25 @@ test('Test update mutation validation with three part secondary key.', async ()
351351
});
352352

353353
test('Test Customer Create with list member and secondary key', async () => {
354-
const createCustomer1 = await createCustomer('customer1@email.com', ['thing1', 'thing2'], 'customerusr1');
354+
await createCustomer('customer1@email.com', ['thing1', 'thing2'], 'customerusr1');
355355
const getCustomer1 = await getCustomer('customer1@email.com');
356356
expect(getCustomer1.data.getCustomer.addresslist).toEqual(['thing1', 'thing2']);
357-
// const items = await onCreateCustomer
357+
});
358+
359+
test('Test cannot overwrite customer record with custom primary key', async () => {
360+
await createCustomer('customer42@email.com', ['thing1', 'thing2'], 'customerusr42');
361+
const response = await createCustomer('customer42@email.com', ['thing2'], 'customerusr43');
362+
expect(response.errors).toBeDefined();
363+
expect(response.errors[0]).toEqual(
364+
expect.objectContaining({
365+
message: 'The conditional request failed',
366+
errorType: 'DynamoDB:ConditionalCheckFailedException',
367+
}),
368+
);
358369
});
359370

360371
test('Test Customer Mutation with list member', async () => {
361-
const updateCustomer1 = await updateCustomer('customer1@email.com', ['thing3', 'thing4'], 'new_customerusr1');
372+
await updateCustomer('customer1@email.com', ['thing3', 'thing4'], 'new_customerusr1');
362373
const getCustomer1 = await getCustomer('customer1@email.com');
363374
expect(getCustomer1.data.getCustomer.addresslist).toEqual(['thing3', 'thing4']);
364375
});

packages/graphql-auth-transformer/src/__tests__/__snapshots__/OperationsArgument.test.ts.snap

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,29 @@ $util.qr($context.args.input.put(\\"updatedAt\\", $util.defaultIfNull($ctx.args.
6363
6464
## [Start] Prepare DynamoDB PutItem Request. **
6565
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
66-
#set( $condition = {
66+
#if( $modelObjectKey )
67+
#set( $condition = {
68+
\\"expression\\": \\"\\",
69+
\\"expressionNames\\": {},
70+
\\"expressionValues\\": {}
71+
} )
72+
#foreach( $entry in $modelObjectKey.entrySet() )
73+
#if( $velocityCount == 1 )
74+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
75+
#else
76+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
77+
#end
78+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
79+
#end
80+
#else
81+
#set( $condition = {
6782
\\"expression\\": \\"attribute_not_exists(#id)\\",
6883
\\"expressionNames\\": {
6984
\\"#id\\": \\"id\\"
70-
}
85+
},
86+
\\"expressionValues\\": {}
7187
} )
88+
#end
7289
#if( $context.args.condition )
7390
#set( $condition.expressionValues = {} )
7491
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
@@ -423,7 +440,8 @@ exports[`Test "create", "update", "delete" auth operations 5`] = `
423440
#if( $modelObjectKey )
424441
#set( $condition = {
425442
\\"expression\\": \\"\\",
426-
\\"expressionNames\\": {}
443+
\\"expressionNames\\": {},
444+
\\"expressionValues\\": {}
427445
} )
428446
#foreach( $entry in $modelObjectKey.entrySet() )
429447
#if( $velocityCount == 1 )
@@ -438,7 +456,8 @@ exports[`Test "create", "update", "delete" auth operations 5`] = `
438456
\\"expression\\": \\"attribute_exists(#id)\\",
439457
\\"expressionNames\\": {
440458
\\"#id\\": \\"id\\"
441-
}
459+
},
460+
\\"expressionValues\\": {}
442461
} )
443462
#end
444463
#end
@@ -708,12 +727,29 @@ $util.qr($context.args.input.put(\\"updatedAt\\", $util.defaultIfNull($ctx.args.
708727
709728
## [Start] Prepare DynamoDB PutItem Request. **
710729
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
711-
#set( $condition = {
730+
#if( $modelObjectKey )
731+
#set( $condition = {
732+
\\"expression\\": \\"\\",
733+
\\"expressionNames\\": {},
734+
\\"expressionValues\\": {}
735+
} )
736+
#foreach( $entry in $modelObjectKey.entrySet() )
737+
#if( $velocityCount == 1 )
738+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
739+
#else
740+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
741+
#end
742+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
743+
#end
744+
#else
745+
#set( $condition = {
712746
\\"expression\\": \\"attribute_not_exists(#id)\\",
713747
\\"expressionNames\\": {
714748
\\"#id\\": \\"id\\"
715-
}
749+
},
750+
\\"expressionValues\\": {}
716751
} )
752+
#end
717753
#if( $context.args.condition )
718754
#set( $condition.expressionValues = {} )
719755
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
@@ -1068,7 +1104,8 @@ exports[`Test that operation overwrites queries in auth operations 5`] = `
10681104
#if( $modelObjectKey )
10691105
#set( $condition = {
10701106
\\"expression\\": \\"\\",
1071-
\\"expressionNames\\": {}
1107+
\\"expressionNames\\": {},
1108+
\\"expressionValues\\": {}
10721109
} )
10731110
#foreach( $entry in $modelObjectKey.entrySet() )
10741111
#if( $velocityCount == 1 )
@@ -1083,7 +1120,8 @@ exports[`Test that operation overwrites queries in auth operations 5`] = `
10831120
\\"expression\\": \\"attribute_exists(#id)\\",
10841121
\\"expressionNames\\": {
10851122
\\"#id\\": \\"id\\"
1086-
}
1123+
},
1124+
\\"expressionValues\\": {}
10871125
} )
10881126
#end
10891127
#end

packages/graphql-dynamodb-transformer/src/__tests__/DynamoDBModelTransformer.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ test('DynamoDB transformer should add default primary key when not defined', ()
618618
expect(getBaseType(defaultIdField.type)).toEqual('ID');
619619
});
620620

621-
test('DynamoDB transformer should add not default primary key when ID is defined', () => {
621+
test('DynamoDB transformer should not add default primary key when ID is defined', () => {
622622
const validSchema = `
623623
type Post @model{
624624
id: Int

packages/graphql-dynamodb-transformer/src/__tests__/__snapshots__/DynamoDBModelTransformer.test.ts.snap

Lines changed: 96 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ type Subscription {
152152
"
153153
`;
154154

155-
exports[`DynamoDB transformer should add not default primary key when ID is defined 1`] = `
155+
exports[`DynamoDB transformer should not add default primary key when ID is defined 1`] = `
156156
"## [Start] Set default values. **
157157
#set( $createdAt = $util.time.nowISO8601() )
158158
## Automatically set the createdAt timestamp. **
@@ -162,12 +162,29 @@ $util.qr($context.args.input.put(\\"updatedAt\\", $util.defaultIfNull($ctx.args.
162162
## [End] Set default values. **
163163
## [Start] Prepare DynamoDB PutItem Request. **
164164
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
165-
#set( $condition = {
165+
#if( $modelObjectKey )
166+
#set( $condition = {
167+
\\"expression\\": \\"\\",
168+
\\"expressionNames\\": {},
169+
\\"expressionValues\\": {}
170+
} )
171+
#foreach( $entry in $modelObjectKey.entrySet() )
172+
#if( $velocityCount == 1 )
173+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
174+
#else
175+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
176+
#end
177+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
178+
#end
179+
#else
180+
#set( $condition = {
166181
\\"expression\\": \\"attribute_not_exists(#id)\\",
167182
\\"expressionNames\\": {
168183
\\"#id\\": \\"id\\"
169-
}
184+
},
185+
\\"expressionValues\\": {}
170186
} )
187+
#end
171188
#if( $context.args.condition )
172189
#set( $condition.expressionValues = {} )
173190
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
@@ -320,12 +337,29 @@ $util.qr($context.args.input.put(\\"updatedAt\\", $util.defaultIfNull($ctx.args.
320337
## [End] Set default values. **
321338
## [Start] Prepare DynamoDB PutItem Request. **
322339
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
323-
#set( $condition = {
340+
#if( $modelObjectKey )
341+
#set( $condition = {
342+
\\"expression\\": \\"\\",
343+
\\"expressionNames\\": {},
344+
\\"expressionValues\\": {}
345+
} )
346+
#foreach( $entry in $modelObjectKey.entrySet() )
347+
#if( $velocityCount == 1 )
348+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
349+
#else
350+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
351+
#end
352+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
353+
#end
354+
#else
355+
#set( $condition = {
324356
\\"expression\\": \\"attribute_not_exists(#id)\\",
325357
\\"expressionNames\\": {
326358
\\"#id\\": \\"id\\"
327-
}
359+
},
360+
\\"expressionValues\\": {}
328361
} )
362+
#end
329363
#if( $context.args.condition )
330364
#set( $condition.expressionValues = {} )
331365
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
@@ -600,12 +634,29 @@ $util.qr($context.args.input.put(\\"id\\", $util.defaultIfNull($ctx.args.input.i
600634
## [End] Set default values. **
601635
## [Start] Prepare DynamoDB PutItem Request. **
602636
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
603-
#set( $condition = {
637+
#if( $modelObjectKey )
638+
#set( $condition = {
639+
\\"expression\\": \\"\\",
640+
\\"expressionNames\\": {},
641+
\\"expressionValues\\": {}
642+
} )
643+
#foreach( $entry in $modelObjectKey.entrySet() )
644+
#if( $velocityCount == 1 )
645+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
646+
#else
647+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
648+
#end
649+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
650+
#end
651+
#else
652+
#set( $condition = {
604653
\\"expression\\": \\"attribute_not_exists(#id)\\",
605654
\\"expressionNames\\": {
606655
\\"#id\\": \\"id\\"
607-
}
656+
},
657+
\\"expressionValues\\": {}
608658
} )
659+
#end
609660
#if( $context.args.condition )
610661
#set( $condition.expressionValues = {} )
611662
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
@@ -900,12 +951,29 @@ $util.qr($context.args.input.put(\\"id\\", $util.defaultIfNull($ctx.args.input.i
900951
## [End] Set default values. **
901952
## [Start] Prepare DynamoDB PutItem Request. **
902953
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
903-
#set( $condition = {
954+
#if( $modelObjectKey )
955+
#set( $condition = {
956+
\\"expression\\": \\"\\",
957+
\\"expressionNames\\": {},
958+
\\"expressionValues\\": {}
959+
} )
960+
#foreach( $entry in $modelObjectKey.entrySet() )
961+
#if( $velocityCount == 1 )
962+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
963+
#else
964+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
965+
#end
966+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
967+
#end
968+
#else
969+
#set( $condition = {
904970
\\"expression\\": \\"attribute_not_exists(#id)\\",
905971
\\"expressionNames\\": {
906972
\\"#id\\": \\"id\\"
907-
}
973+
},
974+
\\"expressionValues\\": {}
908975
} )
976+
#end
909977
#if( $context.args.condition )
910978
#set( $condition.expressionValues = {} )
911979
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
@@ -1304,12 +1372,29 @@ $util.qr($context.args.input.put(\\"updatedOn\\", $util.defaultIfNull($ctx.args.
13041372
## [End] Set default values. **
13051373
## [Start] Prepare DynamoDB PutItem Request. **
13061374
$util.qr($context.args.input.put(\\"__typename\\", \\"Post\\"))
1307-
#set( $condition = {
1375+
#if( $modelObjectKey )
1376+
#set( $condition = {
1377+
\\"expression\\": \\"\\",
1378+
\\"expressionNames\\": {},
1379+
\\"expressionValues\\": {}
1380+
} )
1381+
#foreach( $entry in $modelObjectKey.entrySet() )
1382+
#if( $velocityCount == 1 )
1383+
$util.qr($condition.put(\\"expression\\", \\"attribute_not_exists(#keyCondition$velocityCount)\\"))
1384+
#else
1385+
$util.qr($condition.put(\\"expression\\", \\"$condition.expression AND attribute_not_exists(#keyCondition$velocityCount)\\"))
1386+
#end
1387+
$util.qr($condition.expressionNames.put(\\"#keyCondition$velocityCount\\", \\"$entry.key\\"))
1388+
#end
1389+
#else
1390+
#set( $condition = {
13081391
\\"expression\\": \\"attribute_not_exists(#id)\\",
13091392
\\"expressionNames\\": {
13101393
\\"#id\\": \\"id\\"
1311-
}
1394+
},
1395+
\\"expressionValues\\": {}
13121396
} )
1397+
#end
13131398
#if( $context.args.condition )
13141399
#set( $condition.expressionValues = {} )
13151400
#set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )

0 commit comments

Comments
 (0)