88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { Observable } from 'rx';
 | |
| import dedent from 'dedent';
 | |
| import moment from 'moment';
 | |
| 
 | |
| import { timeCache, observeMethod } from '../utils/rx';
 | |
| 
 | |
| function numberWithCommas(x) {
 | |
|   return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
 | |
| }
 | |
| 
 | |
| // userCount(where: Object) => Observable[Number]
 | |
| // getCertCount(userCount: userCount, cert: String) => Observable[Number]
 | |
| function getCertCount(userCount, cert) {
 | |
|   return userCount({ [cert]: true })
 | |
|     // using This-Bind operator
 | |
|     ::timeCache(2, 'hours');
 | |
| }
 | |
| 
 | |
| function getAllThreeCertsCount(userCount) {
 | |
|   return userCount({
 | |
|     isFrontEndCert: true,
 | |
|     isDataVisCert: true,
 | |
|     isBackEndCert: true
 | |
|   })
 | |
|     ::timeCache(2, 'hours');
 | |
| }
 | |
| 
 | |
| export default function about(app) {
 | |
|   const router = app.loopback.Router();
 | |
|   const User = app.models.User;
 | |
|   const userCount = observeMethod(User, 'count');
 | |
|   const frontEndCount$ = getCertCount(userCount, 'isFrontEndCert');
 | |
|   const dataVisCount$ = getCertCount(userCount, 'isDataVisCert');
 | |
|   const backEndCount$ = getCertCount(userCount, 'isBackEndCert');
 | |
|   const allThreeCount$ = getAllThreeCertsCount(userCount);
 | |
| 
 | |
|   function showAbout(req, res, next) {
 | |
|     const daysRunning = moment().diff(new Date('10/15/2014'), 'days');
 | |
| 
 | |
|     Observable.combineLatest(
 | |
|       frontEndCount$,
 | |
|       dataVisCount$,
 | |
|       backEndCount$,
 | |
|       allThreeCount$,
 | |
|       (
 | |
|         frontEndCount = 0,
 | |
|         dataVisCount = 0,
 | |
|         backEndCount = 0,
 | |
|         allThreeCount = 0
 | |
|       ) => ({
 | |
|         frontEndCount,
 | |
|         dataVisCount,
 | |
|         backEndCount,
 | |
|         allThreeCount
 | |
|       })
 | |
|     )
 | |
|       .doOnNext(({
 | |
|         frontEndCount,
 | |
|         dataVisCount,
 | |
|         backEndCount,
 | |
|         allThreeCount
 | |
|       }) => {
 | |
|         res.render('resources/about', {
 | |
|           frontEndCount: numberWithCommas(frontEndCount),
 | |
|           dataVisCount: numberWithCommas(dataVisCount),
 | |
|           backEndCount: numberWithCommas(backEndCount),
 | |
|           allThreeCount: numberWithCommas(allThreeCount),
 | |
|           daysRunning,
 | |
|           title: dedent`
 | |
|             About our Open Source Community, our social media presence,
 | |
|             and how to contact us
 | |
|           `.split('\n').join(' '),
 | |
|           globalCompletedCount: numberWithCommas(
 | |
|             5612952 + (Math.floor((Date.now() - 1446268581061) / 1800))
 | |
|           ),
 | |
|           globalPledgedAmount: numberWithCommas(Math.floor(
 | |
|             28000 +
 | |
|             ((Date.now() - 1456207176902) / (2629746000 / 2000) * 8.30)
 | |
|           ))
 | |
|         });
 | |
|       })
 | |
|       .subscribe(() => {}, next);
 | |
|   }
 | |
| 
 | |
|   router.get('/about', showAbout);
 | |
|   app.use(router);
 | |
| }
 |