Skip to content

Commit

Permalink
Merge pull request #2465 from aws-amplify/main
Browse files Browse the repository at this point in the history
Release API category - 04/16
  • Loading branch information
AaronZyLee committed Apr 16, 2024
2 parents 1f63fca + 53cabe2 commit 025a1f0
Show file tree
Hide file tree
Showing 15 changed files with 283 additions and 57 deletions.
36 changes: 18 additions & 18 deletions packages/amplify-data-construct/.jsii
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@
"bundled": {
"@aws-amplify/backend-output-schemas": "^0.4.0",
"@aws-amplify/backend-output-storage": "^0.2.2",
"@aws-amplify/graphql-auth-transformer": "3.4.2",
"@aws-amplify/graphql-default-value-transformer": "2.3.2",
"@aws-amplify/graphql-auth-transformer": "3.4.3",
"@aws-amplify/graphql-default-value-transformer": "2.3.3",
"@aws-amplify/graphql-directives": "1.0.1",
"@aws-amplify/graphql-function-transformer": "2.1.19",
"@aws-amplify/graphql-http-transformer": "2.1.19",
"@aws-amplify/graphql-index-transformer": "2.3.8",
"@aws-amplify/graphql-maps-to-transformer": "3.4.9",
"@aws-amplify/graphql-model-transformer": "2.7.0",
"@aws-amplify/graphql-predictions-transformer": "2.1.19",
"@aws-amplify/graphql-relational-transformer": "2.4.2",
"@aws-amplify/graphql-searchable-transformer": "2.6.2",
"@aws-amplify/graphql-sql-transformer": "0.2.8",
"@aws-amplify/graphql-transformer": "1.4.0",
"@aws-amplify/graphql-transformer-core": "2.5.1",
"@aws-amplify/graphql-transformer-interfaces": "3.5.0",
"@aws-amplify/graphql-function-transformer": "2.1.20",
"@aws-amplify/graphql-http-transformer": "2.1.20",
"@aws-amplify/graphql-index-transformer": "2.3.9",
"@aws-amplify/graphql-maps-to-transformer": "3.4.10",
"@aws-amplify/graphql-model-transformer": "2.8.0",
"@aws-amplify/graphql-predictions-transformer": "2.1.20",
"@aws-amplify/graphql-relational-transformer": "2.4.3",
"@aws-amplify/graphql-searchable-transformer": "2.6.3",
"@aws-amplify/graphql-sql-transformer": "0.2.9",
"@aws-amplify/graphql-transformer": "1.5.0",
"@aws-amplify/graphql-transformer-core": "2.6.0",
"@aws-amplify/graphql-transformer-interfaces": "3.6.0",
"@aws-amplify/platform-core": "^0.2.0",
"@aws-amplify/plugin-types": "^0.4.1",
"charenc": "^0.0.2",
Expand All @@ -31,7 +31,7 @@
"graceful-fs": "^4.2.11",
"graphql": "^15.5.0",
"graphql-mapping-template": "4.20.15",
"graphql-transformer-common": "4.29.0",
"graphql-transformer-common": "4.30.0",
"hjson": "^3.2.2",
"immer": "^9.0.12",
"is-buffer": "^2.0.5",
Expand All @@ -46,7 +46,7 @@
"zod": "^3.22.3"
},
"dependencies": {
"@aws-amplify/graphql-api-construct": "1.7.0",
"@aws-amplify/graphql-api-construct": "1.8.0",
"aws-cdk-lib": "^2.80.0",
"constructs": "^10.0.5"
},
Expand Down Expand Up @@ -3534,6 +3534,6 @@
}
},
"types": {},
"version": "1.7.0",
"fingerprint": "hJ+zHUkxJOn46VBUe61UNzcnjqTqgD6vGukycoNnaeE="
"version": "1.7.1",
"fingerprint": "+myaPFbwTM+7k88hI6Ezcd3ynSMuB8jFfaDcdPJWmnY="
}
2 changes: 1 addition & 1 deletion packages/amplify-e2e-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
"jest-environment-node": "^26.6.2",
"knex": "~2.4.0",
"lodash": "^4.17.21",
"mysql2": "~2.3.3",
"mysql2": "~3.9.4",
"node-fetch": "^2.6.7",
"node-pty": "beta",
"pg": "~8.11.3",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,32 @@ export const schema = `
groupContent: String @refersTo(name: "group_content") @auth(rules: [{ allow: groups, groupsField: "customGroup", operations: [create, read] }])
groupsContent: String @refersTo(name: "groups_content") @auth(rules: [{ allow: groups, groupsField: "customGroups", operations: [update, read] }])
}
type PrimaryOne @model @auth(rules: [{ allow: owner }]) {
id: String! @primaryKey
owner: String
relatedOne: RelatedOne @hasOne(references: ["primaryId"])
}
type RelatedOne @model @auth(rules: [{ allow: owner, ownerField: "relatedOwner" }]) {
id: String! @primaryKey
relatedOwner: String
primaryId: String
primary: PrimaryOne @belongsTo(references: ["primaryId"])
}
type PrimaryTwo @model @auth(rules: [{ allow: owner }]) {
id: String! @primaryKey
owner: String
relatedTwos: [RelatedTwo] @hasMany(references: ["primaryId"])
}
type RelatedTwo @model @auth(rules: [{ allow: owner, ownerField: "relatedOwner" }]) {
id: String! @primaryKey
relatedOwner: String
primaryId: String
primary: PrimaryTwo @belongsTo(references: ["primaryId"])
}
`;

