From 8cddb6013e554db1ee734c363ae17a5421df0e4e Mon Sep 17 00:00:00 2001 From: Michael McKnight Date: Thu, 7 Dec 2017 21:51:08 +1300 Subject: [PATCH 1/4] Add telemetry around payment to help debug any issues --- .../Services/ITelemetryService.cs | 7 +++++ .../Services/TelemetryService.cs | 18 ++++++++++++ src/SandwichClub.Api/Services/WeekService.cs | 28 +++++++++++++++---- 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/SandwichClub.Api/Services/ITelemetryService.cs create mode 100644 src/SandwichClub.Api/Services/TelemetryService.cs diff --git a/src/SandwichClub.Api/Services/ITelemetryService.cs b/src/SandwichClub.Api/Services/ITelemetryService.cs new file mode 100644 index 0000000..0650c6a --- /dev/null +++ b/src/SandwichClub.Api/Services/ITelemetryService.cs @@ -0,0 +1,7 @@ +namespace SandwichClub.Api.Services +{ + public interface ITelemetryService + { + void TrackEvent(string eventName, object customProperties) + } +} \ No newline at end of file diff --git a/src/SandwichClub.Api/Services/TelemetryService.cs b/src/SandwichClub.Api/Services/TelemetryService.cs new file mode 100644 index 0000000..a2750ee --- /dev/null +++ b/src/SandwichClub.Api/Services/TelemetryService.cs @@ -0,0 +1,18 @@ +using System.Linq; +using Microsoft.ApplicationInsights; + +namespace SandwichClub.Api.Services +{ + public class TelemetryService : ITelemetryService + { + private readonly TelemetryClient _client = new TelemetryClient(); + + public void TrackEvent(string eventName, object customProperties) + { + var propertyDictionary = customProperties.GetType().GetFields() + .ToDictionary(f => f.Name, f => f.GetValue(customProperties)?.ToString()); + + _client.TrackEvent(eventName, propertyDictionary); + } + } +} diff --git a/src/SandwichClub.Api/Services/WeekService.cs b/src/SandwichClub.Api/Services/WeekService.cs index 1f1f856..9940e60 100644 --- a/src/SandwichClub.Api/Services/WeekService.cs +++ b/src/SandwichClub.Api/Services/WeekService.cs @@ -10,10 +10,14 @@ namespace SandwichClub.Api.Services public class WeekService : SaveOnlyBaseService, IWeekService { private readonly IWeekUserLinkService _weekUserLinkService; + private readonly IUserService _userService; + private readonly ITelemetryService _telemetryService; - public WeekService(IWeekRepository weekRepository, ILogger logger, IWeekUserLinkService weekUserLinkService) : base(weekRepository, logger) + public WeekService(IWeekRepository weekRepository, ILogger logger, IWeekUserLinkService weekUserLinkService, ITelemetryService telemetryService, IUserService userService) : base(weekRepository, logger) { _weekUserLinkService = weekUserLinkService; + _telemetryService = telemetryService; + _userService = userService; } /// @@ -68,6 +72,7 @@ public async Task> MarkAllLinksAsPaidForUserAsync(int var currentWeekId = GetWeekId(DateTime.Now); + var remainingOwed = amountOwed; foreach (var week in unpaidWeeks) { if (week.WeekId >= currentWeekId) @@ -76,23 +81,34 @@ public async Task> MarkAllLinksAsPaidForUserAsync(int // Get the $$$ var amountToPay = await GetAmountToPayPerPersonAsync(week.WeekId); // Make sure we don't overpay - if (amountOwed - amountToPay <= 0) + if (remainingOwed - amountToPay <= 0) { - amountToPay = amountOwed; - amountOwed = 0; + amountToPay = remainingOwed; + remainingOwed = 0; } else { - amountOwed -= amountToPay; + remainingOwed -= amountToPay; } week.Paid = (double) amountToPay; // Do it await _weekUserLinkService.SaveAsync(week); - if (amountOwed <= 0) + if (remainingOwed <= 0) break; } + var user = await _userService.GetByIdAsync(userId); + _telemetryService.TrackEvent("Payment", + new + { + username = $"{user.FirstName} {user.LastName}", + totalAmountToBePaid, + totalAmountPaid, + amountOwed, + remainingOwed + }); + return unpaidWeeks; } From 60b45a41fdf96f09e2c342322c912f983fc44c25 Mon Sep 17 00:00:00 2001 From: Michael McKnight Date: Thu, 7 Dec 2017 21:58:09 +1300 Subject: [PATCH 2/4] Track week subscription events. --- src/SandwichClub.Api/GraphQL/SandwichClubMutation.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SandwichClub.Api/GraphQL/SandwichClubMutation.cs b/src/SandwichClub.Api/GraphQL/SandwichClubMutation.cs index a8b10cd..4d73dbe 100644 --- a/src/SandwichClub.Api/GraphQL/SandwichClubMutation.cs +++ b/src/SandwichClub.Api/GraphQL/SandwichClubMutation.cs @@ -7,7 +7,7 @@ namespace SandwichClub.Api.GraphQL { public class SandwichClubMutation : ObjectGraphType { - public SandwichClubMutation(IScSession session, IUserService userService, IWeekUserLinkService weekUserLinkService, IWeekService weekService) + public SandwichClubMutation(IScSession session, IUserService userService, IWeekService weekService, ITelemetryService telemetryService) { Name = "Mutation"; @@ -24,6 +24,9 @@ public SandwichClubMutation(IScSession session, IUserService userService, IWeekU var weekId = context.GetArgument("weekId"); var slices = context.GetArgument("slices"); + telemetryService.TrackEvent(slices > 0 ? "weekSubscription" : "weekUnsubscription", + new {userId, weekId}); + return await weekService.SubscibeToWeek(weekId, userId, slices); } ); From ec0ff63aa3672efa71d0c3942d183bed685acf68 Mon Sep 17 00:00:00 2001 From: Michael McKnight Date: Fri, 8 Dec 2017 00:07:01 +1300 Subject: [PATCH 3/4] Whoops --- src/SandwichClub.Api/Services/ITelemetryService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SandwichClub.Api/Services/ITelemetryService.cs b/src/SandwichClub.Api/Services/ITelemetryService.cs index 0650c6a..c05c228 100644 --- a/src/SandwichClub.Api/Services/ITelemetryService.cs +++ b/src/SandwichClub.Api/Services/ITelemetryService.cs @@ -2,6 +2,6 @@ { public interface ITelemetryService { - void TrackEvent(string eventName, object customProperties) + void TrackEvent(string eventName, object customProperties); } } \ No newline at end of file From f97e1c0f5564ec2379486f09353f9e8c1cc17b07 Mon Sep 17 00:00:00 2001 From: Michael McKnight Date: Fri, 8 Dec 2017 00:17:30 +1300 Subject: [PATCH 4/4] Setup mocked methods used by telemetry --- test/SandwichClub.Api.Tests/Services/WeekServiceTests.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/SandwichClub.Api.Tests/Services/WeekServiceTests.cs b/test/SandwichClub.Api.Tests/Services/WeekServiceTests.cs index 379a08c..74888f8 100644 --- a/test/SandwichClub.Api.Tests/Services/WeekServiceTests.cs +++ b/test/SandwichClub.Api.Tests/Services/WeekServiceTests.cs @@ -33,6 +33,10 @@ public PaymentWeekServiceTests() .Returns((int id, bool ignore) => Task.FromResult(_weekLinks.Where(_ => _.UserId == id))); Mock().Setup(i => i.CountForWeekAsync(It.IsAny())) .Returns((int id) => Task.FromResult(_weekLinks.Count(_ => _.WeekId == id))); + + Mock().Setup(i => i.GetByIdAsync(It.IsAny())) + .Returns((int id) => Task.FromResult(new User {UserId = id})); + Mock().Setup(i => i.TrackEvent(It.IsAny(), It.IsAny())); } internal void AddWeekLinks(int number)