using System; using System.Collections.Generic; using System.Threading.Tasks; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Shared.Models; namespace Shared.DataAccess { public class DynamoDbProducts : ProductsDAO { private static string PRODUCT_TABLE_NAME = Environment.GetEnvironmentVariable("PRODUCT_TABLE_NAME"); private readonly AmazonDynamoDBClient _dynamoDbClient; public DynamoDbProducts() { this._dynamoDbClient = new AmazonDynamoDBClient(); this._dynamoDbClient.DescribeTableAsync(PRODUCT_TABLE_NAME).GetAwaiter().GetResult(); } public async Task<Product?> GetProduct(string id) { var getItemResponse = await this._dynamoDbClient.GetItemAsync(new GetItemRequest(PRODUCT_TABLE_NAME, new Dictionary<string, AttributeValue>(1) { {ProductMapper.PK, new AttributeValue(id)} })); return getItemResponse.IsItemSet ? ProductMapper.ProductFromDynamoDB(getItemResponse.Item) : null; } public async Task PutProduct(Product product) { await this._dynamoDbClient.PutItemAsync(PRODUCT_TABLE_NAME, ProductMapper.ProductToDynamoDb(product)); } public async Task DeleteProduct(string id) { await this._dynamoDbClient.DeleteItemAsync(PRODUCT_TABLE_NAME, new Dictionary<string, AttributeValue>(1) { {ProductMapper.PK, new AttributeValue(id)} }); } public async Task<ProductWrapper> GetAllProducts() { var data = await this._dynamoDbClient.ScanAsync(new ScanRequest() { TableName = PRODUCT_TABLE_NAME, Limit = 20 }); var products = new List<Product>(); foreach (var item in data.Items) { products.Add(ProductMapper.ProductFromDynamoDB(item)); } return new ProductWrapper(products); } } }