Skip to content
This repository was archived by the owner on Apr 28, 2018. It is now read-only.

Commit 802b7ff

Browse files
committed
Copy basic code from heroku.
0 parents  commit 802b7ff

8 files changed

+237
-0
lines changed

.gitignore

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Node build artifacts
2+
node_modules
3+
npm-debug.log
4+
5+
# Local development
6+
*.env
7+
*.dev
8+
.DS_Store
9+
10+
# Docker
11+
Dockerfile
12+
docker-compose.yml

Procfile

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
web: node index.js

README.md

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# prox-explorer
2+
3+
Web interface to explore Prox data sources
4+
5+
## Running Locally
6+
7+
Make sure you have [Node.js](http://nodejs.org/) and the [Heroku Toolbelt](https://toolbelt.heroku.com/) installed.
8+
9+
```sh
10+
$ npm install
11+
$ npm start
12+
```
13+
14+
Your app should now be running on [localhost:5000](http://localhost:5000/).
15+
16+
## Deploying to Heroku
17+
18+
```
19+
$ heroku create
20+
$ git push heroku master
21+
$ heroku open
22+
```
23+
or
24+
25+
[![Deploy to Heroku](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
26+
27+
## Documentation
28+
29+
For more information about using Node.js on Heroku, see these Dev Center articles:
30+
31+
- [Getting Started with Node.js on Heroku](https://devcenter.heroku.com/articles/getting-started-with-nodejs)
32+
- [Heroku Node.js Support](https://devcenter.heroku.com/articles/nodejs-support)
33+
- [Node.js on Heroku](https://devcenter.heroku.com/categories/nodejs)
34+
- [Best Practices for Node.js Development](https://devcenter.heroku.com/articles/node-best-practices)
35+
- [Using WebSockets on Heroku with Node.js](https://devcenter.heroku.com/articles/node-websockets)

app.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"name": "Prox Explorer",
3+
"description": "Web interface to explore Prox data sources",
4+
}

index.js

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
let express = require('express');
2+
let app = express();
3+
let request = require('request');
4+
5+
let eventbriteOAuth = process.env.EVENTBRITE_OAUTH
6+
7+
app.use(express.static('public'));
8+
9+
app.get('/events/eventbrite', (eventRequest, eventResponse) => {
10+
let params = {
11+
'location.latitude': eventRequest.query['lat'],
12+
'location.longitude': eventRequest.query['long'],
13+
'location.within': eventRequest.query['radius'] + 'km',
14+
'start_date.keyword': 'next_week',
15+
'page': eventRequest.query['page'],
16+
};
17+
let query = Object.entries(params).map(val => val.join('=')).join('&');
18+
console.log(query);
19+
let options = {
20+
url: 'https://www.eventbriteapi.com/v3/events/search/?' + query,
21+
headers: {
22+
'Authorization': 'Bearer ' + eventbriteOAuth,
23+
},
24+
};
25+
26+
request.get(options, (err, res, body) => {
27+
if (err) {
28+
eventResponse.send(err);
29+
return;
30+
}
31+
32+
console.log(body || res);
33+
eventResponse.send(body || res);
34+
});
35+
});
36+
37+
let port = process.env.PORT || 5000
38+
app.listen(port, () => {
39+
console.log(`listening on *:${port}`);
40+
});

package.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "prox-list",
3+
"version": "0.0.1",
4+
"description": "Prox List",
5+
"engines": {
6+
"node": "7.7.4"
7+
},
8+
"scripts": {
9+
"start": "node index.js"
10+
},
11+
"dependencies": {
12+
"express": "^4.10.2",
13+
"request": "^2.81.0"
14+
}
15+
}

public/index.html

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<html>
2+
<head>
3+
<title>Prox Explorer</title>
4+
<link rel="stylesheet" type="text/css" href="style.css">
5+
</head>
6+
<body>
7+
<ul id="nav"></ul>
8+
<table id="data"></table>
9+
10+
<script>
11+
function getEvents(provider, page) {
12+
return new Promise(function (resolve, reject) {
13+
let xhr = new XMLHttpRequest();
14+
xhr.open('GET', 'events/' + provider + '?lat=41.892455&long=-87.63397&radius=1&page=' + page, true);
15+
xhr.responseType = 'json';
16+
xhr.onload = function () {
17+
resolve(this.response);
18+
};
19+
xhr.send();
20+
});
21+
}
22+
23+
function addEvents(response) {
24+
console.log('Adding Eventbrite page ' + response.pagination.page_number + '/' + response.pagination.page_count);
25+
26+
let events = response.events;
27+
if (!events) {
28+
document.write("Error: " + JSON.stringify(response));
29+
return;
30+
}
31+
32+
let list = document.getElementById('nav');
33+
for (let event of events) {
34+
let a = document.createElement('a');
35+
a.textContent = event.name.text;
36+
a.href = 'javascript:void(0);';
37+
a.onclick = () => loadEvent(event);
38+
let li = document.createElement('li');
39+
list.appendChild(a);
40+
list.appendChild(li);
41+
}
42+
}
43+
44+
function loadEvent(event) {
45+
// Clear existing data.
46+
let data = document.getElementById('data');
47+
while (data.hasChildNodes()) {
48+
data.removeChild(data.lastChild);
49+
}
50+
51+
for (let field in event) {
52+
let row = document.createElement('tr');
53+
let label = document.createElement('td');
54+
label.textContent = field;
55+
row.appendChild(label);
56+
let value = document.createElement('td');
57+
58+
let text = event[field];
59+
if (text instanceof Object) {
60+
switch (field) {
61+
case 'name': text = text.text; break;
62+
case 'description': text = text.text; break;
63+
case 'start': text = text.local; break;
64+
case 'end': text = text.local; break;
65+
}
66+
}
67+
value.textContent = text;
68+
69+
row.appendChild(value);
70+
data.appendChild(row);
71+
}
72+
console.log(event);
73+
}
74+
75+
window.onload = () => {
76+
getEvents('eventbrite', 1).then(response => {
77+
addEvents(response);
78+
79+
let pageCount = response.pagination.page_count;
80+
for (let i = 2; i <= pageCount; i++) {
81+
getEvents('eventbrite', i).then(addEvents);
82+
}
83+
});
84+
};
85+
</script>
86+
</body>
87+
</html>

public/style.css

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
* {
2+
box-sizing: border-box;
3+
}
4+
5+
html, body {
6+
margin: 0;
7+
padding: 0;
8+
font-family: Sans-Serif;
9+
font-size: 14px;
10+
height: 100%;
11+
}
12+
13+
#nav {
14+
width: 40%;
15+
height: 100%;
16+
overflow: auto;
17+
list-style: none;
18+
margin: 0;
19+
padding: 10px;
20+
display: block;
21+
float: left;
22+
}
23+
24+
#nav li {
25+
margin: 5px;
26+
}
27+
28+
#nav a {
29+
color: black;
30+
text-decoration: none;
31+
}
32+
33+
#data {
34+
font-size: 14px;
35+
width: 60%;
36+
height: 100%;
37+
overflow: auto;
38+
margin: 0;
39+
padding: 10px;
40+
display: block;
41+
float: left;
42+
border-spacing: 5px;
43+
}

0 commit comments

Comments
 (0)