Skip to content

Commit 6293aad

Browse files
committedSep 11, 2022
Relations | Student-Course
1 parent a5846b8 commit 6293aad

File tree

7 files changed

+119
-47
lines changed

7 files changed

+119
-47
lines changed
 

‎controllers/authController.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ exports.logoutUser = (req, res) => {
4747
};
4848

4949
exports.getDashboardPage = async (req, res) => {
50-
const user = await User.findOne({ _id: req.session.userID });
50+
const user = await User.findOne({ _id: req.session.userID }).populate(
51+
'courses'
52+
);
5153
const categories = await Category.find().sort('name');
5254
const courses = await Course.find({ creator: req.session.userID });
5355
res.status(200).render('dashboard', {

‎controllers/courseController.js

+32
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const Course = require('../models/Course');
22
const Category = require('../models/Category');
3+
const User = require('../models/User');
34

45
exports.createCourse = async (req, res) => {
56
try {
@@ -47,8 +48,10 @@ exports.getAllCourses = async (req, res) => {
4748
exports.getCourse = async (req, res) => {
4849
try {
4950
const course = await Course.findOne({ slug: req.params.slug }).populate('creator');
51+
const user = await User.findById(req.session.userID);
5052

5153
res.status(200).render('course', {
54+
user,
5255
course,
5356
page_name: 'courses',
5457
});
@@ -58,3 +61,32 @@ exports.getCourse = async (req, res) => {
5861
});
5962
}
6063
};
64+
65+
exports.enrollCourse = async (req, res) => {
66+
try {
67+
const user = await User.findById(req.session.userID);
68+
await user.courses.push({_id: req.body.course_id})
69+
await user.save();
70+
71+
res.status(200).redirect('/users/dashboard');
72+
} catch (error) {
73+
res.status(400).json({
74+
error,
75+
});
76+
}
77+
};
78+
79+
exports.releaseCourse = async (req, res) => {
80+
try {
81+
const user = await User.findById(req.session.userID);
82+
await user.courses.pull({_id:req.body.course_id});
83+
await user.save();
84+
85+
res.status(200).redirect('/users/dashboard');
86+
} catch (error) {
87+
res.status(400).json({
88+
status: 'fail',
89+
error,
90+
});
91+
}
92+
};

‎models/User.js

+28-21
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,40 @@ const bcrypt = require('bcrypt');
33
const Schema = mongoose.Schema;
44

55
const UserSchema = new Schema({
6-
name: {
7-
type: String,
8-
required: true,
9-
},
10-
email: {
11-
type: String,
12-
required: true,
13-
unique: true,
14-
},
15-
password: {
16-
type:String,
17-
required: true
18-
},
19-
role:{
20-
type: String,
21-
enum:["student", "teacher", "admin"],
22-
default: "student"
23-
}
6+
name: {
7+
type: String,
8+
required: true,
9+
},
10+
email: {
11+
type: String,
12+
required: true,
13+
unique: true,
14+
},
15+
password: {
16+
type: String,
17+
required: true,
18+
},
19+
role: {
20+
type: String,
21+
enum: ['student', 'teacher', 'admin'],
22+
default: 'student',
23+
},
24+
courses: [
25+
{
26+
type: mongoose.Schema.Types.ObjectId,
27+
ref: 'Course',
28+
},
29+
],
2430
});
2531

26-
UserSchema.pre('save', function (next){
32+
UserSchema.pre('save', function (next) {
33+
if (!this.isModified('password')) return next();
2734
const user = this;
2835
bcrypt.hash(user.password, 10, (error, hash) => {
2936
user.password = hash;
3037
next();
31-
})
32-
})
38+
});
39+
});
3340

3441
const User = mongoose.model('User', UserSchema);
3542
module.exports = User;

‎routes/courseRoute.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@ const router = express.Router();
66

77
router.route('/')
88
.get(courseController.getAllCourses)
9-
router.route('/').post(checkRole(["teacher", "admin"]), courseController.createCourse);
9+
.post(checkRole(["teacher", "admin"]), courseController.createCourse);
1010

1111
router.route('/:slug')
1212
.get(courseController.getCourse)
1313

14+
router.route('/enroll')
15+
.post(courseController.enrollCourse);
16+
17+
router.route('/release')
18+
.post(courseController.releaseCourse);
19+
1420
module.exports = router;

‎views/course.ejs

+11-5
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@
1919
<img src="images/blog_single.jpg" alt="" class="img-fluid">
2020
</div>
2121
<div class="post-content">
22-
<div class="post-date">
23-
<span class="day">30</span>
24-
<span class="month">Nov</span>
25-
</div>
22+
<% if (user && !user.courses.includes(course._id) ) { %>
23+
<% console.log(user); console.log(user.courses) %>
24+
<div class="post-date">
25+
<form method="POST" action="/courses/enroll">
26+
<input type="hidden" name="course_id" value="<%= course._id %>">
27+
<button class="btn btn-lg btn-warning text-white"><span>ENROLL</span></button>
28+
29+
</form>
30+
</div>
31+
<% } %>
2632
<div class="meta-info-blog">
2733
<span><i class="fa fa-calendar"></i> <a href="#">May 11, 2015</a> </span>
2834
</div>
@@ -37,7 +43,7 @@
3743

3844
<div class="blog-author">
3945
<div class="author-bio">
40-
<h3 class="author_name"><a href="#"><%= course.creator.name %></a></h3>
46+
<h3 class="author_name"><a href="#"><%= course?.creator.name %></a></h3>
4147
<h5>CEO at <a href="#">SmartEDU</a></h5>
4248
<p class="author_det">
4349
Lorem ipsum dolor sit amet, consectetur adip, sed do eiusmod tempor incididunt ut aut reiciendise voluptat maiores alias consequaturs aut perferendis doloribus omnis saperet docendi nec, eos ea alii molestiae aliquand.

‎views/courses.ejs

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<h2><a href="/courses/<%= courses[i].slug %>" title=""><%= courses[i].name %></a></h2>
2929
</div>
3030
<div class="course-desc">
31-
<p><%= courses[i].description %></p>
31+
<p><%= courses[i].description.substring(0, 140) + "..."%></p>
3232
</div>
3333
</div>
3434
<div class="course-meta-bot">

‎views/dashboard.ejs

+37-18
Original file line numberDiff line numberDiff line change
@@ -27,32 +27,51 @@
2727
<div class="author-bio">
2828
<h3 class="author_name"><a href="#"><%= user.name %></a></h3>
2929
</div>
30-
<div class="author-desc">
31-
<img src="/images/author.jpg" alt="about author">
32-
</div>
3330
</div>
3431

3532
</div><!-- end col -->
3633
</div><!-- end row -->
37-
34+
<h2 class="text-center"><b>Courses</b></h2>
3835
<div class="row mt-5">
39-
40-
<% for (let i=0; i < courses.length; i++) { %>
41-
<div class="col-lg-6 col-md-6 col-12">
42-
<div class="course-item mb-5">
43-
<div class="image-blog">
44-
<img src="/images/blog_1.jpg" alt="" class="img-fluid">
45-
</div>
46-
<div class="course-br">
47-
<div class="course-title">
48-
<h2><a href="/courses/<%= courses[i].slug %>" title=""><%= courses[i].name %></a></h2>
36+
<% if(user.role==='teacher' ) { %>
37+
<% for (let i=0; i < courses.length; i++) { %>
38+
<div class="col-lg-6 col-md-6 col-12">
39+
<div class="course-item mb-5">
40+
<div class="image-blog">
41+
<img src="/images/blog_1.jpg" alt="" class="img-fluid">
4942
</div>
50-
<div class="course-desc">
51-
<p><%= courses[i].description %></p>
43+
<div class="course-br">
44+
<div class="course-title">
45+
<h2><a href="/courses/<%= courses[i].slug %>" title=""><%= courses[i].name %></a></h2>
46+
</div>
47+
<div class="course-desc">
48+
<p><%= courses[i].description %></p>
49+
</div>
5250
</div>
5351
</div>
54-
</div>
55-
</div><!-- end col -->
52+
</div><!-- end col -->
53+
<% } %>
54+
<% } %>
55+
56+
<% if(user.role==='student' ) { %>
57+
<% for (let i=0; i < user.courses.length; i++) { %>
58+
<div class="col-lg-6 col-md-6 col-12">
59+
<div class="course-item mb-5">
60+
<div class="course-br">
61+
<div class="course-title">
62+
<h2><a href="/courses/<%= user.courses[i].slug %>" title=""><%= user.courses[i].name %></a></h2>
63+
</div>
64+
<div class="course-desc">
65+
<p><%= user.courses[i].description %></p>
66+
<form method="POST" action="/courses/release">
67+
<input type="hidden" name="course_id" value="<%= user.courses[i]._id %>">
68+
<button class="btn btn-lg btn-danger text-white"><span>RELEASE</span></button>
69+
</form>
70+
</div>
71+
</div>
72+
</div>
73+
</div><!-- end col -->
74+
<% } %>
5675
<% } %>
5776
</div><!-- end row -->
5877
</div><!-- end container -->

0 commit comments

Comments
 (0)