// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 using System.Diagnostics; using System.Threading.Tasks; using System; using Grpc.Core; using cart.cartstore; using OpenFeature; using Oteldemo; namespace cart.services; public class CartService : Oteldemo.CartService.CartServiceBase { private static readonly Empty Empty = new(); private readonly Random random = new Random(); private readonly ICartStore _badCartStore; private readonly ICartStore _cartStore; private readonly IFeatureClient _featureFlagHelper; public CartService(ICartStore cartStore, ICartStore badCartStore, IFeatureClient featureFlagService) { _badCartStore = badCartStore; _cartStore = cartStore; _featureFlagHelper = featureFlagService; } public override async Task AddItem(AddItemRequest request, ServerCallContext context) { var activity = Activity.Current; activity?.SetTag("app.user.id", request.UserId); activity?.SetTag("app.product.id", request.Item.ProductId); activity?.SetTag("app.product.quantity", request.Item.Quantity); try { await _cartStore.AddItemAsync(request.UserId, request.Item.ProductId, request.Item.Quantity); return Empty; } catch (RpcException ex) { activity?.AddException(ex); activity?.SetStatus(ActivityStatusCode.Error, ex.Message); throw; } } public override async Task GetCart(GetCartRequest request, ServerCallContext context) { var activity = Activity.Current; activity?.SetTag("app.user.id", request.UserId); activity?.AddEvent(new("Fetch cart")); try { var cart = await _cartStore.GetCartAsync(request.UserId); var totalCart = 0; foreach (var item in cart.Items) { totalCart += item.Quantity; } activity?.SetTag("app.cart.items.count", totalCart); return cart; } catch (RpcException ex) { activity?.AddException(ex); activity?.SetStatus(ActivityStatusCode.Error, ex.Message); throw; } } public override async Task EmptyCart(EmptyCartRequest request, ServerCallContext context) { var activity = Activity.Current; activity?.SetTag("app.user.id", request.UserId); activity?.AddEvent(new("Empty cart")); try { if (await _featureFlagHelper.GetBooleanValueAsync("cartFailure", false)) { await _badCartStore.EmptyCartAsync(request.UserId); } else { await _cartStore.EmptyCartAsync(request.UserId); } } catch (RpcException ex) { Activity.Current?.AddException(ex); Activity.Current?.SetStatus(ActivityStatusCode.Error, ex.Message); throw; } return Empty; } }