in src/cartservice/src/cartstore/SpannerCartStore.cs [54:102]
public async Task AddItemAsync(string userId, string productId, int quantity)
{
Console.WriteLine($"AddItemAsync for {userId} called");
try
{
using SpannerConnection spannerConnection = new(databaseString);
await spannerConnection.RunWithRetriableTransactionAsync(async transaction =>
{
int currentQuantity = 0;
var quantityLookup = spannerConnection.CreateSelectCommand(
$"SELECT * FROM {TableName} WHERE userId = @userId AND productId = @productId",
new SpannerParameterCollection
{
{ "userId", SpannerDbType.String },
{ "productId", SpannerDbType.String }
});
quantityLookup.Parameters["userId"].Value = userId;
quantityLookup.Parameters["productId"].Value = productId;
quantityLookup.Transaction = transaction;
using (var reader = await quantityLookup.ExecuteReaderAsync())
{
while (await reader.ReadAsync()) {
currentQuantity += reader.GetFieldValue<int>("quantity");
}
}
var cmd = spannerConnection.CreateInsertOrUpdateCommand(TableName,
new SpannerParameterCollection
{
{ "userId", SpannerDbType.String },
{ "productId", SpannerDbType.String },
{ "quantity", SpannerDbType.Int64 }
});
cmd.Parameters["userId"].Value = userId;
cmd.Parameters["productId"].Value = productId;
cmd.Parameters["quantity"].Value = currentQuantity + quantity;
cmd.Transaction = transaction;
await Task.Run(() =>
{
return cmd.ExecuteNonQueryAsync();
});
});
}
catch (Exception ex)
{
throw new RpcException(
new Status(StatusCode.FailedPrecondition, $"Can't access cart storage at {databaseString}. {ex}"));
}
}