Skip to content

Commit 56e5d29

Browse files
lqs469JacksonTian
authored andcommitted
Test: User controller (#51)
* refactor: user page when no signin * refactor: user page with data * refactor: user page(collectTopics, topics, replies) * refactor: middleware errorPage * refactor: user page when no signin * refactor: replace lodash function * fix: use lodash sortBy * refactor: move avatar_hostname to default.config * refactor: inject helper in middleware ctx.locals * refactor: setting page with session user data * refactor: user setting post * fix: setting post failure * refactor: set auth cookies * refactor: admin(toggleStar, blockUser, deleteAllReply) * fix: admin_user_name * test: user contorller UT 1/2 * refactor: middleware errorPage * refactor: move avatar_hostname to default.config * refactor: inject helper in middleware ctx.locals * refactor: setting page with session user data * fix: setting post failure * refactor: set auth cookies * refactor: admin(toggleStar, blockUser, deleteAllReply) * fix: admin_user_name * refactor: user page when no signin * refactor: middleware errorPage * refactor: use ctx.user * refactor: template helper * refactor: await save() * refactor: save at ctx.session.is_admin test: user controller * test: user controller delete_all * test: user controller completed
1 parent 73f1711 commit 56e5d29

File tree

15 files changed

+185
-255
lines changed

15 files changed

+185
-255
lines changed

app.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,4 @@ module.exports = app => {
8080
}
8181
return existUser;
8282
});
83-
84-
app.passport.serializeUser(async (ctx, user) => {
85-
// 默认会注入session.passport.user, 为方便使用改为session.user (?)
86-
ctx.session.user = user;
87-
return user;
88-
});
8983
};

app/controller/user.js

Lines changed: 13 additions & 185 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class UserController extends Controller {
4646

4747
// 如果用户没有激活,那么管理员可以帮忙激活
4848
let token = '';
49-
if (!user.active && ctx.session.user && ctx.session.user.is_admin) {
49+
if (!user.active && ctx.user && ctx.user.is_admin) {
5050
token = utility.md5(user.email + user.pass + config.session_secret);
5151
}
5252

@@ -180,7 +180,7 @@ class UserController extends Controller {
180180

181181
async showSetting() {
182182
const { ctx, service } = this;
183-
const id = ctx.session.user._id;
183+
const id = ctx.user._id;
184184
const user = await service.user.getUserById(id);
185185

186186
if (!user) {
@@ -226,14 +226,14 @@ class UserController extends Controller {
226226
const weibo = validator.trim(body.weibo);
227227
const signature = validator.trim(body.signature);
228228

229-
const user = await service.user.getUserById(ctx.session.user._id);
229+
const user = await service.user.getUserById(ctx.user._id);
230230
user.url = url;
231231
user.location = location;
232232
user.signature = signature;
233233
user.weibo = weibo;
234-
user.save();
234+
await user.save();
235235

236-
ctx.session.user = user.toObject({ virtual: true });
236+
ctx.user = user.toObject({ virtual: true });
237237
return ctx.redirect('/setting?save=success');
238238
}
239239

@@ -244,15 +244,15 @@ class UserController extends Controller {
244244
return showMessage('旧密码或新密码不得为空');
245245
}
246246

247-
const user = await service.user.getUserById(ctx.session.user._id);
247+
const user = await service.user.getUserById(ctx.user._id);
248248
const equal = tools.bcompare(oldPass, user.pass);
249249
if (!equal) {
250250
return showMessage('当前密码不正确。', user);
251251
}
252252

253253
const newPassHash = tools.bhash(newPass);
254254
user.pass = newPassHash;
255-
user.save();
255+
await user.save();
256256
return showMessage('密码已被修改。', user, true);
257257
}
258258
}
@@ -269,7 +269,7 @@ class UserController extends Controller {
269269
return;
270270
}
271271
user.is_star = !user.is_star;
272-
user.save();
272+
await user.save();
273273

274274
ctx.body = { status: 'success' };
275275
}
@@ -288,11 +288,11 @@ class UserController extends Controller {
288288

289289
if (action === 'set_block') {
290290
user.is_block = true;
291-
user.save();
291+
await user.save();
292292
ctx.body = { status: 'success' };
293293
} else if (action === 'cancel_block') {
294294
user.is_block = false;
295-
user.save();
295+
await user.save();
296296
ctx.body = { status: 'success' };
297297
}
298298
}
@@ -310,185 +310,13 @@ class UserController extends Controller {
310310
}
311311

312312
// 删除主题
313-
ctx.model.Topic.update({ author_id: user._id }, { $set: { deleted: true } }, { multi: true });
313+
await ctx.model.Topic.update({ author_id: user._id }, { $set: { deleted: true } }, { multi: true });
314314
// 删除评论
315-
ctx.model.Reply.update({ author_id: user._id }, { $set: { deleted: true } }, { multi: true });
315+
await ctx.model.Reply.update({ author_id: user._id }, { $set: { deleted: true } }, { multi: true });
316316
// 点赞数也全部干掉
317-
ctx.model.Reply.update({}, { $pull: { ups: user._id } }, { multi: true });
317+
await ctx.model.Reply.update({}, { $pull: { ups: user._id } }, { multi: true });
318318
ctx.body = { status: 'success' };
319319
}
320320
}
321321

