import { Observable } from 'rx';

export default function(Donation) {
  Donation.on('dataSourceAttached', () => {
    Donation.find$ = Observable.fromNodeCallback(Donation.find.bind(Donation));
    Donation.findOne$ = Observable.fromNodeCallback(
      Donation.findOne.bind(Donation)
    );
  });

  function getCurrentActiveDonationCount$() {
    // eslint-disable-next-line no-undefined
    return Donation.find$({ where: { endDate: undefined } }).map(
      instances => instances.length
    );
  }

  Donation.getCurrentActiveDonationCount$ = getCurrentActiveDonationCount$;
}

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$() {
    return Observable.of(activeDonationCountCache.get());
  }

  Donation.getCurrentActiveDonationCount$ = getCurrentActiveDonationCount$;
}

Use InMemoryCache to reducve load on db
feat: Use InMemoryCache to reducve load on db
