@@ -154,6 +154,34 @@ public async Task<ActionResult<CountResult>> GetCountByProjectAsync(string proje
154154 return await GetCountImplAsync ( sf , ti , filter , aggregations ) ;
155155 }
156156
157+ private async Task < ActionResult < CountResult > > GetCountImplAsync ( AppFilter sf , TimeInfo ti , string filter = null , string aggregations = null ) {
158+ var pr = await _validator . ValidateQueryAsync ( filter ) ;
159+ if ( ! pr . IsValid )
160+ return BadRequest ( pr . Message ) ;
161+
162+ var far = await _validator . ValidateAggregationsAsync ( aggregations ) ;
163+ if ( ! far . IsValid )
164+ return BadRequest ( far . Message ) ;
165+
166+ sf . UsesPremiumFeatures = pr . UsesPremiumFeatures || far . UsesPremiumFeatures ;
167+ var query = new RepositoryQuery < PersistentEvent > ( )
168+ . AppFilter ( ShouldApplySystemFilter ( sf , filter ) ? sf : null )
169+ . DateRange ( ti . Range . UtcStart , ti . Range . UtcEnd , ti . Field )
170+ . Index ( ti . Range . UtcStart , ti . Range . UtcEnd ) ;
171+
172+ CountResult result ;
173+ try {
174+ result = await _repository . CountAsync ( q => q . SystemFilter ( query ) . FilterExpression ( filter ) . EnforceEventStackFilter ( ) . AggregationsExpression ( aggregations ) ) ;
175+ } catch ( Exception ex ) {
176+ using ( _logger . BeginScope ( new ExceptionlessState ( ) . Property ( "Search Filter" , new { SystemFilter = sf , UserFilter = filter , Time = ti , Aggregations = aggregations } ) . Tag ( "Search" ) . Identity ( CurrentUser . EmailAddress ) . Property ( "User" , CurrentUser ) . SetHttpContext ( HttpContext ) ) )
177+ _logger . LogError ( ex , "An error has occurred. Please check your filter or aggregations." ) ;
178+
179+ return BadRequest ( "An error has occurred. Please check your search filter." ) ;
180+ }
181+
182+ return Ok ( result ) ;
183+ }
184+
157185 /// <summary>
158186 /// Get by id
159187 /// </summary>
@@ -251,6 +279,7 @@ private async Task<ActionResult<IReadOnlyCollection<PersistentEvent>>> GetIntern
251279
252280 var systemFilter = new RepositoryQuery < PersistentEvent > ( )
253281 . AppFilter ( ShouldApplySystemFilter ( sf , filter ) ? sf : null )
282+ . EnforceEventStackFilter ( )
254283 . DateRange ( ti . Range . UtcStart , ti . Range . UtcEnd , ( PersistentEvent e ) => e . Date )
255284 . Index ( ti . Range . UtcStart , ti . Range . UtcEnd ) ;
256285
@@ -265,6 +294,7 @@ private async Task<ActionResult<IReadOnlyCollection<PersistentEvent>>> GetIntern
265294 var countResponse = await _repository . CountAsync ( q => q
266295 . SystemFilter ( systemFilter )
267296 . FilterExpression ( filter )
297+ . EnforceEventStackFilter ( )
268298 . AggregationsExpression ( $ "terms:(stack_id~{ GetSkip ( page + 1 , limit ) + 1 } { stackAggregations } )") ) ;
269299
270300 var stackTerms = countResponse . Aggregations . Terms < string > ( "terms_stack_id" ) ;
@@ -296,7 +326,7 @@ private Task<FindResults<PersistentEvent>> GetEventsInternalAsync(AppFilter sf,
296326 if ( String . IsNullOrEmpty ( sort ) )
297327 sort = "-date" ;
298328
299- return _repository . FindAsync ( q => q . AppFilter ( ShouldApplySystemFilter ( sf , filter ) ? sf : null ) . FilterExpression ( filter ) . SortExpression ( sort ) . DateRange ( ti . Range . UtcStart , ti . Range . UtcEnd , ti . Field ) ,
329+ return _repository . FindAsync ( q => q . AppFilter ( ShouldApplySystemFilter ( sf , filter ) ? sf : null ) . FilterExpression ( filter ) . EnforceEventStackFilter ( ) . SortExpression ( sort ) . DateRange ( ti . Range . UtcStart , ti . Range . UtcEnd , ti . Field ) ,
300330 o => useSearchAfter
301331 ? o . SearchAfterPaging ( ) . SearchAfter ( after ) . PageLimit ( limit )
302332 : o . PageNumber ( page ) . PageLimit ( limit ) ) ;
@@ -1211,7 +1241,7 @@ private async Task<Dictionary<string, double>> GetUserCountByProjectIdsAsync(ICo
12111241
12121242 var systemFilter = new RepositoryQuery < PersistentEvent > ( ) . AppFilter ( sf ) . DateRange ( utcStart , utcEnd , ( PersistentEvent e ) => e . Date ) . Index ( utcStart , utcEnd ) ;
12131243 var projects = cachedTotals . Where ( kvp => ! kvp . Value . HasValue ) . Select ( kvp => new Project { Id = kvp . Key , OrganizationId = stacks . FirstOrDefault ( s => s . ProjectId == kvp . Key ) ? . OrganizationId } ) . ToList ( ) ;
1214- var countResult = await _repository . CountAsync ( q => q . SystemFilter ( systemFilter ) . FilterExpression ( projects . BuildFilter ( ) ) . AggregationsExpression ( "terms:(project_id cardinality:user)" ) ) ;
1244+ var countResult = await _repository . CountAsync ( q => q . SystemFilter ( systemFilter ) . FilterExpression ( projects . BuildFilter ( ) ) . EnforceEventStackFilter ( ) . AggregationsExpression ( "terms:(project_id cardinality:user)" ) ) ;
12151245
12161246 // Cache all projects that have more than 10 users for 5 minutes.
12171247 var projectTerms = countResult . Aggregations . Terms < string > ( "terms_project_id" ) . Buckets ;
0 commit comments