/
CartService.cs
81 lines (70 loc) · 2.53 KB
/
CartService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
using System.Diagnostics;
using System.Threading.Tasks;
using Grpc.Core;
using OpenTelemetry.Trace;
using cartservice.cartstore;
using OpenFeature;
using Oteldemo;
namespace cartservice.services;
public class CartService : Oteldemo.CartService.CartServiceBase
{
private static readonly Empty Empty = new();
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<Empty> 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);
await _cartStore.AddItemAsync(request.UserId, request.Item.ProductId, request.Item.Quantity);
return Empty;
}
public override async Task<Cart> GetCart(GetCartRequest request, ServerCallContext context)
{
var activity = Activity.Current;
activity?.SetTag("app.user.id", request.UserId);
activity?.AddEvent(new("Fetch cart"));
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;
}
public override async Task<Empty> 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.GetBooleanValue("cartServiceFailure", false))
{
await _badCartStore.EmptyCartAsync(request.UserId);
}
else
{
await _cartStore.EmptyCartAsync(request.UserId);
}
}
catch (RpcException ex)
{
Activity.Current?.RecordException(ex);
Activity.Current?.SetStatus(ActivityStatusCode.Error, ex.Message);
throw;
}
return Empty;
}
}