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
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ public async Task HandleAsync(Event parsedEvent)
user.PremiumExpirationDate = subscription.GetCurrentPeriodEnd();
user.MaxStorageGb = (short)premiumPlan.Storage.Provided;
user.LicenseKey = string.IsNullOrWhiteSpace(user.LicenseKey) ? CoreHelpers.SecureRandomString(20) : user.LicenseKey;
user.RevisionDate = DateTime.UtcNow;
// Bump AccountRevisionDate so clients' revision-gated syncs pick up the
// premium change even when the one-time push notification is missed.
user.RevisionDate = user.AccountRevisionDate = DateTime.UtcNow;

await userRepository.ReplaceAsync(user);
await pushNotificationAdapter.NotifyPremiumStatusChangedAsync(user);
Expand Down
8 changes: 6 additions & 2 deletions src/Core/Services/Implementations/UserService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -822,7 +822,9 @@ private async Task EnablePremiumAsync(User user, DateTime? expirationDate)
{
user.Premium = true;
user.PremiumExpirationDate = expirationDate;
user.RevisionDate = DateTime.UtcNow;
// Bump AccountRevisionDate so clients' revision-gated syncs pick up the
// premium change even when the one-time push notification is missed.
user.RevisionDate = user.AccountRevisionDate = DateTime.UtcNow;
await _userRepository.ReplaceAsync(user);
}
}
Expand All @@ -839,7 +841,9 @@ private async Task DisablePremiumAsync(User user, DateTime? expirationDate)
{
user.Premium = false;
user.PremiumExpirationDate = expirationDate;
user.RevisionDate = DateTime.UtcNow;
// Bump AccountRevisionDate so clients' revision-gated syncs pick up the
// premium change even when the one-time push notification is missed.
user.RevisionDate = user.AccountRevisionDate = DateTime.UtcNow;
await _userRepository.ReplaceAsync(user);
}
}
Expand Down
35 changes: 35 additions & 0 deletions test/Core.Test/Services/UserServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,41 @@ public async Task SaveUserAsync_SetsNameToNull_WhenNameIsEmpty(SutProvider<UserS
Assert.Null(user.Name);
}

[Theory, BitAutoData]
public async Task EnablePremiumAsync_UserNotPremium_EnablesPremiumAndBumpsAccountRevisionDate(
SutProvider<UserService> sutProvider, User user)
{
user.Premium = false;
user.Gateway = GatewayType.Stripe;
var staleAccountRevisionDate = user.AccountRevisionDate = DateTime.UtcNow.AddDays(-1);
var expirationDate = DateTime.UtcNow.AddDays(30);
sutProvider.GetDependency<IUserRepository>().GetByIdAsync(user.Id).Returns(user);

await sutProvider.Sut.EnablePremiumAsync(user.Id, expirationDate);

await sutProvider.GetDependency<IUserRepository>().Received(1).ReplaceAsync(Arg.Is<User>(u =>
u.Premium &&
u.PremiumExpirationDate == expirationDate &&
u.AccountRevisionDate > staleAccountRevisionDate));
}

[Theory, BitAutoData]
public async Task DisablePremiumAsync_UserPremium_DisablesPremiumAndBumpsAccountRevisionDate(
SutProvider<UserService> sutProvider, User user)
{
user.Premium = true;
var staleAccountRevisionDate = user.AccountRevisionDate = DateTime.UtcNow.AddDays(-1);
var expirationDate = DateTime.UtcNow.AddDays(7);
sutProvider.GetDependency<IUserRepository>().GetByIdAsync(user.Id).Returns(user);

await sutProvider.Sut.DisablePremiumAsync(user.Id, expirationDate);

await sutProvider.GetDependency<IUserRepository>().Received(1).ReplaceAsync(Arg.Is<User>(u =>
!u.Premium &&
u.PremiumExpirationDate == expirationDate &&
u.AccountRevisionDate > staleAccountRevisionDate));
}

[Theory, BitAutoData]
public async Task UpdateLicenseAsync_Success(SutProvider<UserService> sutProvider,
User user, UserLicense userLicense)
Expand Down
Loading