Skip to content

Commit 3169ec2

Browse files
sinchangJacksonTian
authored andcommitted
feat: add message api (#126)
1 parent 54cd499 commit 3169ec2

File tree

3 files changed

+147
-2
lines changed

3 files changed

+147
-2
lines changed

app/controller/api/message.js

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
'use strict';
2+
3+
const Controller = require('egg').Controller;
4+
5+
class MessageController extends Controller {
6+
async count() {
7+
const { ctx } = this;
8+
const userId = ctx.request.user._id;
9+
const count = await ctx.service.message.getMessagesCount(userId);
10+
ctx.body = { count };
11+
}
12+
13+
async markAll() {
14+
const { ctx } = this;
15+
const userId = ctx.request.user._id;
16+
const messages = await ctx.service.message.getUnreadMessagesByUserId(userId);
17+
const result = await ctx.service.message.updateMessagesToRead(userId, messages);
18+
ctx.body = {
19+
success: true,
20+
marked_msgs: result ? messages.map(message => { return { id: message._id }; }) : [],
21+
};
22+
}
23+
24+
async markOne() {
25+
const { ctx } = this;
26+
const messageId = ctx.params.msg_id;
27+
await ctx.service.message.updateOneMessageToRead(messageId);
28+
29+
ctx.body = {
30+
success: true,
31+
marked_msg_id: messageId,
32+
};
33+
}
34+
35+
async list() {
36+
const { ctx } = this;
37+
const userId = ctx.request.user._id;
38+
const msgService = ctx.service.message;
39+
const mdrender = ctx.request.query.mdrender !== 'false';
40+
const messages = await Promise.all([
41+
msgService.getReadMessagesByUserId(userId),
42+
msgService.getUnreadMessagesByUserId(userId),
43+
]);
44+
45+
let hasReadMessages = await Promise.all(messages[0].map(async message => await msgService.getMessageRelations(message)));
46+
let hasUnReadMessages = await Promise.all(messages[1].map(async message => await msgService.getMessageRelations(message)));
47+
48+
const formatMessage = message => {
49+
return {
50+
id: message._id,
51+
type: message.type,
52+
has_read: message.has_read,
53+
create_at: message.create_at,
54+
author: {
55+
loginname: message.author.loginname,
56+
avatar_url: message.author.avatar_url,
57+
},
58+
topic: {
59+
id: message.topic.topic._id,
60+
title: message.topic.topic.title,
61+
last_reply_at: message.topic.topic.last_reply_at,
62+
},
63+
reply: message.reply ? {
64+
content: mdrender ? ctx.helper.markdown(message.reply.content) : message.reply.content,
65+
} : {},
66+
};
67+
};
68+
69+
hasReadMessages = hasReadMessages.map(message => formatMessage(message));
70+
hasUnReadMessages = hasUnReadMessages.map(message => formatMessage(message));
71+
72+
ctx.body = {
73+
success: true,
74+
data: {
75+
has_read_messages: hasReadMessages,
76+
hasnot_read_messages: hasUnReadMessages,
77+
},
78+
};
79+
}
80+
}
81+
82+
module.exports = MessageController;

app/router/api.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
module.exports = app => {
77
const { router, controller, middleware } = app;
88

9-
const { user } = controller.api;
9+
const { user, message } = controller.api;
1010

1111
const tokenRequired = middleware.tokenRequired();
12-
// const adminRequired = middleware.adminRequired();
1312
// const createTopicLimit = middleware.createTopicLimit(config.topic);
1413
// const createUserLimit = middleware.createUserLimit(config.create_user_per_ip);
1514

15+
// 用户
1616
router.get('/api/v1/user/:loginname', user.show);
1717
router.post('/api/v1/accesstoken', tokenRequired, user.verify);
18+
19+
// 消息通知
20+
router.get('/api/v1/message/count', tokenRequired, message.count);
21+
router.get('/api/v1/messages', tokenRequired, message.list);
22+
router.post('/api/v1/message/mark_all', tokenRequired, message.markAll);
23+
router.post('/api/v1/message/mark_one/:msg_id', tokenRequired, message.markOne);
1824
};
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
'use strict';
2+
3+
const { app, assert } = require('egg-mock/bootstrap');
4+
5+
describe('test/app/controller/api/message.test.js', () => {
6+
let user1,
7+
user2,
8+
token,
9+
messageId,
10+
topicId;
11+
12+
before(async function() {
13+
const ctx = app.mockContext();
14+
const loginname1 = `loginname1_${Date.now()}`;
15+
const loginname2 = `loginname2_${Date.now()}`;
16+
const email1 = `${loginname1}@test.com`;
17+
const email2 = `${loginname2}@test.com`;
18+
user1 = await ctx.service.user.newAndSave('name', loginname1, 'pass', email1, 'avatar_url', 'active');
19+
user2 = await ctx.service.user.newAndSave('name', loginname2, 'pass', email2, 'avatar_url', 'active');
20+
token = user2.accessToken;
21+
assert(user1.loginname === loginname1);
22+
assert(user2.loginname === loginname2);
23+
24+
const title = 'first post';
25+
const content = 'hello world';
26+
const tab = 'share';
27+
const topic = await ctx.service.topic.newAndSave(title, content, tab, user1._id);
28+
topicId = topic._id;
29+
assert(topic.title === title);
30+
assert(topic.content === content);
31+
assert(topic.tab === tab);
32+
assert.equal(topic.author_id, user1._id);
33+
34+
const message = await ctx.service.message.sendAtMessage(user2._id, user1._id, topicId);
35+
messageId = message._id;
36+
});
37+
38+
it('get /message/count should ok', async () => {
39+
const result = await app.httpRequest().get(`/api/v1/message/count?accesstoken=${token}`);
40+
assert(result.body.count >= 1);
41+
});
42+
43+
it('get /messages should ok', async () => {
44+
const result = await app.httpRequest().get(`/api/v1/messages?accesstoken=${token}`);
45+
assert(result.body.data.hasnot_read_messages.length >= 1);
46+
});
47+
48+
it('post /message/mark_all should ok', async () => {
49+
const result = await app.httpRequest().post(`/api/v1/message/mark_all?accesstoken=${token}`);
50+
assert(result.body.marked_msgs.length >= 1);
51+
});
52+
53+
it('post message/mark_one/:msg_id should ok', async () => {
54+
const result = await app.httpRequest().post(`/api/v1/message/mark_one/${messageId}?accesstoken=${token}`);
55+
assert.equal(result.body.marked_msg_id, messageId);
56+
});
57+
});

0 commit comments

Comments
 (0)