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); } ); diff --git a/src/SandwichClub.Api/Services/ITelemetryService.cs b/src/SandwichClub.Api/Services/ITelemetryService.cs new file mode 100644 index 0000000..c05c228 --- /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; } 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)