322-
// var User = require('../proxy').User;
323-
// var Topic = require('../proxy').Topic;
324-
// var Reply = require('../proxy').Reply;
325-
// var TopicCollect = require('../proxy').TopicCollect;
326-
// var utility = require('utility');
327-
// var util = require('util');
328-
// var TopicModel = require('../models').Topic;
329-
// var ReplyModel = require('../models').Reply;
330-
// var tools = require('../common/tools');
331-
// var config = require('../config');
332-
// var EventProxy = require('eventproxy');
333-
// var validator = require('validator');
334-
// var _ = require('lodash');
335-
336-
337-
// exports.showSetting = function (req, res, next) {
338-
// User.getUserById(req.session.user._id, function (err, user) {
339-
// if (err) {
340-
// return next(err);
341-
// }
342-
// if (req.query.save === 'success') {
343-
// user.success = '保存成功。';
344-
// }
345-
// user.error = null;
346-
// return res.render('user/setting', user);
347-
// });
348-
// };
349-
350-
// exports.setting = function (req, res, next) {
351-
// var ep = new EventProxy();
352-
// ep.fail(next);
353-
354-
// // 显示出错或成功信息
355-
// function showMessage(msg, data, isSuccess) {
356-
// data = data || req.body;
357-
// var data2 = {
358-
// loginname: data.loginname,
359-
// email: data.email,
360-
// url: data.url,
361-
// location: data.location,
362-
// signature: data.signature,
363-
// weibo: data.weibo,
364-
// accessToken: data.accessToken,
365-
// };
366-
// if (isSuccess) {
367-
// data2.success = msg;
368-
// } else {
369-
// data2.error = msg;
370-
// }
371-
// res.render('user/setting', data2);
372-
// }
373-
374-
// // post
375-
// var action = req.body.action;
376-
// if (action === 'change_setting') {
377-
// var url = validator.trim(req.body.url);
378-
// var location = validator.trim(req.body.location);
379-
// var weibo = validator.trim(req.body.weibo);
380-
// var signature = validator.trim(req.body.signature);
381-
382-
// User.getUserById(req.session.user._id, ep.done(function (user) {
383-
// user.url = url;
384-
// user.location = location;
385-
// user.signature = signature;
386-
// user.weibo = weibo;
387-
// user.save(function (err) {
388-
// if (err) {
389-
// return next(err);
390-
// }
391-
// req.session.user = user.toObject({virtual: true});
392-
// return res.redirect('/setting?save=success');
393-
// });
394-
// }));
395-
// }
396-
// if (action === 'change_password') {
397-
// var old_pass = validator.trim(req.body.old_pass);
398-
// var new_pass = validator.trim(req.body.new_pass);
399-
// if (!old_pass || !new_pass) {
400-
// return res.send('旧密码或新密码不得为空');
401-
// }
402-
403-
// User.getUserById(req.session.user._id, ep.done(function (user) {
404-
// tools.bcompare(old_pass, user.pass, ep.done(function (bool) {
405-
// if (!bool) {
406-
// return showMessage('当前密码不正确。', user);
407-
// }
408-
409-
// tools.bhash(new_pass, ep.done(function (passhash) {
410-
// user.pass = passhash;
411-
// user.save(function (err) {
412-
// if (err) {
413-
// return next(err);
414-
// }
415-
// return showMessage('密码已被修改。', user, true);
416-
417-
// });
418-
// }));
419-
// }));
420-
// }));
421-
// }
422-
423-
// exports.toggleStar = function (req, res, next) {
424-
// var user_id = req.body.user_id;
425-
// User.getUserById(user_id, function (err, user) {
426-
// if (err) {
427-
// return next(err);
428-
// }
429-
// if (!user) {
430-
// return next(new Error('user is not exists'));
431-
// }
432-
// user.is_star = !user.is_star;
433-
// user.save(function (err) {
434-
// if (err) {
435-
// return next(err);
436-
// }
437-
// res.json({ status: 'success' });
438-
// });
439-
// });
440-
// }
441-
442-
// exports.block = function (req, res, next) {
443-
// var loginname = req.params.name;
444-
// var action = req.body.action;
445-
446-
// var ep = EventProxy.create();
447-
// ep.fail(next);
448-
449-
// User.getUserByLoginName(loginname, ep.done(function (user) {
450-
// if (!user) {
451-
// return next(new Error('user is not exists'));
452-
// }
453-
// if (action === 'set_block') {
454-
// ep.all('block_user',
455-
// function (user) {
456-
// res.json({status: 'success'});
457-
// });
458-
// user.is_block = true;
459-
// user.save(ep.done('block_user'));
460-
461-
// } else if (action === 'cancel_block') {
462-
// user.is_block = false;
463-
// user.save(ep.done(function () {
464-
465-
// res.json({status: 'success'});
466-
// }));
467-
// }
468-
// }));
469-
// };
470-
471-
// exports.deleteAll = function (req, res, next) {
472-
// var loginname = req.params.name;
473-
474-
// var ep = EventProxy.create();
475-
// ep.fail(next);
476-
477-
// User.getUserByLoginName(loginname, ep.done(function (user) {
478-
// if (!user) {
479-
// return next(new Error('user is not exists'));
480-
// }
481-
// ep.all('del_topics', 'del_replys', 'del_ups',
482-
// function () {
483-
// res.json({status: 'success'});
484-
// });
485-
// // 删除主题
486-
// TopicModel.update({author_id: user._id}, {$set: {deleted: true}}, {multi: true}, ep.done('del_topics'));
487-
// // 删除评论
488-
// ReplyModel.update({author_id: user._id}, {$set: {deleted: true}}, {multi: true}, ep.done('del_replys'));
489-
// // 点赞数也全部干掉
490-
// ReplyModel.update({}, {$pull: {'ups': user._id}}, {multi: true}, ep.done('del_ups'));
491-
// }));
492-
// };
493-
494322
module.exports = UserController;

