Skip to content

Commit

Permalink
fix(api): add identifier to generated ts data schema
Browse files Browse the repository at this point in the history
  • Loading branch information
sundersc committed Apr 9, 2024
1 parent fd7f6fb commit 9d27a5d
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/amplify-graphql-schema-generator/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export abstract class DataSourceAdapter {
// @public (undocumented)
export type DataSourceConfig = {
secretName: string;
identifier: string;
vpcConfig?: VpcConfig;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ import { secret } from \\"@aws-amplify/backend\\";
export const schema = configure({
database: {
identifier: \\"ID1234567890\\",
engine: \\"postgresql\\",
connectionUri: secret(\\"CONN_STR\\"),
vpcConfig: {
Expand Down Expand Up @@ -111,6 +112,7 @@ import { secret } from \\"@aws-amplify/backend\\";
export const schema = configure({
database: {
identifier: \\"ID1234567890\\",
engine: \\"mysql\\",
connectionUri: secret(\\"CONN_STR\\"),
vpcConfig: {
Expand Down Expand Up @@ -161,6 +163,7 @@ import { secret } from \\"@aws-amplify/backend\\";
export const schema = configure({
database: {
identifier: \\"ID1234567890\\",
engine: \\"mysql\\",
connectionUri: secret(\\"CONN_STR\\")
}
Expand All @@ -180,3 +183,26 @@ export const schema = configure({
});
"
`;

exports[`Type name conversions ts schema generator should invoke generate schema 1`] = `
"/* eslint-disable */
import { a } from \\"@aws-amplify/data-schema\\";
import { configure } from \\"@aws-amplify/data-schema/internals\\";
import { secret } from \\"@aws-amplify/backend\\";
export const schema = configure({
database: {
identifier: \\"IDUSfpAK13zArse10XtJJWbw\\",
engine: \\"mysql\\",
connectionUri: secret(\\"secret\\")
}
}).schema({
\\"User\\": a.model({
id: a.string().required(),
name: a.string()
}).identifier([
\\"id\\"
])
});
"
`;
Original file line number Diff line number Diff line change
@@ -1,8 +1,34 @@
import { Engine, Field, Model, Schema } from '../schema-representation';
import { generateTypescriptDataSchema } from '../ts-schema-generator/generate-ts-schema';
import { DataSourceConfig } from '../ts-schema-generator/helpers';
import { TypescriptDataSchemaGenerator } from '../ts-schema-generator/ts-schema-generator';

describe('Type name conversions', () => {
it('ts schema generator should invoke generate schema', async () => {
const dbschema = new Schema(new Engine('MySQL'));
const model = new Model('User');
model.addField(new Field('id', { kind: 'NonNull', type: { kind: 'Scalar', name: 'String' } }));
model.addField(new Field('name', { kind: 'Scalar', name: 'String' }));
model.setPrimaryKey(['id']);
dbschema.addModel(model);

const buildSchemaMockMethod = jest.spyOn(TypescriptDataSchemaGenerator as any, 'buildSchema');
buildSchemaMockMethod.mockImplementation(() => {
return dbschema;
});

const schema = await TypescriptDataSchemaGenerator.generate({
engine: 'mysql',
host: 'host',
port: 3306,
database: 'database',
username: 'username',
password: 'password',
connectionUriSecretName: 'secret',
});
expect(schema).toMatchSnapshot();
});

it('basic models should generate correct typescript data schema', () => {
const dbschema = new Schema(new Engine('MySQL'));
let model = new Model('User');
Expand Down Expand Up @@ -75,6 +101,7 @@ describe('Type name conversions', () => {
dbschema.addModel(model);

const config: DataSourceConfig = {
identifier: 'ID1234567890',
secretName: 'CONN_STR',
vpcConfig: {
vpcId: '123',
Expand Down Expand Up @@ -109,6 +136,7 @@ describe('Type name conversions', () => {
dbschema.addModel(model);

const config: DataSourceConfig = {
identifier: 'ID1234567890',
secretName: 'CONN_STR',
vpcConfig: {
vpcId: '123',
Expand Down Expand Up @@ -141,6 +169,7 @@ describe('Type name conversions', () => {
dbschema.addModel(model);

const config: DataSourceConfig = {
identifier: 'ID1234567890',
secretName: 'CONN_STR',
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ const exportModifier = ts.factory.createModifier(ts.SyntaxKind.ExportKeyword);

export type DataSourceConfig = {
secretName: string;
identifier: string;
vpcConfig?: VpcConfig;
};

Expand Down Expand Up @@ -231,6 +232,10 @@ export const createConfigureExpression = (schema: Schema, config: DataSourceConf
return ts.factory.createIdentifier(TYPESCRIPT_DATA_SCHEMA_CONSTANTS.REFERENCE_A);
}
const databaseConfig = [
ts.factory.createPropertyAssignment(
ts.factory.createIdentifier(TYPESCRIPT_DATA_SCHEMA_CONSTANTS.PROPERTY_IDENTIFIER),
ts.factory.createStringLiteral(config.identifier),
),
ts.factory.createPropertyAssignment(
ts.factory.createIdentifier(TYPESCRIPT_DATA_SCHEMA_CONSTANTS.PROPERTY_ENGINE),
ts.factory.createStringLiteral(convertDBEngineToDBProtocol(schema.getEngine().type)),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { createHash } from 'crypto';
import { DataSourceAdapter, MySQLDataSourceAdapter, PostgresDataSourceAdapter } from '../datasource-adapter';
import { DBEngineType, Engine, Schema } from '../schema-representation';
import { getHostVpc } from '../utils';
Expand All @@ -22,6 +23,7 @@ export class TypescriptDataSchemaGenerator {
return generateTypescriptDataSchema(schema, {
secretName: config.connectionUriSecretName,
vpcConfig: await getHostVpc(config.host),
identifier: TypescriptDataSchemaGenerator.createIdentifier(config),
});
};

Expand Down Expand Up @@ -54,4 +56,17 @@ export class TypescriptDataSchemaGenerator {
models.forEach((m) => schema.addModel(m));
return schema;
};

private static createIdentifier = (config: TypescriptDataSchemaGeneratorConfig): string => {
const { host, username, database, engine, port } = config;
const identifierString = host.concat(engine, database, username, port.toString());
const identifierHash = createHash('md5').update(identifierString).digest('base64');
const identifier = `ID${TypescriptDataSchemaGenerator.removeNonAlphaNumericChars(identifierHash)}`;
// Identifier must contain only AlphaNumeric characters.
return identifier;
};

private static removeNonAlphaNumericChars = (str: string): string => {
return str.split(/[^A-Za-z0-9]*/).join('');
};
}
1 change: 1 addition & 0 deletions packages/graphql-transformer-common/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,7 @@ export const TYPESCRIPT_DATA_SCHEMA_CONSTANTS: {
PROPERTY_DATABASE: string;
PROPERTY_CONNECTION_URI: string;
PROPERTY_ENGINE: string;
PROPERTY_IDENTIFIER: string;
};

// @public (undocumented)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ export const TYPESCRIPT_DATA_SCHEMA_CONSTANTS = {
PROPERTY_DATABASE: 'database',
PROPERTY_CONNECTION_URI: 'connectionUri',
PROPERTY_ENGINE: 'engine',
PROPERTY_IDENTIFIER: 'identifier',
};

0 comments on commit 9d27a5d

Please sign in to comment.