Skip to content

Commit 64e8a2a

Browse files
committed
BE #4 Basic article schema, create new and get last 10
1 parent 2156a8d commit 64e8a2a

File tree

5 files changed

+246
-39
lines changed

5 files changed

+246
-39
lines changed

app.js

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var mongoose=require('mongoose');
66
//custom modules
77
var indexRouter = require('./routes/index');
88
var usersRouter = require('./routes/users');
9+
var articleRouter = require('./routes/article');
910

1011
//connect to database
1112
var connect = mongoose.connect(process.env.DB_URL,{
@@ -30,5 +31,6 @@ app.use(express.urlencoded({ extended: false }));
3031
//routes
3132
app.use('/', indexRouter);
3233
app.use('/users', usersRouter);
34+
app.use('/article', articleRouter);
3335

3436
module.exports = app;

models/article.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
var mongoose=require('mongoose');
2+
var Schema=mongoose.Schema;
3+
4+
5+
var articleSchema = new Schema({
6+
title:{
7+
type:String,
8+
require:true
9+
},
10+
url:{
11+
type:String,
12+
require:true
13+
},
14+
body:[String]
15+
/* un-comment after #1 is added to development
16+
author: {
17+
type: mongoose.Schema.Types.ObjectId,
18+
ref: 'User',
19+
required: true,
20+
} */
21+
}, {
22+
timestamps: true
23+
});
24+
25+
var Article=mongoose.model('Article',articleSchema);
26+
module.exports=Article;

package-lock.json

+141-38
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
"test": "jest --detectOpenHandles --forceExit"
88
},
99
"dependencies": {
10+
"body-parser": "^1.19.0",
1011
"debug": "2.6.9",
1112
"dotenv": "^8.2.0",
1213
"express": "4.16.1",
1314
"mongodb": "^3.5.7",
1415
"mongoose": "^5.9.14",
15-
"morgan": "1.9.1"
16+
"morgan": "1.9.1",
17+
"slugify": "^1.4.0"
1618
},
1719
"devDependencies": {
1820
"jest": "^26.0.1",

routes/article.js

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
var debug = require('debug')
2+
var express = require('express');
3+
var bodyParser = require('body-parser');
4+
var slugify = require('slugify')
5+
6+
7+
var Article = require('../models/article');
8+
9+
var router = express.Router();
10+
router.use(bodyParser.json());
11+
12+
var createUniqueUrl = (title, callBack, counter = 0) => {
13+
var url = slugify(title, {
14+
lower: true, // convert to lower case
15+
strict: true, // strip special characters except replacement
16+
});
17+
18+
if (counter > 0) {
19+
url += '-' + counter;
20+
}
21+
22+
Article.findOne({ url: url })
23+
.then((art) => {
24+
if (null === art) {
25+
callBack(url);
26+
}
27+
else {
28+
createUniqueUrl(title, callBack, counter + 1);
29+
}
30+
})
31+
}
32+
33+
34+
router.route('/')
35+
.get((req, res, next) => {
36+
Article.find({})
37+
.sort({'updatedAt':-1})
38+
.limit(5)
39+
.exec(function (err, articles) {
40+
if (err) {
41+
res.statusCode = 500;
42+
res.setHeader('Content-Type', 'application/json');
43+
res.json(err);
44+
}
45+
else {
46+
res.statusCode = 200;
47+
res.setHeader('Content-Type', 'application/json');
48+
res.json(articles);
49+
}
50+
});
51+
})
52+
.post((req, res, next) => {
53+
debug('inside article create');
54+
createUniqueUrl(req.body.title, (url) => {
55+
var article = new Article({ title: req.body.title });
56+
article.url = url;
57+
article.body = req.body.body;
58+
59+
article.save((err, art) => {
60+
if (err) {
61+
res.statusCode = 500;
62+
res.setHeader('Content-Type', 'application/json');
63+
res.json(err);
64+
}
65+
else {
66+
res.statusCode = 200;
67+
res.setHeader('Content-Type', 'application/json');
68+
res.json(art);
69+
}
70+
})
71+
});
72+
})
73+
74+
module.exports = router;

0 commit comments

Comments
 (0)