app/middleware/admin_required.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ module.exports = () => {
66
*/
77

88
return async function(ctx, next) {
9-
if (!ctx.session.user) {
9+
if (!ctx.user) {
1010
await ctx.render('notify/notify', { error: '你还没有登录。' });
1111
return;
1212
}
1313

14-
if (!ctx.session.user.is_admin) {
14+
if (!ctx.session.is_admin) {
1515
await ctx.render('notify/notify', { error: '需要管理员权限。' });
1616
return;
1717
}

app/middleware/auth_user.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ module.exports = () => {
77
ctx.locals.current_user = null;
88
if (ctx.app.config.debug && ctx.cookies.get('mock_user')) {
99
const mockUser = JSON.parse(ctx.cookies.get('mock_user'));
10-
ctx.session.user = new ctx.model.User(mockUser);
10+
ctx.user = new ctx.model.User(mockUser);
1111
if (mockUser.is_admin) {
12-
ctx.session.user.is_admin = true;
12+
ctx.user.is_admin = true;
1313
}
1414
return await next();
1515
}
1616

17-
let { user } = ctx.session;
17+
let { user } = ctx;
1818
if (user) {
1919
const auth_token = ctx.cookies.get(ctx.app.config.auth_cookie_name, {
2020
signed: true,
@@ -39,8 +39,9 @@ module.exports = () => {
3939

4040
const count = await ctx.service.message.getMessagesCount(user._id);
4141
user.messages_count = count;
42-
ctx.session.user = user;
4342
ctx.locals.current_user = user;
43+
// 这里需要设置is_admin, 因为ctx.user为只读, 所以使用ctx.session.is_admin
44+
ctx.session.is_admin = user.is_admin;
4445
await next();
4546
};
4647
};

app/middleware/locals.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict';
22

33
const Loader = require('loader');
4-
const helper = require('../extend/helper');
54

65
module.exports = (options, app) => {
76
// assets
@@ -25,7 +24,6 @@ module.exports = (options, app) => {
2524
ctx.locals.Loader = Loader;
2625
ctx.locals.assets = assets;
2726
ctx.locals.csrf = ctx.csrf;
28-
ctx.locals = Object.assign({}, ctx.locals, helper);
2927
await next();
3028
};
3129
};

app/middleware/user_required.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ module.exports = () => {
66
* 需要登录
77
*/
88
return async function(ctx, next) {
9-
const { session } = ctx;
10-
if (!session || !session.user || !session.user._id) {
9+
if (!ctx.user || !ctx.user._id) {
1110
ctx.status = 403;
1211
ctx.body = 'forbidden!';
1312
return;

app/view/notify/notify.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<%- include ../sidebar.html %>
1+
<%- include('../sidebar.html') %>
22

33
<div id='content'>
44
<div class='panel'>

app/view/user/card.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<div class='user_card'>
44
<div>
55
<a class='user_avatar' href="/user/<%= user.loginname %>">
6-
<img src="<%= proxy(user.avatar_url) %>" title="<%= user.loginname %>"/>
6+
<img src="<%= helper.proxy(user.avatar_url) %>" title="<%= user.loginname %>"/>
77
</a>
88
<span class='user_name'><a class='dark' href="/user/<%= user.loginname %>"><%= user.loginname %></a></span>
99

@@ -16,7 +16,7 @@
1616
<span class="signature">
1717
1818
<% if (user.signature) {%>
19-
<%-escapeSignature(user.signature)%>
19+
<%-helper.escapeSignature(user.signature)%>
2020
<%} else {%>
2121
这家伙很懒,什么个性签名都没有留下。
2222
<%}%>
@@ -53,4 +53,4 @@
5353
});
5454
});
5555
</script>
56-
<% } %>
56+
<% } %>

app/view/user/collect_topics.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@
1010
</div>
1111
<div class='inner no-padding'>
1212
<% if (topics.length > 0) { %>
13-
<%- include('../topic/list.html', { topics: topics, pages: pages, current_pages: current_page, base: '/user/' +
14-
user.loginname + '/collections' }) %>
13+
<%- include('../topic/list.html', {
14+
topics,
15+
pages,
16+
current_pages,
17+
base: `/user/${user.loginname}/collections`
18+
}) %>
1519
<% } else { %>
1620
<p>找不到话题 (T_T)</p>
1721
<% } %>

0 commit comments

Comments
 (0)