Skip to content

Commit 785b155

Browse files
committed
Update starter API
1 parent 917fa2b commit 785b155

File tree

11 files changed

+303
-0
lines changed

11 files changed

+303
-0
lines changed

solution-code/server/app.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const express = require('express');
2+
const path = require('path');
3+
const favicon = require('serve-favicon');
4+
const logger = require('morgan');
5+
const cookieParser = require('cookie-parser');
6+
const bodyParser = require('body-parser');
7+
const layouts = require('express-ejs-layouts');
8+
const mongoose = require('mongoose');
9+
const cors = require('cors');
10+
11+
mongoose.connect('mongodb://localhost/journal-development');
12+
13+
const app = express();
14+
15+
app.use(cors());
16+
// view engine setup
17+
app.set('views', path.join(__dirname, 'views'));
18+
app.set('view engine', 'ejs');
19+
20+
// default value for title local
21+
app.locals.title = 'Express - Generated with IronGenerator';
22+
23+
// uncomment after placing your favicon in /public
24+
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
25+
app.use(logger('dev'));
26+
app.use(bodyParser.json());
27+
app.use(bodyParser.urlencoded({ extended: false }));
28+
app.use(cookieParser());
29+
app.use(express.static(path.join(__dirname, 'public')));
30+
app.use(layouts);
31+
32+
const index = require('./routes/index');
33+
app.use('/', index);
34+
35+
app.all('/*', function (req, res) {
36+
res.sendfile(__dirname + '/public/index.html');
37+
});
38+
// catch 404 and forward to error handler
39+
app.use((req, res, next) => {
40+
const err = new Error('Not Found');
41+
err.status = 404;
42+
next(err);
43+
});
44+
45+
// error handler
46+
app.use((err, req, res, next) => {
47+
// set locals, only providing error in development
48+
res.locals.message = err.message;
49+
res.locals.error = req.app.get('env') === 'development' ? err : {};
50+
51+
// render the error page
52+
res.status(err.status || 500);
53+
res.render('error');
54+
});
55+
56+
module.exports = app;

solution-code/server/bin/seeds.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const JournalEntry = require('../models/journal-entry');
2+
const mongoose = require('mongoose');
3+
mongoose.connect('mongodb://localhost/journal-development');
4+
5+
const entries = [
6+
{
7+
title: "First Post",
8+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
9+
},
10+
{
11+
title: "Second Post",
12+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
13+
},
14+
{
15+
title: "Third Post",
16+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
17+
},
18+
{
19+
title: "Fourth Post",
20+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
21+
},
22+
{
23+
title: "Fifth Post",
24+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
25+
},
26+
{
27+
title: "Sixth Post",
28+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
29+
},
30+
{
31+
title: "Seventh Post",
32+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
33+
},
34+
{
35+
title: "Eighth Post",
36+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
37+
},
38+
{
39+
title: "Ninth Post",
40+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
41+
},
42+
{
43+
title: "Tenth Post",
44+
content: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
45+
}
46+
];
47+
48+
JournalEntry.create(entries, (err, entries) => {
49+
if (err){ throw(err) }
50+
console.log("Success", entries);
51+
mongoose.connection.close();
52+
})

