/* eslint-disable no-new */
const { Stack, Duration, RemovalPolicy } = require('aws-cdk-lib')
const { Queue } = require('aws-cdk-lib/aws-sqs')
const { Bucket, BucketEncryption, BlockPublicAccess } = require('aws-cdk-lib/aws-s3')
const { Source, BucketDeployment } = require('aws-cdk-lib/aws-s3-deployment')
const { ContainerServer } = require('./container-server')
const { SupportedDeploymentTypes } = require('../config')
/**
* @class
*/
class PlatformStack extends Stack {
constructor(scope, id, props) {
super(scope, id, props)
if (!props?.config) {
throw ('[PlatformStack] No template config provided')
}
const isContainerDeploymentsEnabled = props.config.supportedDeploymentTypes.includes(SupportedDeploymentTypes.Container)
if (isContainerDeploymentsEnabled) {
new Queue(this, 'DeploymentQueue', {
queueName: `${props.config.platformName}-${props.config.activeEnvironment}`,
receiveMessageWaitTime: Duration.seconds(20)
})
const platformConfigBucket = new Bucket(this, 'PlatformConfig', {
bucketName: `${props.config.platformName}-${props.config.activeEnvironment}`,
blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
encryption: BucketEncryption.S3_MANAGED,
removalPolicy: RemovalPolicy.DESTROY,
autoDeleteObjects: true
})
const platformConfigDeployment = new BucketDeployment(this, 'PlatformConfigDeployment', {
sources: [Source.jsonData('platform-config.json', props.config)],
destinationBucket: platformConfigBucket
})
new ContainerServer(this, 'ContainerServer', {
platformConfig: props.config,
platformConfigBucket: platformConfigDeployment.deployedBucket
})
}
}
}
module.exports = {
PlatformStack
}