export const sqlCreateStatements = (engine: ImportedRDSType): string[] => generateDDL(schema, engine);
Original file line number Diff line number Diff line change
Expand Up @@ -3542,5 +3542,165 @@ export const testUserPoolFieldAuth = (engine: ImportedRDSType): void => {
checkListItemExistence(listTodosResult2, `list${modelName}`, todoPrivateFields['id'], true);
checkListResponseErrors(listTodosResult2, expectedFieldErrors(ownerAndGroupFields, modelName, false));
});

test('owner rule on relational models should respect owner auth rule - has one and belongs to', async () => {
const modelNamePrimaryOne = 'PrimaryOne';
const modelNameRelatedOne = 'RelatedOne';
const user1PrimaryOneHelper = user1ModelOperationHelpers[modelNamePrimaryOne];
const user2RelatedOneHelper = user2ModelOperationHelpers[modelNameRelatedOne];

const primaryRecord = {
id: '1',
owner: userName1,
};
const relatedRecord = {
id: '1',
relatedOwner: userName2,
primaryId: primaryRecord['id'],
};
const createResultSetNamePrimary = `create${modelNamePrimaryOne}`;
const createResultSetNameRelated = `create${modelNameRelatedOne}`;

// Create a primary record with user1
const createResultPrimary = await user1PrimaryOneHelper.create(createResultSetNamePrimary, primaryRecord, 'id owner');
expect(createResultPrimary.data[createResultSetNamePrimary].id).toBeDefined();
expect(createResultPrimary.data[createResultSetNamePrimary].id).toEqual(primaryRecord['id']);
expect(createResultPrimary.data[createResultSetNamePrimary].owner).toEqual(userName1);

// Create a related record with user2
const createResultRelated = await user2RelatedOneHelper.create(
createResultSetNameRelated,
relatedRecord,
'id relatedOwner primaryId',
);
expect(createResultRelated.data[createResultSetNameRelated].id).toBeDefined();
expect(createResultRelated.data[createResultSetNameRelated].id).toEqual(relatedRecord['id']);
expect(createResultRelated.data[createResultSetNameRelated].relatedOwner).toEqual(userName2);
expect(createResultRelated.data[createResultSetNameRelated].primaryId).toEqual(relatedRecord['primaryId']);

// Get primary record with user1, related record should be null
const primaryWithRelatedQuery = `
query GetPrimaryOne($id: String!) {
getPrimaryOne(id: $id) {
id
owner
relatedOne {
id
relatedOwner
}
}
}
`;
const getResultSetNamePrimary = `get${modelNamePrimaryOne}`;
const getResultPrimary = await user1PrimaryOneHelper.get({ id: primaryRecord['id'] }, primaryWithRelatedQuery);
expect(getResultPrimary.data[getResultSetNamePrimary].id).toEqual(primaryRecord['id']);
expect(getResultPrimary.data[getResultSetNamePrimary].owner).toEqual(userName1);
expect(getResultPrimary.data[getResultSetNamePrimary].relatedOne).toBeNull();

// Get related record with user2, related record should be null
const relatedWithPrimaryQuery = `
query GetRelatedOne($id: String!) {
getRelatedOne(id: $id) {
id
relatedOwner
primaryId
primary {
id
owner
}
}
}
`;
const getResultSetNameRelated = `get${modelNameRelatedOne}`;
const getResultRelated = await user2RelatedOneHelper.get({ id: relatedRecord['id'] }, relatedWithPrimaryQuery);
expect(getResultRelated.data[getResultSetNameRelated].id).toEqual(relatedRecord['id']);
expect(getResultRelated.data[getResultSetNameRelated].relatedOwner).toEqual(userName2);
expect(getResultRelated.data[getResultSetNameRelated].primaryId).toEqual(relatedRecord['primaryId']);
expect(getResultRelated.data[getResultSetNameRelated].primary).toBeNull();
});

