78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { Observable } from 'rx';
 | 
						|
import debug from 'debug';
 | 
						|
 | 
						|
import { reportError } from '../middlewares/sentry-error-handler.js';
 | 
						|
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, reportError);
 | 
						|
  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)
 | 
						|
    );
 | 
						|
 | 
						|
    seedTheCache()
 | 
						|
      .then(setupCacheUpdateInterval)
 | 
						|
      .catch(err => {
 | 
						|
        const errMsg = `Error caught seeding the cache: ${err.message}`;
 | 
						|
        err.message = errMsg;
 | 
						|
        reportError(err);
 | 
						|
      });
 | 
						|
  });
 | 
						|
 | 
						|
  function seedTheCache() {
 | 
						|
    return new Promise((resolve, reject) =>
 | 
						|
      Observable.defer(activeDonationsQuery$).subscribe(count => {
 | 
						|
        log('activeDonor count: %d', count);
 | 
						|
        activeDonationCountCache.update(() => count);
 | 
						|
        return resolve();
 | 
						|
      }, reject)
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  function setupCacheUpdateInterval() {
 | 
						|
    activeDonationUpdateInterval = setInterval(
 | 
						|
      () =>
 | 
						|
        Observable.defer(activeDonationsQuery$).subscribe(
 | 
						|
          count => {
 | 
						|
            log('activeDonor count: %d', count);
 | 
						|
            return activeDonationCountCache.update(() => count);
 | 
						|
          },
 | 
						|
          err => {
 | 
						|
            const errMsg = `Error caught updating the cache: ${err.message}`;
 | 
						|
            err.message = errMsg;
 | 
						|
            reportError(err);
 | 
						|
          }
 | 
						|
        ),
 | 
						|
      activeDonationCountCacheTTL
 | 
						|
    );
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  function getCurrentActiveDonationCount$() {
 | 
						|
    return Observable.of(activeDonationCountCache.get());
 | 
						|
  }
 | 
						|
 | 
						|
  Donation.getCurrentActiveDonationCount$ = getCurrentActiveDonationCount$;
 | 
						|
}
 |