Skip to content
Draft
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 @@ -229,6 +229,11 @@ protected ObjectResult PlanLimitReached(string message)
return Problem(statusCode: StatusCodes.Status426UpgradeRequired, title: message);
}

protected bool IsPremiumFeatureQueryBlocked(AppFilter filter)
{
return filter.UsesPremiumFeatures && filter.Organizations.Any(o => !o.HasPremiumFeatures);
}

protected ObjectResult TooManyRequests(string message)
{
return Problem(statusCode: StatusCodes.Status429TooManyRequests, title: message);
Expand Down
4 changes: 4 additions & 0 deletions src/Exceptionless.Web/Controllers/EventController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ private async Task<ActionResult<CountResult>> CountInternalAsync(AppFilter sf, T
return BadRequest(far.Message);

sf.UsesPremiumFeatures = pr.UsesPremiumFeatures || far.UsesPremiumFeatures;
if (IsPremiumFeatureQueryBlocked(sf))
return PlanLimitReached("Please upgrade your plan to use premium search features.");

if (mode == "stack_new")
filter = AddFirstOccurrenceFilter(ti.Range, filter);
Expand Down Expand Up @@ -297,6 +299,8 @@ private async Task<ActionResult<ICollection<PersistentEvent>>> GetInternalAsync(
return BadRequest(pr.Message);

sf.UsesPremiumFeatures = pr.UsesPremiumFeatures || usesPremiumFeatures;
if (IsPremiumFeatureQueryBlocked(sf))
return PlanLimitReached("Please upgrade your plan to use premium search features.");

try
{
Expand Down
2 changes: 2 additions & 0 deletions src/Exceptionless.Web/Controllers/StackController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@ private async Task<ActionResult<IReadOnlyCollection<Stack>>> GetInternalAsync(Ap
return BadRequest(pr.Message);

sf.UsesPremiumFeatures = pr.UsesPremiumFeatures;
if (IsPremiumFeatureQueryBlocked(sf))
return PlanLimitReached("Please upgrade your plan to use premium search features.");

try
{
Expand Down
30 changes: 30 additions & 0 deletions tests/Exceptionless.Tests/Controllers/EventControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,36 @@ public async Task CanGetFreeProjectLevelMostFrequentStackMode()
Assert.Equal(2, results.Count);
}

[Fact]
public async Task GetCountByProjectAsync_WithPremiumFilterOnFreeOrganization_ReturnsUpgradeRequired()
{
// Arrange
await CreateDataAsync(d => d.Event().FreeProject().Tag("premium-tag"));

// Act & Assert
await SendRequestAsync(r => r
.AsFreeOrganizationUser()
.AppendPaths("projects", SampleDataService.FREE_PROJECT_ID, "events", "count")
.QueryString("filter", "tags:premium-tag")
.StatusCodeShouldBeUpgradeRequired()
);
}

[Fact]
public async Task GetByProjectAsync_WithPremiumFilterOnFreeOrganization_ReturnsUpgradeRequired()
{
// Arrange
await CreateDataAsync(d => d.Event().FreeProject().Tag("premium-tag"));

// Act & Assert
await SendRequestAsync(r => r
.AsFreeOrganizationUser()
.AppendPaths("projects", SampleDataService.FREE_PROJECT_ID, "events")
.QueryString("filter", "tags:premium-tag")
.StatusCodeShouldBeUpgradeRequired()
);
}

[Fact]
public async Task CanGetNewStackMode()
{
Expand Down
15 changes: 15 additions & 0 deletions tests/Exceptionless.Tests/Controllers/StackControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,21 @@ public async Task CanSearchByNonPremiumFields()
Assert.Single(result);
}

[Fact]
public async Task GetByProjectAsync_WithPremiumFilterOnFreeOrganization_ReturnsUpgradeRequired()
{
// Arrange
await CreateDataAsync(d => d.Event().FreeProject().Message("Premium restricted stack"));

// Act & Assert
await SendRequestAsync(r => r
.AsFreeOrganizationUser()
.AppendPaths("projects", SampleDataService.FREE_PROJECT_ID, "stacks")
.QueryString("filter", "title:\"Premium restricted stack\"")
.StatusCodeShouldBeUpgradeRequired()
);
}

[Theory]
[InlineData(null)]
[InlineData("1.0.0")]
Expand Down