Source: infrastructure/platform-stack.js

/* 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
}