// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 package aws.proserve.bcs.dr.project; import aws.proserve.bcs.dr.ce.CloudEndureProject; import aws.proserve.bcs.dr.cem.CemProject; import aws.proserve.bcs.dr.dbdump.DbDumpProject; import aws.proserve.bcs.dr.dbreplica.DbReplicaProject; import aws.proserve.bcs.dr.dto.HasName; import aws.proserve.bcs.dr.dto.Identifiable; import aws.proserve.bcs.dr.dynamo.DynamoConstants; import aws.proserve.bcs.dr.dynamo.DynamoProject; import aws.proserve.bcs.dr.s3.S3Project; import aws.proserve.bcs.dr.secret.Secrets; import aws.proserve.bcs.dr.vpc.VpcProject; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGenerateStrategy; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedTimestamp; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIgnore; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverted; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBVersionAttribute; import java.util.Date; /** * A disaster recovery project. It manages all kinds of projects, from CloudEndure project to DynamoDB replication * project. * * @apiNote Unable to use interface as annotation is not inherited. */ @DynamoDBTable(tableName = DynamoConstants.TABLE_PROJECT) public class Project implements Identifiable, HasName { private String id; private Long version; private Date createdDate; private Date lastUpdatedDate; private String name; private String state; private Component type; private Region sourceRegion; private Region targetRegion; private CloudEndureProject cloudEndureProject; private CemProject cemProject; private S3Project s3Project; private VpcProject vpcProject; private DynamoProject dynamoProject; private DbDumpProject dbDumpProject; private DbReplicaProject dbReplicaProject; @Override @DynamoDBHashKey @DynamoDBAutoGeneratedKey public String getId() { return id; } public void setId(String id) { this.id = id; } @DynamoDBVersionAttribute public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version; } @DynamoDBAutoGeneratedTimestamp(strategy = DynamoDBAutoGenerateStrategy.CREATE) public Date getCreatedDate() { return createdDate; } public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; } @DynamoDBAutoGeneratedTimestamp public Date getLastUpdatedDate() { return lastUpdatedDate; } public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; } @Override public String getName() { return name; } public void setName(String name) { this.name = name; } @DynamoDBTypeConverted(converter = TypeConverter.class) public Component getType() { return type; } public void setType(Component type) { this.type = type; } /** * @apiNote Do not duplicate the state here. Store state at the sub-project level only. */ @DynamoDBIgnore public String getState() { return state; } public void setState(String state) { this.state = state; } public Region getSourceRegion() { return sourceRegion; } public void setSourceRegion(Region sourceRegion) { this.sourceRegion = sourceRegion; } public Region getTargetRegion() { return targetRegion; } public void setTargetRegion(Region targetRegion) { this.targetRegion = targetRegion; } public Region getRegion(Side side) { return side == Side.source ? getSourceRegion() : getTargetRegion(); } public CloudEndureProject getCloudEndureProject() { return cloudEndureProject; } public void setCloudEndureProject(CloudEndureProject cloudEndureProject) { this.cloudEndureProject = cloudEndureProject; } public CemProject getCemProject() { return cemProject; } public void setCemProject(CemProject cemProject) { this.cemProject = cemProject; } public S3Project getS3Project() { return s3Project; } public void setS3Project(S3Project s3Project) { this.s3Project = s3Project; } public VpcProject getVpcProject() { return vpcProject; } public void setVpcProject(VpcProject vpcProject) { this.vpcProject = vpcProject; } public DynamoProject getDynamoProject() { return dynamoProject; } public void setDynamoProject(DynamoProject dynamoProject) { this.dynamoProject = dynamoProject; } public DbDumpProject getDbDumpProject() { return dbDumpProject; } public void setDbDumpProject(DbDumpProject dbDumpProject) { this.dbDumpProject = dbDumpProject; } public DbReplicaProject getDbReplicaProject() { return dbReplicaProject; } public void setDbReplicaProject(DbReplicaProject dbReplicaProject) { this.dbReplicaProject = dbReplicaProject; } public String generateSecretId(Side side) { return Secrets.idOfAws(id, side); } /** * @apiNote DynamoDB requires it to be public. */ public static class TypeConverter implements DynamoDBTypeConverter { @Override public String convert(Component object) { return object.getName(); } @Override public Component unconvert(String object) { return Component.of(object); } } }