test('owner rule on relational models should respect owner auth rule - has many and belongs to', async () => {
const modelNamePrimaryTwo = 'PrimaryTwo';
const modelNameRelatedTwo = 'RelatedTwo';
const user1PrimaryTwoHelper = user1ModelOperationHelpers[modelNamePrimaryTwo];
const user1RelatedTwoHelper = user1ModelOperationHelpers[modelNameRelatedTwo];
const user2RelatedTwoHelper = user2ModelOperationHelpers[modelNameRelatedTwo];

const primaryRecord = {
id: '1',
owner: userName1,
};
const relatedRecord1 = {
id: '1',
relatedOwner: userName2,
primaryId: primaryRecord['id'],
};
const relatedRecord2 = {
id: '2',
relatedOwner: userName1,
primaryId: primaryRecord['id'],
};
const createResultSetNamePrimary = `create${modelNamePrimaryTwo}`;
const createResultSetNameRelated = `create${modelNameRelatedTwo}`;

// Create a primary record with user1
const createResultPrimary = await user1PrimaryTwoHelper.create(createResultSetNamePrimary, primaryRecord, 'id owner');
expect(createResultPrimary.data[createResultSetNamePrimary].id).toBeDefined();
expect(createResultPrimary.data[createResultSetNamePrimary].id).toEqual(primaryRecord['id']);
expect(createResultPrimary.data[createResultSetNamePrimary].owner).toEqual(userName1);

// Create a related record with user2
const createResultRelated1 = await user2RelatedTwoHelper.create(
createResultSetNameRelated,
relatedRecord1,
'id relatedOwner primaryId',
);
expect(createResultRelated1.data[createResultSetNameRelated].id).toBeDefined();
expect(createResultRelated1.data[createResultSetNameRelated].id).toEqual(relatedRecord1['id']);
expect(createResultRelated1.data[createResultSetNameRelated].relatedOwner).toEqual(userName2);
expect(createResultRelated1.data[createResultSetNameRelated].primaryId).toEqual(relatedRecord1['primaryId']);

// Create a related record with user1
const createResultRelated2 = await user1RelatedTwoHelper.create(
createResultSetNameRelated,
relatedRecord2,
'id relatedOwner primaryId',
);
expect(createResultRelated2.data[createResultSetNameRelated].id).toBeDefined();
expect(createResultRelated2.data[createResultSetNameRelated].id).toEqual(relatedRecord2['id']);
expect(createResultRelated2.data[createResultSetNameRelated].relatedOwner).toEqual(userName1);
expect(createResultRelated2.data[createResultSetNameRelated].primaryId).toEqual(relatedRecord2['primaryId']);

// Get primary record with user1, related field should return only the records with relatedOwner as user1
const primaryWithRelatedQuery = `
query GetPrimaryTwo($id: String!) {
getPrimaryTwo(id: $id) {
id
owner
relatedTwos {
items {
id
relatedOwner
primaryId
}
}
}
}
`;
const getResultSetNamePrimary = `get${modelNamePrimaryTwo}`;
const getResultPrimary = await user1PrimaryTwoHelper.get({ id: primaryRecord['id'] }, primaryWithRelatedQuery);
expect(getResultPrimary.data[getResultSetNamePrimary].id).toEqual(primaryRecord['id']);
expect(getResultPrimary.data[getResultSetNamePrimary].owner).toEqual(userName1);
expect(getResultPrimary.data[getResultSetNamePrimary].relatedTwos).toBeDefined();
expect(getResultPrimary.data[getResultSetNamePrimary].relatedTwos.items).toBeDefined();
expect(getResultPrimary.data[getResultSetNamePrimary].relatedTwos.items.length).toEqual(1);
expect(getResultPrimary.data[getResultSetNamePrimary].relatedTwos.items[0]).toEqual(
expect.objectContaining({
id: relatedRecord2['id'],
relatedOwner: userName1,
primaryId: relatedRecord2['primaryId'],
}),
);
});
});
};
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
API_POST_PROCESSOR_SET_PROVISIONED_THROUGHPUT_TWO_GSIS,
COUNT_100_THOUSAND,
DURATION_30_MINUTES,
DURATION_45_MINUTES,
MUTATION_FOUR_FIELD_CREATE,
SCHEMA_FOUR_FIELDS_FINAL_TWO_INDEXED,
SCHEMA_FOUR_FIELDS_INITIAL_TWO_INDEXED,
Expand All @@ -10,7 +10,7 @@ import { recordCountDataProvider, recordCountDataValidator, testManagedTableDepl

testManagedTableDeployment({
name: 'Replace 2 GSIs updated w/ attr update - 100k Records',
maxDeployDurationMs: DURATION_30_MINUTES,
maxDeployDurationMs: DURATION_45_MINUTES,
initialSchema: SCHEMA_FOUR_FIELDS_INITIAL_TWO_INDEXED,
updatedSchema: SCHEMA_FOUR_FIELDS_FINAL_TWO_INDEXED,
dataSetup: recordCountDataProvider(COUNT_100_THOUSAND, MUTATION_FOUR_FIELD_CREATE),
Expand Down
34 changes: 17 additions & 17 deletions packages/amplify-graphql-api-construct/.jsii
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@
"bundled": {
"@aws-amplify/backend-output-schemas": "^0.4.0",
"@aws-amplify/backend-output-storage": "^0.2.2",
"@aws-amplify/graphql-auth-transformer": "3.4.2",
"@aws-amplify/graphql-default-value-transformer": "2.3.2",
"@aws-amplify/graphql-auth-transformer": "3.4.3",
"@aws-amplify/graphql-default-value-transformer": "2.3.3",
"@aws-amplify/graphql-directives": "1.0.1",
"@aws-amplify/graphql-function-transformer": "2.1.19",
"@aws-amplify/graphql-http-transformer": "2.1.19",
"@aws-amplify/graphql-index-transformer": "2.3.8",
"@aws-amplify/graphql-maps-to-transformer": "3.4.9",
"@aws-amplify/graphql-model-transformer": "2.7.0",
"@aws-amplify/graphql-predictions-transformer": "2.1.19",
"@aws-amplify/graphql-relational-transformer": "2.4.2",
"@aws-amplify/graphql-searchable-transformer": "2.6.2",
"@aws-amplify/graphql-sql-transformer": "0.2.8",
"@aws-amplify/graphql-transformer": "1.4.0",
"@aws-amplify/graphql-transformer-core": "2.5.1",
"@aws-amplify/graphql-transformer-interfaces": "3.5.0",
"@aws-amplify/graphql-function-transformer": "2.1.20",
"@aws-amplify/graphql-http-transformer": "2.1.20",
"@aws-amplify/graphql-index-transformer": "2.3.9",
"@aws-amplify/graphql-maps-to-transformer": "3.4.10",
"@aws-amplify/graphql-model-transformer": "2.8.0",
"@aws-amplify/graphql-predictions-transformer": "2.1.20",
"@aws-amplify/graphql-relational-transformer": "2.4.3",
"@aws-amplify/graphql-searchable-transformer": "2.6.3",
"@aws-amplify/graphql-sql-transformer": "0.2.9",
"@aws-amplify/graphql-transformer": "1.5.0",
"@aws-amplify/graphql-transformer-core": "2.6.0",
"@aws-amplify/graphql-transformer-interfaces": "3.6.0",
"@aws-amplify/platform-core": "^0.2.0",
"@aws-amplify/plugin-types": "^0.4.1",
"charenc": "^0.0.2",
Expand All @@ -31,7 +31,7 @@
"graceful-fs": "^4.2.11",
"graphql": "^15.5.0",
"graphql-mapping-template": "4.20.15",
"graphql-transformer-common": "4.29.0",
"graphql-transformer-common": "4.30.0",
"hjson": "^3.2.2",
"immer": "^9.0.12",
"is-buffer": "^2.0.5",
Expand Down Expand Up @@ -8170,6 +8170,6 @@
"symbolId": "src/model-datasource-strategy-types:VpcConfig"
}
},
"version": "1.7.0",
"fingerprint": "bwDzPgpuWoeGBaJYiwKc49U+YQ0YU9eMGAQ5zgfkTyY="
"version": "1.8.0",
"fingerprint": "URmpQ7vGkGDL7uIE8+hUDse1MLKd/FzgzVNJr73Rn34="
}
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,9 @@ $util.qr($lambdaInput.args.putAll($util.defaultIfNull($context.arguments, {})))
#if( !$lambdaInput.args.filter )
#set( $lambdaInput.args.filter = {} )
#end
#if( !$util.isNullOrEmpty($ctx.stash.authFilter) )
#set( $lambdaInput.args.metadata.authFilter = $ctx.stash.authFilter )
#end
$util.qr($lambdaInput.args.filter.put(\\"employeeId\\", {
\\"eq\\": $util.defaultIfNull($ctx.source.id, \\"\\")
}))
Expand Down Expand Up @@ -470,6 +473,9 @@ $util.qr($lambdaInput.args.putAll($util.defaultIfNull($context.arguments, {})))
#if( !$lambdaInput.args.input )
#set( $lambdaInput.args.input = {} )
#end
#if( !$util.isNullOrEmpty($ctx.stash.authFilter) )
#set( $lambdaInput.args.metadata.authFilter = $ctx.stash.authFilter )
#end
$util.qr($lambdaInput.args.input.put(\\"id\\", $util.defaultIfNull($ctx.source.employeeId, \\"\\")))
{
\\"version\\": \\"2018-05-29\\",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,9 @@ $util.qr($lambdaInput.args.putAll($util.defaultIfNull($context.arguments, {})))
#if( !$lambdaInput.args.input )
#set( $lambdaInput.args.input = {} )
#end
#if( !$util.isNullOrEmpty($ctx.stash.authFilter) )
#set( $lambdaInput.args.metadata.authFilter = $ctx.stash.authFilter )
#end
$util.qr($lambdaInput.args.input.put(\\"employeeId\\", {
\\"eq\\": $util.defaultIfNull($ctx.source.id, \\"\\")
}))
Expand Down Expand Up @@ -461,6 +464,9 @@ $util.qr($lambdaInput.args.putAll($util.defaultIfNull($context.arguments, {})))
#if( !$lambdaInput.args.input )
#set( $lambdaInput.args.input = {} )
#end
#if( !$util.isNullOrEmpty($ctx.stash.authFilter) )
#set( $lambdaInput.args.metadata.authFilter = $ctx.stash.authFilter )
#end
$util.qr($lambdaInput.args.input.put(\\"id\\", $util.defaultIfNull($ctx.source.employeeId, \\"\\")))
{
\\"version\\": \\"2018-05-29\\",
Expand Down
Loading

0 comments on commit 025a1f0

Please sign in to comment.