@@ -443,25 +443,50 @@ class EventsFactory extends Factory {
443443 const days = Math . ceil ( ( end - start ) / ( 24 * 60 * 60 * 1000 ) ) ;
444444
445445 try {
446- const redisData = await this . chartDataService . getProjectChartData (
447- projectId ,
448- startDate ,
449- endDate ,
450- groupBy ,
451- timezoneOffset
452- ) ;
453-
454- if ( redisData && redisData . length > 0 ) {
455- return redisData ;
456- }
457-
458- // Fallback to Mongo (empty groupHash for project-level data)
459- return this . findChartData ( days , timezoneOffset , '' ) ;
446+ const [ acceptedSeries , rateLimitedSeries ] = await Promise . all ( [
447+ this . chartDataService . getProjectChartData (
448+ projectId ,
449+ startDate ,
450+ endDate ,
451+ groupBy ,
452+ timezoneOffset ,
453+ 'events-accepted'
454+ ) ,
455+ this . chartDataService . getProjectChartData (
456+ projectId ,
457+ startDate ,
458+ endDate ,
459+ groupBy ,
460+ timezoneOffset ,
461+ 'events-rate-limited'
462+ ) ,
463+ ] ) ;
464+
465+ return [
466+ {
467+ label : 'accepted' ,
468+ data : acceptedSeries ,
469+ } ,
470+ {
471+ label : 'rate-limited' ,
472+ data : rateLimitedSeries ,
473+ } ,
474+ ] ;
460475 } catch ( err ) {
461476 console . error ( '[EventsFactory] getProjectChartData error:' , err ) ;
462477
463- // Fallback to Mongo on error (empty groupHash for project-level data)
464- return this . findChartData ( days , timezoneOffset , '' ) ;
478+ const fallbackAccepted = await this . findChartData ( days , timezoneOffset , '' ) ;
479+
480+ return [
481+ {
482+ label : 'accepted' ,
483+ data : fallbackAccepted ,
484+ } ,
485+ {
486+ label : 'rate-limited' ,
487+ data : this . _composeZeroSeries ( fallbackAccepted ) ,
488+ } ,
489+ ] ;
465490 }
466491 }
467492
@@ -474,7 +499,14 @@ class EventsFactory extends Factory {
474499 * @returns {Promise<Array> }
475500 */
476501 async getEventDailyChart ( groupHash , days , timezoneOffset = 0 ) {
477- return this . findChartData ( days , timezoneOffset , groupHash ) ;
502+ const data = await this . findChartData ( days , timezoneOffset , groupHash ) ;
503+
504+ return [
505+ {
506+ label : 'accepted' ,
507+ data,
508+ } ,
509+ ] ;
478510 }
479511
480512 /**
@@ -568,6 +600,23 @@ class EventsFactory extends Factory {
568600 return result ;
569601 }
570602
603+ /**
604+ * Compose zero-filled chart series using timestamps from the provided template
605+ *
606+ * @param {Array<{timestamp: number, count: number}> } template - reference series for timestamps
607+ * @returns {Array<{timestamp: number, count: number}> }
608+ */
609+ _composeZeroSeries ( template = [ ] ) {
610+ if ( ! Array . isArray ( template ) || template . length === 0 ) {
611+ return [ ] ;
612+ }
613+
614+ return template . map ( ( point ) => ( {
615+ timestamp : point . timestamp ,
616+ count : 0 ,
617+ } ) ) ;
618+ }
619+
571620 /**
572621 * Returns number of documents that occurred after the last visit time
573622 *
0 commit comments