This commit is contained in:
syuilo 2018-10-30 21:55:16 +09:00
parent 420848f16c
commit 43db18ee44
2 changed files with 26 additions and 6 deletions

View file

@ -611,19 +611,21 @@ function incNotesCount(user: IUser) {
async function extractMentionedUsers(tokens: ReturnType<typeof parse>): Promise<IUser[]> { async function extractMentionedUsers(tokens: ReturnType<typeof parse>): Promise<IUser[]> {
if (tokens == null) return []; if (tokens == null) return [];
const mentionTokens = unique( const mentionTokens = tokens
tokens .filter(t => t.type == 'mention') as TextElementMention[];
.filter(t => t.type == 'mention') as TextElementMention[]
);
const mentionedUsers = unique( let mentionedUsers =
erase(null, await Promise.all(mentionTokens.map(async m => { erase(null, await Promise.all(mentionTokens.map(async m => {
try { try {
return await resolveUser(m.username, m.host); return await resolveUser(m.username, m.host);
} catch (e) { } catch (e) {
return null; return null;
} }
}))) })));
// Drop duplicate users
mentionedUsers = mentionedUsers.filter((u, i, self) =>
i === self.findIndex(u2 => u._id.equals(u2._id))
); );
return mentionedUsers; return mentionedUsers;

View file

@ -508,6 +508,24 @@ describe('API', () => {
}, me); }, me);
expect(res).have.status(400); expect(res).have.status(400);
})); }));
it('同じユーザーに複数メンションしても内部的にまとめられる', async(async () => {
const alice = await signup({ username: 'alice' });
const bob = await signup({ username: 'bob' });
const post = {
text: '@bob @bob @bob yo'
};
const res = await request('/notes/create', post, alice);
expect(res).have.status(200);
expect(res.body).be.a('object');
expect(res.body).have.property('createdNote');
expect(res.body.createdNote).have.property('text').eql(post.text);
const noteDoc = await db.get('notes').findOne({ _id: res.body.createdNote.id });
expect(noteDoc.mentions.map((id: any) => id.toString())).eql([bob.id.toString()]);
}));
}); });
describe('notes/show', () => { describe('notes/show', () => {