diff --git a/api-server/server/models/donation.js b/api-server/server/models/donation.js index e605e43da6..9eee629f8c 100644 --- a/api-server/server/models/donation.js +++ b/api-server/server/models/donation.js @@ -1,18 +1,50 @@ import { Observable } from 'rx'; +import debug from 'debug'; + +import InMemoryCache from '../utils/in-memory-cache'; + +const log = debug('fcc:boot:donate'); +const fiveMinutes = 1000 * 60 * 5; export default function(Donation) { + let activeDonationUpdateInterval = null; + const activeDonationCountCacheTTL = fiveMinutes; + const activeDonationCountCache = InMemoryCache(0); + const activeDonationsQuery$ = () => + Donation.find$({ + // eslint-disable-next-line no-undefined + where: { endDate: undefined } + }).map(instances => instances.length); + function cleanUp() { + if (activeDonationUpdateInterval) { + clearInterval(activeDonationUpdateInterval); + } + return; + } + + process.on('exit', cleanUp); Donation.on('dataSourceAttached', () => { Donation.find$ = Observable.fromNodeCallback(Donation.find.bind(Donation)); Donation.findOne$ = Observable.fromNodeCallback( Donation.findOne.bind(Donation) ); + activeDonationsQuery$().subscribe(count => { + log('activeDonator count: %d', count); + return activeDonationCountCache.update(() => count); + }); + + activeDonationUpdateInterval = setInterval( + () => + activeDonationsQuery$().subscribe(count => { + log('activeDonator count: %d', count); + return activeDonationCountCache.update(() => count); + }), + activeDonationCountCacheTTL + ); }); function getCurrentActiveDonationCount$() { - // eslint-disable-next-line no-undefined - return Donation.find$({ where: { endDate: undefined } }).map( - instances => instances.length - ); + return Observable.of(activeDonationCountCache.get()); } Donation.getCurrentActiveDonationCount$ = getCurrentActiveDonationCount$;