chore(api): remove unused code and endpoints (#41332)
This commit is contained in:
committed by
GitHub
parent
fa6b11f359
commit
cd40d47363
@@ -1,5 +0,0 @@
|
||||
Everything to do with the server.
|
||||
|
||||
One file that is not tracked here is `rev-manifest.json`.
|
||||
It is generated at runtime and its contents change as the contents
|
||||
of client side files change.
|
@@ -34,7 +34,6 @@ const app = loopback();
|
||||
app.set('state namespace', '__fcc__');
|
||||
app.set('port', process.env.PORT || 3000);
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
app.set('view engine', 'jade');
|
||||
app.use(loopback.token());
|
||||
app.use(
|
||||
morgan(reqLogFormat, { stream: { write: msg => log(_.split(msg, '\n')[0]) } })
|
||||
|
@@ -1,17 +1,6 @@
|
||||
{
|
||||
"initial:before": {
|
||||
"./middlewares/sentry-request-handler": {},
|
||||
"loopback#favicon": {
|
||||
"params": "$!../public/favicon.ico"
|
||||
},
|
||||
"loopback#static": {
|
||||
"params": [
|
||||
"$!../public",
|
||||
{
|
||||
"maxAge": "86400000"
|
||||
}
|
||||
]
|
||||
}
|
||||
"./middlewares/sentry-request-handler": {}
|
||||
},
|
||||
"initial": {
|
||||
"compression": {},
|
||||
|
@@ -7,10 +7,6 @@
|
||||
"./models"
|
||||
]
|
||||
},
|
||||
"about": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
},
|
||||
"AuthToken": {
|
||||
"dataSource": "db",
|
||||
"public": false
|
||||
@@ -39,14 +35,6 @@
|
||||
"dataSource": "mail",
|
||||
"public": false
|
||||
},
|
||||
"nonprofit": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
},
|
||||
"pledge": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
},
|
||||
"Role": {
|
||||
"dataSource": "db",
|
||||
"public": false
|
||||
@@ -70,13 +58,5 @@
|
||||
"User": {
|
||||
"dataSource": "db",
|
||||
"public": false
|
||||
},
|
||||
"article": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
},
|
||||
"popularity": {
|
||||
"dataSource": "db",
|
||||
"public": true
|
||||
}
|
||||
}
|
||||
|
@@ -1,26 +0,0 @@
|
||||
import { createActiveUsers } from '../utils/about.js';
|
||||
|
||||
module.exports = function(About) {
|
||||
const activeUsers = createActiveUsers();
|
||||
let activeUsersForRendering = 0;
|
||||
About.getActiveUsers = async function getActiveUsers() {
|
||||
// converting to promise automatically will subscribe to Observable
|
||||
// initiating the sequence above
|
||||
const usersActive = await activeUsers.toPromise();
|
||||
activeUsersForRendering = usersActive;
|
||||
return usersActive;
|
||||
};
|
||||
|
||||
About.getActiveUsersForRendering = () => activeUsersForRendering;
|
||||
|
||||
About.remoteMethod('getActiveUsers', {
|
||||
http: {
|
||||
path: '/get-active-users',
|
||||
verb: 'get'
|
||||
},
|
||||
returns: {
|
||||
type: 'number',
|
||||
arg: 'activeUsers'
|
||||
}
|
||||
});
|
||||
};
|
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"name": "about",
|
||||
"plural": "about",
|
||||
"base": "PersistedModel",
|
||||
"idInjection": true,
|
||||
"options": {
|
||||
"validateUpsert": true
|
||||
},
|
||||
"properties": {},
|
||||
"validations": [],
|
||||
"relations": {},
|
||||
"acls": [
|
||||
{
|
||||
"accessType": "*",
|
||||
"principalType": "ROLE",
|
||||
"principalId": "$everyone",
|
||||
"permission": "DENY"
|
||||
},
|
||||
{
|
||||
"accessType": "EXECUTE",
|
||||
"principalType": "ROLE",
|
||||
"principalId": "$everyone",
|
||||
"permission": "ALLOW",
|
||||
"property": "getActiveUsers"
|
||||
}
|
||||
],
|
||||
"methods": {}
|
||||
}
|
@@ -1,93 +0,0 @@
|
||||
import _ from 'lodash';
|
||||
import debug from 'debug';
|
||||
import dedent from 'dedent';
|
||||
import fs from 'fs';
|
||||
import { google } from 'googleapis';
|
||||
import { Observable } from 'rx';
|
||||
|
||||
import { timeCache, observeMethod } from './rx';
|
||||
|
||||
// one million!
|
||||
const upperBound = 1000 * 1000;
|
||||
const scope = 'https://www.googleapis.com/auth/analytics.readonly';
|
||||
const pathToCred = process.env.GOOGLE_APPLICATION_CREDENTIALS;
|
||||
|
||||
const log = debug('fcc:server:utils:about');
|
||||
const analytics = google.analytics('v3');
|
||||
const makeRequest = observeMethod(analytics.data.realtime, 'get');
|
||||
export const toBoundInt = _.flow(
|
||||
// first convert string to integer
|
||||
_.toInteger,
|
||||
// then we bound the integer to prevent weird things like Infinity
|
||||
// and negative numbers
|
||||
// can't wait to the day we need to update this!
|
||||
_.partialRight(_.clamp, 0, upperBound)
|
||||
);
|
||||
|
||||
export function createActiveUsers() {
|
||||
const zero = Observable.of(0);
|
||||
let credentials;
|
||||
if (!pathToCred) {
|
||||
// if no path to credentials set to zero;
|
||||
log(dedent`
|
||||
no google applications credentials environmental variable found
|
||||
'GOOGLE_APPLICATION_CREDENTIALS'
|
||||
'activeUser' api will always return 0
|
||||
this can safely be ignored during development
|
||||
`);
|
||||
return zero;
|
||||
}
|
||||
try {
|
||||
credentials = require(fs.realpathSync(pathToCred));
|
||||
} catch (err) {
|
||||
log('google applications credentials file failed to require');
|
||||
console.error(err);
|
||||
// if we can't require credentials set to zero;
|
||||
return zero;
|
||||
}
|
||||
if (
|
||||
!credentials.private_key ||
|
||||
!credentials.client_email ||
|
||||
!credentials.viewId
|
||||
) {
|
||||
log(dedent`
|
||||
google applications credentials json should have a
|
||||
* private_key
|
||||
* client_email
|
||||
* viewId
|
||||
but none were found
|
||||
`);
|
||||
return zero;
|
||||
}
|
||||
|
||||
const client = new google.auth.JWT(
|
||||
credentials['client_email'],
|
||||
null,
|
||||
credentials['private_key'],
|
||||
[scope]
|
||||
);
|
||||
const authorize = observeMethod(client, 'authorize');
|
||||
const options = {
|
||||
ids: `ga:${credentials.viewId}`,
|
||||
auth: client,
|
||||
metrics: 'rt:activeUsers'
|
||||
};
|
||||
return Observable.defer(
|
||||
// we wait for authorize to complete before attempting to make request
|
||||
// this ensures our token is initialized and valid
|
||||
// we defer here to make sure the actual request is done per subscription
|
||||
// instead of once at startup
|
||||
() => authorize().flatMap(() => makeRequest(options))
|
||||
)
|
||||
// data: Array[body|Object, request: Request]
|
||||
.map(data => data[0])
|
||||
.map(
|
||||
({ totalsForAllResults } = {}) => totalsForAllResults['rt:activeUsers']
|
||||
)
|
||||
.map(toBoundInt)
|
||||
// print errors to error log for logging, duh
|
||||
.do(null, err => console.error(err))
|
||||
// always send a number down
|
||||
.catch(() => Observable.of(0))
|
||||
::timeCache(2, 'seconds');
|
||||
}
|
@@ -1,113 +0,0 @@
|
||||
extends ../layout-wide
|
||||
block content
|
||||
script(src="../../../js/calculator.js")
|
||||
.row
|
||||
.col-xs-12.col-sm-10.col-md-8.col-lg-6.col-sm-offset-1.col-md-offset-2.col-lg-offset-3
|
||||
h1.text-center Coding Bootcamp Cost Calculator
|
||||
h3.text-center.text-primary#chosen Coming from _______, and making $_______, your true costs will be:
|
||||
#city-buttons
|
||||
.spacer
|
||||
h2.text-center Where do you live?
|
||||
.spacer
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#atlanta.btn.btn-primary.btn-block.btn-lg Atlanta
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#austin.btn.btn-primary.btn-block.btn-lg Austin
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#brisbane.btn.btn-primary.btn-block.btn-lg Brisbane
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#boulder.btn.btn-primary.btn-block.btn-lg Boulder
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#chicago.btn.btn-primary.btn-block.btn-lg Chicago
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#denver.btn.btn-primary.btn-block.btn-lg Denver
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#hong-kong.btn.btn-primary.btn-block.btn-lg Hong Kong
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#london.btn.btn-primary.btn-block.btn-lg London
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#los-angeles.btn.btn-primary.btn-block.btn-lg Los Angeles
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#manchester.btn.btn-primary.btn-block.btn-lg Manchester
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#melbourne.btn.btn-primary.btn-block.btn-lg Melbourne
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#new-york-city.btn.btn-primary.btn-block.btn-lg New York City
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#portland.btn.btn-primary.btn-block.btn-lg Portland
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#raleigh-durham.btn.btn-primary.btn-block.btn-lg Raleigh-Durham
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#san-francisco.btn.btn-primary.btn-block.btn-lg San Francisco
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#seattle.btn.btn-primary.btn-block.btn-lg Seattle
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#singapore.btn.btn-primary.btn-block.btn-lg Singapore
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#toronto.btn.btn-primary.btn-block.btn-lg Toronto
|
||||
.col-xs-12.btn-nav
|
||||
button#other.btn.btn-primary.btn-block.btn-lg Other
|
||||
.spacer
|
||||
#income.initially-hidden
|
||||
.spacer
|
||||
h2.text-center How much money did you make last year (in USD)?
|
||||
.spacer
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#0.btn.btn-primary.btn-block.btn-lg(href='#') $0
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#20000.btn.btn-primary.btn-block.btn-lg(href='#') $20,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#30000.btn.btn-primary.btn-block.btn-lg(href='#') $30,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#40000.btn.btn-primary.btn-block.btn-lg(href='#') $40,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#50000.btn.btn-primary.btn-block.btn-lg(href='#') $50,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#60000.btn.btn-primary.btn-block.btn-lg(href='#') $60,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#70000.btn.btn-primary.btn-block.btn-lg(href='#') $70,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#80000.btn.btn-primary.btn-block.btn-lg(href='#') $80,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#90000.btn.btn-primary.btn-block.btn-lg(href='#') $90,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#100000.btn.btn-primary.btn-block.btn-lg(href='#') $100,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#120000.btn.btn-primary.btn-block.btn-lg(href='#') $120,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#140000.btn.btn-primary.btn-block.btn-lg(href='#') $140,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#160000.btn.btn-primary.btn-block.btn-lg(href='#') $160,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#180000.btn.btn-primary.btn-block.btn-lg(href='#') $180,000
|
||||
.col-xs-12.col-sm-12.col-md-4.btn-nav
|
||||
button#200000.btn.btn-primary.btn-block.btn-lg(href='#') $200,000
|
||||
.spacer
|
||||
#chart.initially-hidden
|
||||
.d3-centered
|
||||
svg.chart
|
||||
#explanation.initially-hidden
|
||||
.col-xs-12.col-sm-10.col-sm-offset-1
|
||||
.text-center
|
||||
button#transform.btn.btn-primary.btn-lg Transform
|
||||
.button-spacer
|
||||
a(href='/json/bootcamps.json') View Data Source JSON
|
||||
span •
|
||||
a(href='/coding-bootcamp-cost-calculator') Recalculate
|
||||
h3 Notes:
|
||||
ol
|
||||
li.large-li We assumed an APR of 6% and a term of 3 years. If you happen to have around $15,000 in cash set aside for a coding bootcamp, please ignore this cost.
|
||||
li.large-li We assume a cost of living of $500 for cities like San Francisco and New York City, and $400 per week for everywhere else.
|
||||
li.large-li The most substantial cost for most people is lost wages. A 40-hour-per-week job at the US Federal minimum wage would pay at least $15,000 per year. You can read more about economic cost
|
||||
a(href='https://en.wikipedia.org/wiki/Economic_cost' target='_blank') here
|
||||
| .
|
||||
.spacer
|
||||
.row
|
||||
.col-xs-12.col-sm-6
|
||||
img.img-responsive.testimonial-image.img-center(src='https://www.evernote.com/l/AHRIBndcq-5GwZVnSy1_D7lskpH4OcJcUKUB/image.png')
|
||||
.col-xs-12.col-sm-6
|
||||
h3 Built by Suzanne Atkinson
|
||||
p.large-p Suzanne is an emergency medicine physician, triathlon coach and web developer from Pittsburgh. You should  
|
||||
a(href='https://twitter.com/intent/user?screen_name=SteelCityCoach' target='_blank') follow her on Twitter
|
||||
| .
|
||||
.spacer
|
@@ -1,7 +0,0 @@
|
||||
h1 This is the fastest web page on the internet.
|
||||
h2 This is raw HTML with no CSS and no JavaScript.
|
||||
h2 This is served to you lightning fast from the cloud using Node.js and NGINX.
|
||||
h2 Unfortunately, this doesn't do anything.
|
||||
h2 I guess speed isn't everything, after all.
|
||||
h2
|
||||
a(href='/') Learn to code more useful websites than this one
|
Reference in New Issue
Block a user