From 2fb922be0f146f790929c4236465533c9dd36821 Mon Sep 17 00:00:00 2001 From: Quincy Larson Date: Mon, 22 Feb 2016 22:15:14 -0800 Subject: [PATCH 1/8] create pledge calculation logic --- server/boot/about.js | 10 +++++++++- server/views/resources/about.jade | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/server/boot/about.js b/server/boot/about.js index e310bc4566..63f36f8221 100644 --- a/server/boot/about.js +++ b/server/boot/about.js @@ -25,7 +25,15 @@ export default function about(app) { 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)) + 5612952 + (Math.floor((Date.now() - 1446268581061) / 1800) + ), + globalPledgedAmount: numberWithCommas( + 28000.00 + + (Math.floor( + (Date.now() - 1456207176902) / + (2629746 / 2000) + ) * 8.30) + ) ) }); }) diff --git a/server/views/resources/about.jade b/server/views/resources/about.jade index a3dd445de3..dfde0d488e 100644 --- a/server/views/resources/about.jade +++ b/server/views/resources/about.jade @@ -21,6 +21,10 @@ block content span.tag Donated: span.text-primary $850,000 | in pro-bono code + li.nowrap + span.tag Pledged: + span.text-primary #{globalPledgedAmount} + | to nonprofits .spacer .row .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3 From adfb21aaf9149aecc0aef2befdeb147da3c62e5e Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Mon, 22 Feb 2016 22:28:32 -0800 Subject: [PATCH 2/8] remove extra parenthesis --- server/boot/about.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/boot/about.js b/server/boot/about.js index 63f36f8221..92f16e70de 100644 --- a/server/boot/about.js +++ b/server/boot/about.js @@ -23,16 +23,16 @@ export default function about(app) { daysRunning, title: dedent` About our Open Source Community, our social media presence, - and how to contact us`.split('\n').join(' '), + and how to contact us + `.split('\n').join(' '), globalCompletedCount: numberWithCommas( - 5612952 + (Math.floor((Date.now() - 1446268581061) / 1800) + 5612952 + (Math.floor((Date.now() - 1446268581061) / 1800)) ), globalPledgedAmount: numberWithCommas( 28000.00 + - (Math.floor( - (Date.now() - 1456207176902) / - (2629746 / 2000) - ) * 8.30) + ( + Math.floor((Date.now() - 1456207176902) / (2629746 / 2000)) * + 8.30 ) ) }); From 49b9c7cc0c5fa25826be65d290258a638c27ad06 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Mon, 22 Feb 2016 22:32:50 -0800 Subject: [PATCH 3/8] Fix floor logic --- server/boot/about.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/server/boot/about.js b/server/boot/about.js index 92f16e70de..ff0d6a0617 100644 --- a/server/boot/about.js +++ b/server/boot/about.js @@ -28,13 +28,10 @@ export default function about(app) { globalCompletedCount: numberWithCommas( 5612952 + (Math.floor((Date.now() - 1446268581061) / 1800)) ), - globalPledgedAmount: numberWithCommas( - 28000.00 + - ( - Math.floor((Date.now() - 1456207176902) / (2629746 / 2000)) * - 8.30 - ) - ) + globalPledgedAmount: numberWithCommas(Math.floor( + 28000 + + ((Date.now() - 1456207176902) / (2629746000 / 2000) * 8.30) + )) }); }) .subscribe(() => {}, next); From a71daa07ce88125f432b7e7bc49beb990d555b0f Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Mon, 22 Feb 2016 23:00:59 -0800 Subject: [PATCH 4/8] Add cert counts --- server/boot/about.js | 27 +++++++++++++++++++++++---- server/views/resources/about.jade | 18 ++++++++++++++++-- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/server/boot/about.js b/server/boot/about.js index ff0d6a0617..04199db81d 100644 --- a/server/boot/about.js +++ b/server/boot/about.js @@ -1,3 +1,4 @@ +import { Observable } from 'rx'; import dedent from 'dedent'; import moment from 'moment'; @@ -15,11 +16,29 @@ export default function about(app) { function showAbout(req, res, next) { const daysRunning = moment().diff(new Date('10/15/2014'), 'days'); - userCount$() - .map(camperCount => numberWithCommas(camperCount)) - .doOnNext(camperCount => { + Observable.combineLatest( + userCount$(), + userCount$({ isFrontEndCert: true }), + userCount$({ isDataVisCert: true }), + userCount$({ isBackEndCert: true }), + ( + userCount, + frontEndCount = 0, + dataVisCount = 0, + backEndCount = 0 + ) => ({ + userCount: numberWithCommas(userCount), + frontEndCount, + dataVisCount, + backEndCount + }) + ) + .doOnNext(({ userCount, frontEndCount, dataVisCount, backEndCount }) => { res.render('resources/about', { - camperCount, + userCount, + frontEndCount, + dataVisCount, + backEndCount, daysRunning, title: dedent` About our Open Source Community, our social media presence, diff --git a/server/views/resources/about.jade b/server/views/resources/about.jade index dfde0d488e..7ef6395a4f 100644 --- a/server/views/resources/about.jade +++ b/server/views/resources/about.jade @@ -11,7 +11,7 @@ block content | days ago li span.tag Population: - span.text-primary #{camperCount} + span.text-primary #{userCount} | campers li span.tag Completed: @@ -23,8 +23,22 @@ block content | in pro-bono code li.nowrap span.tag Pledged: - span.text-primary #{globalPledgedAmount} + span.text-primary $#{globalPledgedAmount} | to nonprofits + li.nowrap + span.tag Certifications earned: + li.nowrap + span.tag Front End: + span.text-primary #{frontEndCount} + | campers + li.nowrap + span.tag Data Viz: + span.text-primary #{dataVisCount} + | campers + li.nowrap + span.tag Back End: + span.text-primary #{backEndCount} + | campers .spacer .row .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3 From c57f1b6f9a8f516a4fffd2bc718ac3bb4fc588eb Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 23 Feb 2016 11:04:27 -0800 Subject: [PATCH 5/8] Make cert bold --- server/views/resources/about.jade | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/views/resources/about.jade b/server/views/resources/about.jade index 7ef6395a4f..e0ed846888 100644 --- a/server/views/resources/about.jade +++ b/server/views/resources/about.jade @@ -25,8 +25,11 @@ block content span.tag Pledged: span.text-primary $#{globalPledgedAmount} | to nonprofits - li.nowrap - span.tag Certifications earned: + .row + .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3 + h2.text-center Certifications + hr + ul.population-table li.nowrap span.tag Front End: span.text-primary #{frontEndCount} From 06ea13225735a5fadbf9a017c8074e7f71007ac7 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 5 Apr 2016 14:45:09 -0700 Subject: [PATCH 6/8] Add timed cache to user count queries --- server/boot/about.js | 33 +++++++++++++++++-------------- server/utils/rx.js | 22 ++++++++++++++++++++- server/views/resources/about.jade | 8 -------- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/server/boot/about.js b/server/boot/about.js index 04199db81d..455f39fc0d 100644 --- a/server/boot/about.js +++ b/server/boot/about.js @@ -2,40 +2,43 @@ import { Observable } from 'rx'; import dedent from 'dedent'; import moment from 'moment'; -import { observeMethod } from '../utils/rx'; +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'); +} + export default function about(app) { const router = app.loopback.Router(); const User = app.models.User; - const userCount$ = observeMethod(User, 'count'); + const userCount = observeMethod(User, 'count'); + const frontEndCount$ = getCertCount(userCount, 'isFrontEndCert'); + const dataVisCount$ = getCertCount(userCount, 'isDataVisCert'); + const backEndCount$ = getCertCount(userCount, 'isBackEndCert'); function showAbout(req, res, next) { const daysRunning = moment().diff(new Date('10/15/2014'), 'days'); Observable.combineLatest( - userCount$(), - userCount$({ isFrontEndCert: true }), - userCount$({ isDataVisCert: true }), - userCount$({ isBackEndCert: true }), - ( - userCount, - frontEndCount = 0, - dataVisCount = 0, - backEndCount = 0 - ) => ({ - userCount: numberWithCommas(userCount), + frontEndCount$, + dataVisCount$, + backEndCount$, + (frontEndCount = 0, dataVisCount = 0, backEndCount = 0) => ({ frontEndCount, dataVisCount, backEndCount }) ) - .doOnNext(({ userCount, frontEndCount, dataVisCount, backEndCount }) => { + .doOnNext(({ frontEndCount, dataVisCount, backEndCount }) => { res.render('resources/about', { - userCount, frontEndCount, dataVisCount, backEndCount, diff --git a/server/utils/rx.js b/server/utils/rx.js index 891d24e9f3..20976dfeb8 100644 --- a/server/utils/rx.js +++ b/server/utils/rx.js @@ -1,4 +1,5 @@ -import Rx from 'rx'; +import Rx, { AsyncSubject, Observable } from 'rx'; +import moment from 'moment'; import debugFactory from 'debug'; const debug = debugFactory('fcc:rxUtils'); @@ -31,3 +32,22 @@ export function observeQuery(Model, method, query) { export function observeMethod(context, methodName) { return Rx.Observable.fromNodeCallback(context[methodName], context); } + +// timeChache(amount: Number, unit: String) => Observable +export function timeCache(time, unit) { + const source = this; + let cache; + let expireCacheAt; + return Observable.create(observable => { + // if there is no expire time set + // or if expireCacheAt is smaller than now, + // set new expire time in MS and create new subscription to source + if (!expireCacheAt || expireCacheAt < Date.now()) { + // set expire in ms; + expireCacheAt = moment().add(time, unit).valueOf(); + cache = new AsyncSubject(); + source.subscribe(cache); + } + return cache.subscribe(observable); + }); +} diff --git a/server/views/resources/about.jade b/server/views/resources/about.jade index e0ed846888..c526ee7e24 100644 --- a/server/views/resources/about.jade +++ b/server/views/resources/about.jade @@ -9,14 +9,6 @@ block content span.tag Established: span.text-primary #{daysRunning} | days ago - li - span.tag Population: - span.text-primary #{userCount} - | campers - li - span.tag Completed: - span.text-primary #{globalCompletedCount} - | challenges li.nowrap span.tag Donated: span.text-primary $850,000 From cfdb2d17b44f97d08bfb16e8969d84b913197490 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 5 Apr 2016 21:41:27 -0700 Subject: [PATCH 7/8] Add commas to certs earned on about page --- server/boot/about.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/boot/about.js b/server/boot/about.js index 455f39fc0d..7e596394f3 100644 --- a/server/boot/about.js +++ b/server/boot/about.js @@ -39,9 +39,9 @@ export default function about(app) { ) .doOnNext(({ frontEndCount, dataVisCount, backEndCount }) => { res.render('resources/about', { - frontEndCount, - dataVisCount, - backEndCount, + frontEndCount: numberWithCommas(frontEndCount), + dataVisCount: numberWithCommas(dataVisCount), + backEndCount: numberWithCommas(backEndCount), daysRunning, title: dedent` About our Open Source Community, our social media presence, From 1a156873271944faaa2f1a2001fe492698c6fe7f Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 5 Apr 2016 21:41:45 -0700 Subject: [PATCH 8/8] Change 'campers' to 'earned' --- server/views/resources/about.jade | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/views/resources/about.jade b/server/views/resources/about.jade index c526ee7e24..e13a74bd15 100644 --- a/server/views/resources/about.jade +++ b/server/views/resources/about.jade @@ -25,15 +25,15 @@ block content li.nowrap span.tag Front End: span.text-primary #{frontEndCount} - | campers + | earned li.nowrap span.tag Data Viz: span.text-primary #{dataVisCount} - | campers + | earned li.nowrap span.tag Back End: span.text-primary #{backEndCount} - | campers + | earned .spacer .row .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3