use crate::test_utils;
use aws_sdk_dynamodb::types::AttributeValue;
use std::collections::HashMap;
use aws_db_esdk::material_providers::client;
use aws_db_esdk::material_providers::types::material_providers_config::MaterialProvidersConfig;
use aws_db_esdk::CryptoAction;
use aws_db_esdk::dynamodb::types::DynamoDbTableEncryptionConfig;
use aws_db_esdk::intercept::DbEsdkInterceptor;
use aws_db_esdk::material_providers::types::DbeAlgorithmSuiteId;
use aws_db_esdk::types::dynamo_db_tables_encryption_config::DynamoDbTablesEncryptionConfig;
pub async fn put_item_get_item() -> Result<(), crate::BoxError> {
let kms_key_id = test_utils::TEST_KMS_KEY_ID;
let ddb_table_name = test_utils::TEST_DDB_TABLE_NAME;
let provider_config = MaterialProvidersConfig::builder().build()?;
let mat_prov = client::Client::from_conf(provider_config)?;
let kms_keyring = mat_prov
.create_aws_kms_mrk_multi_keyring()
.generator(kms_key_id)
.send()
.await?;
let attribute_actions_on_encrypt = HashMap::from([
("partition_key".to_string(), CryptoAction::SignOnly),
("sort_key".to_string(), CryptoAction::SignOnly),
("attribute1".to_string(), CryptoAction::EncryptAndSign),
("attribute2".to_string(), CryptoAction::SignOnly),
(":attribute3".to_string(), CryptoAction::DoNothing),
]);
const UNSIGNED_ATTR_PREFIX: &str = ":";
let table_config = DynamoDbTableEncryptionConfig::builder()
.logical_table_name(ddb_table_name)
.partition_key_name("partition_key")
.sort_key_name("sort_key")
.attribute_actions_on_encrypt(attribute_actions_on_encrypt)
.keyring(kms_keyring)
.allowed_unsigned_attribute_prefix(UNSIGNED_ATTR_PREFIX)
.algorithm_suite_id(
DbeAlgorithmSuiteId::AlgAes256GcmHkdfSha512CommitKeyEcdsaP384SymsigHmacSha384,
)
.build()?;
let table_configs = DynamoDbTablesEncryptionConfig::builder()
.table_encryption_configs(HashMap::from([(ddb_table_name.to_string(), table_config)]))
.build()?;
let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await;
let dynamo_config = aws_sdk_dynamodb::config::Builder::from(&sdk_config)
.interceptor(DbEsdkInterceptor::new(table_configs)?)
.build();
let ddb = aws_sdk_dynamodb::Client::from_conf(dynamo_config);
let item = HashMap::from([
(
"partition_key".to_string(),
AttributeValue::S("BasicPutGetExample".to_string()),
),
("sort_key".to_string(), AttributeValue::N("0".to_string())),
(
"attribute1".to_string(),
AttributeValue::S("encrypt and sign me!".to_string()),
),
(
"attribute2".to_string(),
AttributeValue::S("sign me!".to_string()),
),
(
":attribute3".to_string(),
AttributeValue::S("ignore me!".to_string()),
),
]);
ddb.put_item()
.table_name(ddb_table_name)
.set_item(Some(item.clone()))
.send()
.await?;
let key_to_get = HashMap::from([
(
"partition_key".to_string(),
AttributeValue::S("BasicPutGetExample".to_string()),
),
("sort_key".to_string(), AttributeValue::N("0".to_string())),
]);
let resp = ddb
.get_item()
.table_name(ddb_table_name)
.set_key(Some(key_to_get))
.consistent_read(true)
.send()
.await?;
assert_eq!(resp.item, Some(item));
println!("put_item_get_item successful.");
Ok(())
}