Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/SandwichClub.Api/GraphQL/SandwichClubMutation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -24,6 +24,9 @@ public SandwichClubMutation(IScSession session, IUserService userService, IWeekU
var weekId = context.GetArgument<int>("weekId");
var slices = context.GetArgument<int>("slices");

telemetryService.TrackEvent(slices > 0 ? "weekSubscription" : "weekUnsubscription",
new {userId, weekId});

return await weekService.SubscibeToWeek(weekId, userId, slices);
}
);
Expand Down
7 changes: 7 additions & 0 deletions src/SandwichClub.Api/Services/ITelemetryService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace SandwichClub.Api.Services
{
public interface ITelemetryService
{
void TrackEvent(string eventName, object customProperties);
}
}
18 changes: 18 additions & 0 deletions src/SandwichClub.Api/Services/TelemetryService.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
28 changes: 22 additions & 6 deletions src/SandwichClub.Api/Services/WeekService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@ namespace SandwichClub.Api.Services
public class WeekService : SaveOnlyBaseService<int, Week, IWeekRepository>, IWeekService
{
private readonly IWeekUserLinkService _weekUserLinkService;
private readonly IUserService _userService;
private readonly ITelemetryService _telemetryService;

public WeekService(IWeekRepository weekRepository, ILogger<WeekService> logger, IWeekUserLinkService weekUserLinkService) : base(weekRepository, logger)
public WeekService(IWeekRepository weekRepository, ILogger<WeekService> logger, IWeekUserLinkService weekUserLinkService, ITelemetryService telemetryService, IUserService userService) : base(weekRepository, logger)
{
_weekUserLinkService = weekUserLinkService;
_telemetryService = telemetryService;
_userService = userService;
}

/// <summary>
Expand Down Expand Up @@ -68,6 +72,7 @@ public async Task<IEnumerable<WeekUserLink>> MarkAllLinksAsPaidForUserAsync(int

var currentWeekId = GetWeekId(DateTime.Now);

var remainingOwed = amountOwed;
foreach (var week in unpaidWeeks)
{
if (week.WeekId >= currentWeekId)
Expand All @@ -76,23 +81,34 @@ public async Task<IEnumerable<WeekUserLink>> 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;
}

Expand Down
4 changes: 4 additions & 0 deletions test/SandwichClub.Api.Tests/Services/WeekServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ public PaymentWeekServiceTests()
.Returns((int id, bool ignore) => Task.FromResult(_weekLinks.Where(_ => _.UserId == id)));
Mock<IWeekUserLinkService>().Setup(i => i.CountForWeekAsync(It.IsAny<int>()))
.Returns((int id) => Task.FromResult(_weekLinks.Count(_ => _.WeekId == id)));

Mock<IUserService>().Setup(i => i.GetByIdAsync(It.IsAny<int>()))
.Returns((int id) => Task.FromResult(new User {UserId = id}));
Mock<ITelemetryService>().Setup(i => i.TrackEvent(It.IsAny<string>(), It.IsAny<object>()));
}

internal void AddWeekLinks(int number)
Expand Down