public async Task AddItemAsync()

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}"));
            }
        }