11import ms , { StringValue } from 'ms' ;
22import { uniq } from 'lodash' ;
33import { ToadScheduler , SimpleIntervalJob , AsyncTask } from 'toad-scheduler' ;
4- import { inject , injectable } from 'inversify' ;
4+ import { inject , injectable , multiInject } from 'inversify' ;
55import { TYPES } from '@vulcan-sql/core/types' ;
6- import { APISchema } from '@vulcan-sql/core/models' ;
6+ import {
7+ APISchema ,
8+ ActivityLogContentOptions ,
9+ ActivityLogType ,
10+ CacheLayerInfo ,
11+ IActivityLogger ,
12+ } from '@vulcan-sql/core/models' ;
713import { ConfigurationError } from '../utils/errors' ;
814import { ICacheLayerLoader } from './cacheLayerLoader' ;
15+ import { getLogger } from '../utils' ;
16+ import moment = require( 'moment' ) ;
917
18+ enum RefreshResult {
19+ SUCCESS = 'SUCCESS' ,
20+ FAILED = 'FAILED' ,
21+ }
1022export interface ICacheLayerRefresher {
1123 /**
1224 * Start the job to load the data source to cache storage and created tables from cache settings in schemas
@@ -22,9 +34,16 @@ export interface ICacheLayerRefresher {
2234export class CacheLayerRefresher implements ICacheLayerRefresher {
2335 private cacheLoader : ICacheLayerLoader ;
2436 private scheduler = new ToadScheduler ( ) ;
37+ private activityLoggers : IActivityLogger [ ] ;
38+ private logger = getLogger ( { scopeName : 'CORE' } ) ;
2539
26- constructor ( @inject ( TYPES . CacheLayerLoader ) loader : ICacheLayerLoader ) {
40+ constructor (
41+ @inject ( TYPES . CacheLayerLoader ) loader : ICacheLayerLoader ,
42+ @multiInject ( TYPES . Extension_ActivityLogger )
43+ activityLoggers : IActivityLogger [ ]
44+ ) {
2745 this . cacheLoader = loader ;
46+ this . activityLoggers = activityLoggers ;
2847 }
2948
3049 public async start (
@@ -53,16 +72,14 @@ export class CacheLayerRefresher implements ICacheLayerRefresher {
5372 const refreshJob = new SimpleIntervalJob (
5473 { milliseconds, runImmediately } ,
5574 new AsyncTask ( workerId , async ( ) => {
56- // load data the to cache storage
57-
58- await this . cacheLoader . load ( templateName , cache ) ;
75+ await this . loadCacheAndSendActivityLog ( schema , cache ) ;
5976 } ) ,
6077 { preventOverrun : true , id : workerId }
6178 ) ;
6279 // add the job to schedule cache refresh task
6380 this . scheduler . addIntervalJob ( refreshJob ) ;
6481 } else {
65- await this . cacheLoader . load ( templateName , cache ) ;
82+ await this . loadCacheAndSendActivityLog ( schema , cache ) ;
6683 }
6784 } )
6885 ) ;
@@ -77,6 +94,44 @@ export class CacheLayerRefresher implements ICacheLayerRefresher {
7794 this . scheduler . stop ( ) ;
7895 }
7996
97+ private async loadCacheAndSendActivityLog (
98+ schema : APISchema ,
99+ cache : CacheLayerInfo
100+ ) {
101+ const { urlPath } = schema ;
102+ const { sql } = cache ;
103+ let refreshResult = RefreshResult . SUCCESS ;
104+ const now = moment . utc ( ) . format ( 'YYYY-MM-DD HH:mm:ss' ) ;
105+ const templateName = schema . templateSource . replace ( '/' , '_' ) ;
106+ try {
107+ // get the current time in format of UTC
108+ await this . cacheLoader . load ( templateName , cache ) ;
109+ } catch ( error : any ) {
110+ refreshResult = RefreshResult . FAILED ;
111+ this . logger . debug ( `Failed to refresh cache: ${ error } ` ) ;
112+ } finally {
113+ // send activity log
114+ const content = {
115+ isSuccess : refreshResult === RefreshResult . SUCCESS ? true : false ,
116+ activityLogType : ActivityLogType . CACHE_REFRESH ,
117+ logTime : now ,
118+ urlPath,
119+ sql,
120+ } as ActivityLogContentOptions ;
121+ const activityLoggers = this . getActivityLoggers ( ) ;
122+ for ( const activityLogger of activityLoggers )
123+ activityLogger . log ( content ) . catch ( ( err : any ) => {
124+ this . logger . debug (
125+ `Failed to log activity after refreshing cache: ${ err } `
126+ ) ;
127+ } ) ;
128+ }
129+ }
130+
131+ private getActivityLoggers ( ) : IActivityLogger [ ] {
132+ return this . activityLoggers . filter ( ( logger ) => logger . isEnabled ( ) ) ;
133+ }
134+
80135 private checkDuplicateCacheTableName ( schemas : APISchema [ ] ) {
81136 const tableNames = schemas
82137 // => [[table1, table2], [table1, table3], [table4]]
0 commit comments