From d9f0e158a35eec183da77e84a3b038fab645bf62 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 19 Sep 2018 14:18:34 +0900 Subject: Implement #2736 --- src/services/note/unread.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/services/note/unread.ts (limited to 'src/services/note/unread.ts') diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts new file mode 100644 index 0000000000..6e10c8b248 --- /dev/null +++ b/src/services/note/unread.ts @@ -0,0 +1,47 @@ +import NoteUnread from '../../models/note-unread'; +import User, { IUser } from '../../models/user'; +import { INote } from '../../models/note'; +import Mute from '../../models/mute'; +import { publishUserStream } from '../../stream'; + +export default async function(user: IUser, note: INote, isSpecified = false) { + const unread = await NoteUnread.insert({ + noteId: note._id, + userId: user._id, + isSpecified, + _note: { + userId: note.userId + } + }); + + // 3秒経っても既読にならなかったら「未読の投稿がありますよ」イベントを発行する + setTimeout(async () => { + const exist = await NoteUnread.findOne({ _id: unread._id }); + if (exist == null) return; + + //#region ただしミュートされているなら発行しない + const mute = await Mute.find({ + muterId: user._id + }); + const mutedUserIds = mute.map(m => m.muteeId.toString()); + if (mutedUserIds.includes(note.userId.toString())) return; + //#endregion + + User.update({ + _id: user._id + }, { + $set: isSpecified ? { + hasUnreadSpecifiedNotes: true, + hasUnreadMentions: true + } : { + hasUnreadMentions: true + } + }); + + publishUserStream(user._id, 'unreadMention', note._id); + + if (isSpecified) { + publishUserStream(user._id, 'unreadSpecifiedNote', note._id); + } + }, 3000); +} -- cgit v1.2.3-freya