graphql-transformer-core
Version:
A framework to transform from GraphQL SDL to AWS cloudFormation.
209 lines • 9.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SyncUtils = void 0;
const cloudform_types_1 = require("cloudform-types");
const graphql_transformer_common_1 = require("graphql-transformer-common");
var SyncUtils;
(function (SyncUtils) {
function createSyncTable() {
return new cloudform_types_1.DynamoDB.Table({
TableName: joinWithEnv('-', [graphql_transformer_common_1.SyncResourceIDs.syncTableName, cloudform_types_1.Fn.GetAtt(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLAPILogicalID, 'ApiId')]),
AttributeDefinitions: [
{
AttributeName: graphql_transformer_common_1.SyncResourceIDs.syncPrimaryKey,
AttributeType: 'S',
},
{
AttributeName: graphql_transformer_common_1.SyncResourceIDs.syncRangeKey,
AttributeType: 'S',
},
],
KeySchema: [
{
AttributeName: graphql_transformer_common_1.SyncResourceIDs.syncPrimaryKey,
KeyType: 'HASH',
},
{
AttributeName: graphql_transformer_common_1.SyncResourceIDs.syncRangeKey,
KeyType: 'RANGE',
},
],
BillingMode: 'PAY_PER_REQUEST',
TimeToLiveSpecification: syncTTLConfig(),
});
}
SyncUtils.createSyncTable = createSyncTable;
function createSyncIAMRole() {
const roleName = graphql_transformer_common_1.SyncResourceIDs.syncIAMRoleName;
return new cloudform_types_1.IAM.Role({
RoleName: joinWithEnv('-', [roleName, cloudform_types_1.Fn.GetAtt(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLAPILogicalID, 'ApiId')]),
AssumeRolePolicyDocument: {
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Principal: {
Service: 'appsync.amazonaws.com',
},
Action: 'sts:AssumeRole',
},
],
},
Policies: [
new cloudform_types_1.IAM.Role.Policy({
PolicyName: 'DynamoDBAccess',
PolicyDocument: {
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Action: [
'dynamodb:BatchGetItem',
'dynamodb:BatchWriteItem',
'dynamodb:PutItem',
'dynamodb:DeleteItem',
'dynamodb:GetItem',
'dynamodb:Scan',
'dynamodb:Query',
'dynamodb:UpdateItem',
],
Resource: [
cloudform_types_1.Fn.Sub('arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${tablename}', {
tablename: graphql_transformer_common_1.SyncResourceIDs.syncTableName,
}),
cloudform_types_1.Fn.Sub('arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${tablename}/*', {
tablename: graphql_transformer_common_1.SyncResourceIDs.syncTableName,
}),
],
},
],
},
}),
],
});
}
SyncUtils.createSyncIAMRole = createSyncIAMRole;
function syncLambdaArnResource({ name, region }) {
const env = 'env';
const substitutions = {};
if (referencesEnv(name)) {
substitutions[env] = cloudform_types_1.Fn.Ref(graphql_transformer_common_1.ResourceConstants.PARAMETERS.Env);
}
return cloudform_types_1.Fn.If(graphql_transformer_common_1.ResourceConstants.CONDITIONS.HasEnvironmentParameter, cloudform_types_1.Fn.Sub(lambdaArnKey(name, region), substitutions), cloudform_types_1.Fn.Sub(lambdaArnKey(removeEnvReference(name), region), {}));
}
SyncUtils.syncLambdaArnResource = syncLambdaArnResource;
function lambdaArnKey(name, region) {
return region
? `arn:aws:lambda:${region}:\${AWS::AccountId}:function:${name}`
: `arn:aws:lambda:\${AWS::Region}:\${AWS::AccountId}:function:${name}`;
}
SyncUtils.lambdaArnKey = lambdaArnKey;
function referencesEnv(value) {
return value.match(/(\${env})/) !== null;
}
function removeEnvReference(value) {
return value.replace(/(-\${env})/, '');
}
function joinWithEnv(separator, listToJoin) {
return cloudform_types_1.Fn.If(graphql_transformer_common_1.ResourceConstants.CONDITIONS.HasEnvironmentParameter, cloudform_types_1.Fn.Join(separator, [...listToJoin, cloudform_types_1.Fn.Ref(graphql_transformer_common_1.ResourceConstants.PARAMETERS.Env)]), cloudform_types_1.Fn.Join(separator, listToJoin));
}
function syncLambdaIAMRole({ name, region }) {
return new cloudform_types_1.IAM.Role({
RoleName: cloudform_types_1.Fn.If(graphql_transformer_common_1.ResourceConstants.CONDITIONS.HasEnvironmentParameter, cloudform_types_1.Fn.Join('-', [
name.slice(0, 26),
cloudform_types_1.Fn.GetAtt(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLAPILogicalID, 'ApiId'),
cloudform_types_1.Fn.Ref(graphql_transformer_common_1.ResourceConstants.PARAMETERS.Env),
]), cloudform_types_1.Fn.Join('-', [
name.slice(0, 37),
cloudform_types_1.Fn.GetAtt(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLAPILogicalID, 'ApiId'),
])),
AssumeRolePolicyDocument: {
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Principal: {
Service: 'appsync.amazonaws.com',
},
Action: 'sts:AssumeRole',
},
],
},
Policies: [
{
PolicyName: 'InvokeLambdaFunction',
PolicyDocument: {
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Action: ['lambda:InvokeFunction'],
Resource: syncLambdaArnResource({ name, region }),
},
],
},
},
],
});
}
SyncUtils.syncLambdaIAMRole = syncLambdaIAMRole;
function createSyncLambdaIAMPolicy({ name, region }) {
return new cloudform_types_1.IAM.Role.Policy({
PolicyName: 'InvokeLambdaFunction',
PolicyDocument: {
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Action: ['lambda:InvokeFunction'],
Resource: syncLambdaArnResource({ name, region }),
},
],
},
});
}
SyncUtils.createSyncLambdaIAMPolicy = createSyncLambdaIAMPolicy;
function syncTTLConfig() {
return {
AttributeName: '_ttl',
Enabled: true,
};
}
SyncUtils.syncTTLConfig = syncTTLConfig;
function syncDataSourceConfig() {
return {
DeltaSyncTableName: joinWithEnv('-', [
graphql_transformer_common_1.SyncResourceIDs.syncTableName,
cloudform_types_1.Fn.GetAtt(graphql_transformer_common_1.ResourceConstants.RESOURCES.GraphQLAPILogicalID, 'ApiId'),
]),
DeltaSyncTableTTL: 30,
BaseTableTTL: 43200,
};
}
SyncUtils.syncDataSourceConfig = syncDataSourceConfig;
function syncResolverConfig(syncConfig) {
const resolverObj = {
ConflictDetection: syncConfig.ConflictDetection,
ConflictHandler: syncConfig.ConflictHandler,
};
if (isLambdaSyncConfig(syncConfig)) {
resolverObj.LambdaConflictHandlerConfig = {
LambdaConflictHandlerArn: syncLambdaArnResource(syncConfig.LambdaConflictHandler),
};
}
return resolverObj;
}
SyncUtils.syncResolverConfig = syncResolverConfig;
function isLambdaSyncConfig(obj) {
const lambbdaConfigKey = 'LambdaConflictHandler';
if (obj && obj.ConflictHandler === 'LAMBDA') {
if (obj.hasOwnProperty(lambbdaConfigKey)) {
return true;
}
throw Error(`Invalid Lambda SyncConfig`);
}
return false;
}
SyncUtils.isLambdaSyncConfig = isLambdaSyncConfig;
})(SyncUtils = exports.SyncUtils || (exports.SyncUtils = {}));
//# sourceMappingURL=syncUtils.js.map