Skip to content

Commit

Permalink
refactor reading sql statement
Browse files Browse the repository at this point in the history
  • Loading branch information
sundersc committed Aug 23, 2023
1 parent aa5df36 commit cfdf2ea
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -105,4 +105,58 @@ describe('sql directive tests', () => {
'@sql directive \'reference\' argument must be a valid custom query name. Check type "Query" and field "calculateTaxRate". The custom query "calculate-tax" does not exist in "sql-statements" directory.',
);
});

it('should throw error if both statement and argument provided', () => {
const doc = /* GraphQL */ `
type Query {
calculateTaxRate(zip: String): Int @sql(statement: "SELECT * FROM TAXRATE WHERE ZIP = :zip", reference: "calculate-tax")
}
`;

const customQueries = new Map<string, string>();
customQueries.set('calculate-tax', 'SELECT * FROM TAXRATE WHERE ZIP = :zip');

const transformConfig = {
schema: doc,
transformers: [new ModelTransformer(), new SqlTransformer()],
customQueries,
modelToDatasourceMap: new Map(
Object.entries({
Post: {
dbType: 'MySQL' as const,
provisionDB: false,
},
}),
),
};

expect(() => testTransform(transformConfig)).toThrowError(
'@sql directive can have either \'statement\' or \'reference\' argument but not both. Check type "Query" and field "calculateTaxRate".',
);
});

it('should throw error if statement is empty', () => {
const doc = /* GraphQL */ `
type Query {
calculateTaxRate(zip: String): Int @sql(statement: "")
}
`;

const transformConfig = {
schema: doc,
transformers: [new ModelTransformer(), new SqlTransformer()],
modelToDatasourceMap: new Map(
Object.entries({
Post: {
dbType: 'MySQL' as const,
provisionDB: false,
},
}),
),
};

expect(() => testTransform(transformConfig)).toThrowError(
'@sql directive \'statement\' argument must not be empty. Check type "Query" and field "calculateTaxRate".',
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -88,22 +88,15 @@ export class SqlTransformer extends TransformerPluginBase {
resolverFns.forEach((config) => {
const { RDSLambdaDataSourceLogicalID: dataSourceId } = ResourceConstants.RESOURCES;
const dataSource = context.api.host.getDataSource(dataSourceId);
const MISSING_QUERY_STATEMENT = 'MISSING_CUSTOM_QUERY';
if (config.reference && !context.customQueries.has(config.reference)) {
throw new InvalidDirectiveError(
`@sql directive 'reference' argument must be a valid custom query name. Check type "${config.resolverTypeName}" and field "${config.resolverFieldName}". The custom query "${config.reference}" does not exist in "sql-statements" directory.`,
);
}

const statement = config.statement ?? (config.reference ? context.customQueries.get(config.reference) : MISSING_QUERY_STATEMENT);
const statement = getStatement(config, context.customQueries);
const resolverResourceId = ResolverResourceIDs.ResolverResourceID(config.resolverTypeName, config.resolverFieldName);
const resolver = context.resolvers.generateQueryResolver(
config.resolverTypeName,
config.resolverFieldName,
resolverResourceId,
dataSource as any,
MappingTemplate.s3MappingTemplateFromString(
generateSqlLambdaRequestTemplate(statement ?? MISSING_QUERY_STATEMENT, 'RAW_SQL', config.resolverFieldName),
generateSqlLambdaRequestTemplate(statement, 'RAW_SQL', config.resolverFieldName),
`${config.resolverTypeName}.${config.resolverFieldName}.req.vtl`,
),
MappingTemplate.s3MappingTemplateFromString(
Expand All @@ -119,6 +112,29 @@ export class SqlTransformer extends TransformerPluginBase {
};
}

const getStatement = (config: SqlDirectiveConfiguration, customQueries: Map<string, string>): string => {
if (config.reference && !customQueries.has(config.reference)) {
throw new InvalidDirectiveError(
`@sql directive 'reference' argument must be a valid custom query name. Check type "${config.resolverTypeName}" and field "${config.resolverFieldName}". The custom query "${config.reference}" does not exist in "sql-statements" directory.`,
);
}

if (config.reference && config.statement) {
throw new InvalidDirectiveError(
`@sql directive can have either 'statement' or 'reference' argument but not both. Check type "${config.resolverTypeName}" and field "${config.resolverFieldName}".`,
);
}

if (config.statement !== undefined && config.statement.trim().length === 0) {
throw new InvalidDirectiveError(
`@sql directive 'statement' argument must not be empty. Check type "${config.resolverTypeName}" and field "${config.resolverFieldName}".`,
);
}

const statement = config.statement ?? customQueries.get(config.reference!);
return statement!;
};

export const generateSqlLambdaRequestTemplate = (statement: string, operation: string, operationName: string): string => {
return printBlock('Invoke RDS Lambda data source')(
compoundExpression([
Expand Down

0 comments on commit cfdf2ea

Please sign in to comment.