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 multi_put_get() -> 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 batch_write_item = HashMap::from([
(
"partition_key".to_string(),
AttributeValue::S("BatchWriteItemExample".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()),
),
]);
let put_request = aws_sdk_dynamodb::types::PutRequest::builder()
.set_item(Some(batch_write_item))
.build()?;
let batch_write_request = aws_sdk_dynamodb::types::WriteRequest::builder()
.put_request(put_request)
.build();
let transact_write_item = HashMap::from([
(
"partition_key".to_string(),
AttributeValue::S("TransactWriteItemExample".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()),
),
]);
let transact_put = aws_sdk_dynamodb::types::Put::builder()
.table_name(ddb_table_name)
.set_item(Some(transact_write_item))
.build()?;
let transact_item = aws_sdk_dynamodb::types::TransactWriteItem::builder()
.put(transact_put)
.build();
ddb.batch_write_item()
.request_items(ddb_table_name, vec![batch_write_request])
.send()
.await?;
ddb.transact_write_items()
.transact_items(transact_item)
.send()
.await?;
let batch_get_keys = HashMap::from([
(
"partition_key".to_string(),
AttributeValue::S("BatchWriteItemExample".to_string()),
),
("sort_key".to_string(), AttributeValue::N("0".to_string())),
]);
let keys_and_attr = aws_sdk_dynamodb::types::KeysAndAttributes::builder()
.keys(batch_get_keys)
.consistent_read(true)
.build()?;
let batch_get_response = ddb
.batch_get_item()
.request_items(ddb_table_name, keys_and_attr)
.send()
.await?;
let returned_item = &batch_get_response.responses.unwrap()[ddb_table_name][0];
assert_eq!(
returned_item["attribute1"],
AttributeValue::S("encrypt and sign me!".to_string())
);
let transact_get_keys = HashMap::from([
(
"partition_key".to_string(),
AttributeValue::S("TransactWriteItemExample".to_string()),
),
("sort_key".to_string(), AttributeValue::N("0".to_string())),
]);
let transact_get = aws_sdk_dynamodb::types::Get::builder()
.table_name(ddb_table_name)
.set_key(Some(transact_get_keys))
.build()?;
let transact_get_item = aws_sdk_dynamodb::types::TransactGetItem::builder()
.get(transact_get)
.build();
let transact_get_response = ddb
.transact_get_items()
.transact_items(transact_get_item)
.send()
.await?;
let the_item = transact_get_response.responses.as_ref().unwrap()[0]
.item
.as_ref()
.unwrap();
assert_eq!(
the_item["attribute1"],
AttributeValue::S("encrypt and sign me!".to_string())
);
println!("multi_put_get successful.");
Ok(())
}