solution-code/server/bin/www

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/usr/bin/env node
2+
3+
/**
4+
* Module dependencies.
5+
*/
6+
7+
var app = require('../app');
8+
var debug = require('debug')('server:server');
9+
var http = require('http');
10+
11+
/**
12+
* Get port from environment and store in Express.
13+
*/
14+
15+
var port = normalizePort(process.env.PORT || '3000');
16+
app.set('port', port);
17+
18+
/**
19+
* Create HTTP server.
20+
*/
21+
22+
var server = http.createServer(app);
23+
24+
/**
25+
* Listen on provided port, on all network interfaces.
26+
*/
27+
28+
server.listen(port);
29+
server.on('error', onError);
30+
server.on('listening', onListening);
31+
32+
/**
33+
* Normalize a port into a number, string, or false.
34+
*/
35+
36+
function normalizePort(val) {
37+
var port = parseInt(val, 10);
38+
39+
if (isNaN(port)) {
40+
// named pipe
41+
return val;
42+
}
43+
44+
if (port >= 0) {
45+
// port number
46+
return port;
47+
}
48+
49+
return false;
50+
}
51+
52+
/**
53+
* Event listener for HTTP server "error" event.
54+
*/
55+
56+
function onError(error) {
57+
if (error.syscall !== 'listen') {
58+
throw error;
59+
}
60+
61+
var bind = typeof port === 'string'
62+
? 'Pipe ' + port
63+
: 'Port ' + port;
64+
65+
// handle specific listen errors with friendly messages
66+
switch (error.code) {
67+
case 'EACCES':
68+
console.error(bind + ' requires elevated privileges');
69+
process.exit(1);
70+
break;
71+
case 'EADDRINUSE':
72+
console.error(bind + ' is already in use');
73+
process.exit(1);
74+
break;
75+
default:
76+
throw error;
77+
}
78+
}
79+
80+
/**
81+
* Event listener for HTTP server "listening" event.
82+
*/
83+
84+
function onListening() {
85+
var addr = server.address();
86+
var bind = typeof addr === 'string'
87+
? 'pipe ' + addr
88+
: 'port ' + addr.port;
89+
debug('Listening on ' + bind);
90+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const mongoose = require('mongoose');
2+
const Schema = mongoose.Schema;
3+
4+
const EntrySchema = new Schema({
5+
title: {
6+
type: String,
7+
required: [true, "Title is required"]
8+
},
9+
content: {
10+
type: String,
11+
required: [true, "Content is required"]
12+
},
13+
date: {
14+
type: Date,
15+
default: Date.now
16+
}
17+
});
18+
19+
module.exports = mongoose.model('JournalEntry', EntrySchema);

solution-code/server/package.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "server",
3+
"version": "0.0.0",
4+
"private": true,
5+
"scripts": {
6+
"start": "node ./bin/www"
7+
},
8+
"dependencies": {
9+
"body-parser": "~1.16.0",
10+
"cookie-parser": "~1.4.3",
11+
"cors": "^2.8.1",
12+
"debug": "~2.6.0",
13+
"ejs": "~2.5.5",
14+
"express": "~4.14.1",
15+
"express-ejs-layouts": "~2.2.0",
16+
"mongoose": "~4.8.5",
17+
"morgan": "~1.7.0",
18+
"serve-favicon": "~2.3.2"
19+
}
20+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
body {
2+
padding: 50px;
3+
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4+
}
5+
6+
a {
7+
color: #00B7FF;
8+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const express = require('express');
2+
const router = express.Router();
3+
const Entry = require('../../models/journal-entry');
4+
5+
router.get('/journal-entries', (req, res, next) => {
6+
Entry.find({}, (err, entries) => {
7+
if (err) { return res.json(err).status(500); }
8+
9+
return res.json(entries);
10+
});
11+
});
12+
13+
router.get('/journal-entries/:id', (req, res, next) => {
14+
Entry.findById(req.params.id, (err, entry) => {
15+
if (err) { return res.json(err).status(500); }
16+
if (!entry) { return res.json(err).status(404); }
17+
18+
return res.json(entry);
19+
});
20+
});
21+
22+
router.post('/journal-entries', (req, res, next) => {
23+
const newEntry = new Entry({
24+
title: req.body.title,
25+
content: req.body.content
26+
});
27+
28+
newEntry.save( (err) => {
29+
if (err) { return res.status(500).json(err) }
30+
if (newEntry.errors) { return res.status(400).json(newEntry) }
31+
return res.json(newEntry);
32+
});
33+
});
34+
35+
module.exports = router;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const express = require('express');
2+
const journalRoutes = require('./api/journal-entries');
3+
const router = express.Router();
4+
5+
router.use('/api', journalRoutes);
6+
7+
module.exports = router;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<h1><%= message %></h1>
2+
<h2><%= error.status %></h2>
3+
<pre><%= error.stack %></pre>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<h1><%= title %></h1>
2+
<p>Welcome to <%= title %></p>

0 commit comments

Comments
 (0)