Skip to content

Commit fe069a9

Browse files
committed
feedback refactored
1 parent 146151c commit fe069a9

File tree

17 files changed

+157
-82
lines changed

17 files changed

+157
-82
lines changed

fixture/init/course.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ exports.CourseGroup = [
5353
},
5454
{
5555
course: oid('course-nodejs'),
56-
dateStart: new Date(2015, 6, 22),
57-
dateEnd: new Date(2015, 7, 10),
56+
dateStart: new Date(2016, 6, 22),
57+
dateEnd: new Date(2016, 7, 10),
5858
timeDesc: "пн/ср/сб 19:30 - 21:00 GMT+3",
5959
slug: 'nodejs-20160722',
6060
price: 1,

fixture/init/user.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@ var oid = require('oid');
44
var User = require('users').User;
55

66
exports.User = [{
7-
"_id": oid('user-tester'),
7+
"_id": oid('user-tester'),
88
99
displayName: "Tester",
1010
profileName: 'tester',
1111
password: "123456",
1212
verifiedEmail: true
1313
}, {
14-
"_id": oid('user-iliakan'),
15-
16-
displayName: "Ilya Kantor",
17-
profileName: 'iliakan',
18-
password: "123456",
19-
verifiedEmail: true
14+
"_id": oid('user-iliakan'),
15+
16+
displayName: "Ilya Kantor",
17+
profileName: 'iliakan',
18+
password: "123456",
19+
isAdmin: 1,
20+
teachesCourses: [oid('course-nodejs'), oid('course-js')],
21+
verifiedEmail: true
2022
}];
2123

handlers/courses/client/feedbackShow/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class FeedbackManager {
1414
this.delegate("[data-action-coursefeedback-comment-add]", "click", (event) => {
1515
event.preventDefault();
1616
this.getItem(event.target).addComment();
17-
1817
});
1918

2019
this.delegate("[data-action-coursefeedback-comment-edit]", "click", (event) => {
@@ -71,7 +70,7 @@ class FeedbackItem {
7170
this.teacherComment = "";
7271
teacherCommentElem = document.createElement('div');
7372
teacherCommentElem.className = 'course-feedback__teacher-comment';
74-
this.elem.querySelector('.course-feedback__info').appendChild(teacherCommentElem);
73+
this.elem.querySelector('.course-feedback__teacher').appendChild(teacherCommentElem);
7574
}
7675

7776
teacherCommentElem.innerHTML = clientRender(commentForm, {

handlers/courses/controller/courseFeedback.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ function* getFeedbackStats(course) {
109109
if (!recommendStats[false]) recommendStats[false] = [{count: 0}];
110110

111111
// 76% recommend
112-
let recommendFraction = recommendStats[true][0].count / (recommendStats[true][0].count + recommendStats[false][0].count);
112+
let recommendFraction = recommendStats[true][0].count / (recommendStats[true][0].count + recommendStats[false][0].count) || 0;
113113

114114
return {
115115
stars: starStatsPopulated,

handlers/courses/controller/groupFeedbackEdit.js

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,104 @@
1+
'use strict';
2+
13
const countries = require('countries');
24
const ImgurImage = require('imgur').ImgurImage;
5+
const User = require('users').User;
36
const CourseFeedback = require('../models/courseFeedback');
7+
const CourseGroup = require('../models/courseGroup');
48
const CourseParticipant = require('../models/courseParticipant');
59
const _ = require('lodash');
10+
const assert = require('assert');
611

712
exports.all = function*() {
813

9-
var group = this.locals.group = this.groupBySlug;
14+
let group, teacher, participant, courseFeedback;
1015

11-
this.locals.title = "Отзыв\n" + group.title;
16+
if (!this.user) {
17+
this.throw(403);
18+
}
1219

13-
this.locals.participant = this.participant;
20+
if (this.groupBySlug) {
21+
group = this.groupBySlug;
1422

15-
this.locals.countries = countries.all;
23+
participant = yield CourseParticipant.findOne({
24+
isActive: true,
25+
group: group._id,
26+
user: this.user._id
27+
});
28+
29+
if (!participant) {
30+
this.throw(403, "Оставлять отзыв могут только участники группы");
31+
}
1632

17-
var courseFeedback = yield CourseFeedback.findOne({
18-
participant: this.participant._id
19-
}).exec();
33+
courseFeedback = yield CourseFeedback.findOne({
34+
participant: participant._id
35+
});
2036

21-
if (!courseFeedback) {
37+
if (courseFeedback) {
38+
// if feedback exists already, there is another page to edit it
39+
this.redirect('/courses/feedback/edit/' + courseFeedback.number);
40+
return;
41+
}
42+
43+
teacher = yield User.findById(group.teacher);
2244
courseFeedback = new CourseFeedback({
45+
group: group._id,
46+
participant: participant._id,
2347
recommend: true,
2448
isPublic: true,
25-
country: this.participant.country,
26-
photo: this.participant.photo,
27-
aboutLink: this.participant.aboutLink,
28-
city: this.participant.city,
29-
occupation: this.participant.occupation,
30-
userCache: this.user.id,
31-
teacherCache: group.teacher
49+
country: participant.country,
50+
photo: participant.photo,
51+
aboutLink: participant.aboutLink,
52+
city: participant.city,
53+
occupation: participant.occupation,
54+
userCache: this.user._id,
55+
teacherCache: teacher.id
56+
});
57+
58+
59+
} else if (this.params.feedbackNumber) {
60+
61+
courseFeedback = yield CourseFeedback.findOne({
62+
number: this.params.feedbackNumber
3263
});
64+
65+
if (!courseFeedback) {
66+
this.throw(404);
67+
}
68+
69+
participant = yield CourseParticipant.findById(courseFeedback.participant);
70+
71+
group = yield CourseGroup.findById(courseFeedback.group);
72+
teacher = yield User.findById(group.teacher);
73+
74+
if (!this.user._id.equals(participant._id) &&
75+
!this.user._id.equals(teacher._id) &&
76+
!this.isAdmin
77+
) {
78+
this.throw(403, 'Не хватает прав');
79+
}
80+
81+
3382
}
3483

84+
this.locals.title = "Отзыв\n" + group.title;
85+
86+
assert(participant);
87+
assert(teacher);
88+
assert(courseFeedback);
89+
assert(group);
90+
91+
this.locals.participant = participant;
92+
this.locals.group = group;
93+
this.locals.teacher = teacher;
94+
this.locals.courseFeedback = courseFeedback;
95+
this.locals.countries = countries.all;
96+
3597
if (this.method == 'POST') {
36-
var feedbackData = _.pick(this.request.body,
98+
let feedbackData = _.pick(this.request.body,
3799
'stars content country city isPublic recommend aboutLink occupation'.split(' ')
38100
);
39101

40-
feedbackData.participant = this.participant._id;
41-
feedbackData.group = group._id;
42102
feedbackData.recommend = Boolean(+feedbackData.recommend);
43103
feedbackData.isPublic = Boolean(+feedbackData.isPublic);
44104

@@ -63,7 +123,7 @@ exports.all = function*() {
63123

64124
this.body = this.render('feedback/edit', {
65125
errors: errors,
66-
form: courseFeedback
126+
courseFeedback: courseFeedback
67127
});
68128

69129
return;
@@ -88,8 +148,6 @@ exports.all = function*() {
88148

89149
} else if (this.method == 'GET') {
90150

91-
this.locals.form = courseFeedback;
92-
93151
this.body = this.render('feedback/edit');
94152
}
95153

handlers/courses/controller/groupFeedbackShow.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ exports.get = function*() {
1717
this.throw(404);
1818
}
1919

20-
yield CourseGroup.populate(courseFeedback.group, "course");
20+
yield CourseGroup.populate(courseFeedback.group, "course teacher");
2121

22-
var authorOrAdmin = false;
22+
var authorOrAdminOrTeacher = false;
2323
if (this.user) {
24-
if (this.user.isAdmin || this.user._id.equals(courseFeedback.userCache)) {
25-
authorOrAdmin = true;
24+
if (this.user.isAdmin || this.user._id.equals(courseFeedback.userCache || ~this.user.teachesCourses.indexOf(courseFeedback.group._id))) {
25+
authorOrAdminOrTeacher = true;
2626
}
2727
}
2828

29-
if (!courseFeedback.isPublic && !authorOrAdmin) {
29+
if (!courseFeedback.isPublic && !authorOrAdminOrTeacher) {
3030
this.throw(403, "Отзыв не публичный");
3131
}
3232

@@ -39,9 +39,6 @@ exports.get = function*() {
3939

4040
var feedbackRendered = this.locals.courseFeedback = yield* renderFeedback(courseFeedback, this.user);
4141
feedbackRendered.shareEnabled = true;
42-
if (feedbackRendered.isTeacher) {
43-
feedbackRendered.teacherFeedbackEnabled = true;
44-
}
4542

4643
this.body = this.render('feedback/show');
4744

handlers/courses/lib/renderFeedback.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function* renderFeedback(courseFeedback, user) {
3838
}
3939
}
4040

41-
var isTeacher = user && (user.isAdmin || user._id.equals(courseFeedback.group.teacher._id));
41+
var isTeacherOrAdmin = user && (user.isAdmin || user._id.equals(courseFeedback.group.teacher._id));
4242

4343
var rendered = {
4444
photo: courseFeedback.photo || courseFeedback.participant.user.getPhotoUrl(),
@@ -63,12 +63,12 @@ function* renderFeedback(courseFeedback, user) {
6363
name: courseFeedback.group.teacher.displayName
6464
},
6565
content: renderSimpledown(courseFeedback.content, {trusted: false}),
66-
isTeacher: isTeacher,
66+
isTeacherOrAdmin: isTeacherOrAdmin,
6767
isPublic: courseFeedback.isPublic,
6868
number: courseFeedback.number,
6969
teacherComment: courseFeedback.teacherComment ? renderSimpledown(courseFeedback.teacherComment, {trusted: false}) : '',
70-
teacherCommentRaw: isTeacher ? (courseFeedback.teacherComment || '') : '',
71-
editLink: authorOrAdmin ? `/courses/groups/${courseFeedback.group.slug}/feedback` : null,
70+
teacherCommentRaw: isTeacherOrAdmin ? (courseFeedback.teacherComment || '') : '',
71+
editLink: authorOrAdmin ? `/courses/feedback/edit/${courseFeedback.number}` : null,
7272
link: `/courses/feedback/${courseFeedback.number}`
7373
};
7474

handlers/courses/router.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,13 @@ router.post('/groups/:groupBySlug/materials', mustBeTeacher, require('./controll
3535
// because the prefix /course/download must be constant for nginx to proxy *.zip to node
3636
router.get('/download/:groupBySlug/:filename', mustBeParticipantOrTeacher, require('./controller/groupMaterialsDownload').get);
3737

38-
router.all('/groups/:groupBySlug/feedback', mustBeParticipant, require('./controller/groupFeedbackEdit').all);
38+
router.all('/groups/:groupBySlug/feedback', require('./controller/groupFeedbackEdit').all);
39+
router.all('/feedback/edit/:feedbackNumber(\\d+)', require('./controller/groupFeedbackEdit').all);
3940

4041
router.get('/:course/feedback', require('./controller/courseFeedback').get);
4142

4243
router.patch('/feedback/comment', mustBeAuthenticated, require('./controller/groupFeedbackComment').patch);
43-
router.get('/feedback/:feedbackNumber', require('./controller/groupFeedbackShow').get);
44+
router.get('/feedback/:feedbackNumber(\\d+)', require('./controller/groupFeedbackShow').get);
4445

4546
router.patch('/participants', require('./controller/participants').patch);
4647
router.get('/download/participant/:participantId/certificate.jpg', mustBeAuthenticated, require('./controller/participantCertificateDownload').get);

handlers/courses/templates/feedback/_item.jade

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
| , 
1515
= courseFeedback.city
1616

17-
+e('a')(href=courseFeedback.link).date= moment(courseFeedback.created).format('D MMM YYYY')
17+
+e('a')(href=courseFeedback.link).date #{moment(courseFeedback.created).format('D MMM YYYY')} #
1818

1919
if courseFeedback.aboutLink
2020
+e('span').homepage
@@ -35,19 +35,19 @@
3535
+e('a').course-link(href=courseFeedback.course.link)= courseFeedback.course.titleShort
3636
= '"'
3737

38-
+e.info
38+
+e.teacher
3939
| Преподаватель:
4040
= ' '
4141
+e('a').teacher-link(href=courseFeedback.teacher.link)
4242
= courseFeedback.teacher.name
43-
if courseFeedback.teacherFeedbackEnabled
43+
if courseFeedback.isTeacherOrAdmin
4444
= ' '
4545
+e('button').add-comment(data-action-coursefeedback-comment-add style="display:#{courseFeedback.teacherComment ? 'none' : ''}")
4646

4747
if courseFeedback.teacherComment
4848
+e.teacher-comment
4949
+e!= courseFeedback.teacherComment
50-
if courseFeedback.teacherFeedbackEnabled
50+
if courseFeedback.isTeacherOrAdmin
5151
script(type="text/comment" data-coursefeedback-comment-raw)= courseFeedback.teacherCommentRaw
5252
+e('a').edit(href='#' data-action-coursefeedback-comment-edit) редактировать
5353

0 commit comments

Comments
 (0)