diff --git a/src/api/common/watch-post.ts b/src/api/common/watch-post.ts new file mode 100644 index 000000000..9f5e7a913 --- /dev/null +++ b/src/api/common/watch-post.ts @@ -0,0 +1,21 @@ +import * as mongodb from 'mongodb'; +import Watching from '../models/post-watching'; + +export default async (me: mongodb.ObjectID, post: mongodb.ObjectID) => { + // if watching now + const exist = await Watching.findOne({ + post_id: post, + user_id: me, + deleted_at: { $exists: false } + }); + + if (exist !== null) { + return; + } + + await Watching.insert({ + created_at: new Date(), + post_id: post, + user_id: me + }); +}; diff --git a/src/api/endpoints/posts/polls/vote.ts b/src/api/endpoints/posts/polls/vote.ts index d359d7d2c..7bd9119fc 100644 --- a/src/api/endpoints/posts/polls/vote.ts +++ b/src/api/endpoints/posts/polls/vote.ts @@ -4,7 +4,9 @@ import $ from 'cafy'; import Vote from '../../../models/poll-vote'; import Post from '../../../models/post'; +import Watching from '../../../models/post-watching'; import notify from '../../../common/notify'; +import watch from '../../../common/watch-post'; import { publishPostStream } from '../../../event'; /** @@ -75,6 +77,32 @@ module.exports = (params, user) => new Promise(async (res, rej) => { post_id: post._id, choice: choice }); + + // Fetch watchers + Watching + .find({ + post_id: post._id, + user_id: { $ne: user._id }, + // 削除されたドキュメントは除く + deleted_at: { $exists: false } + }, { + fields: { + user_id: true + } + }) + .then(watchers => { + watchers.forEach(watcher => { + notify(watcher.user_id, user._id, 'poll_vote', { + post_id: post._id, + choice: choice + }); + }); + }); + + // この投稿をWatchする + // TODO: ユーザーが「投票したときに自動でWatchする」設定を + // オフにしていた場合はしない + watch(user._id, post._id); }); function findWithAttr(array, attr, value) { diff --git a/src/api/endpoints/posts/reactions/create.ts b/src/api/endpoints/posts/reactions/create.ts index ba5b69ada..7cae3830e 100644 --- a/src/api/endpoints/posts/reactions/create.ts +++ b/src/api/endpoints/posts/reactions/create.ts @@ -4,7 +4,9 @@ import $ from 'cafy'; import Reaction from '../../../models/post-reaction'; import Post from '../../../models/post'; +import Watching from '../../../models/post-watching'; import notify from '../../../common/notify'; +import watch from '../../../common/watch-post'; import { publishPostStream } from '../../../event'; /** @@ -84,4 +86,30 @@ module.exports = (params, user) => new Promise(async (res, rej) => { post_id: post._id, reaction: reaction }); + + // Fetch watchers + Watching + .find({ + post_id: post._id, + user_id: { $ne: user._id }, + // 削除されたドキュメントは除く + deleted_at: { $exists: false } + }, { + fields: { + user_id: true + } + }) + .then(watchers => { + watchers.forEach(watcher => { + notify(watcher.user_id, user._id, 'reaction', { + post_id: post._id, + reaction: reaction + }); + }); + }); + + // この投稿をWatchする + // TODO: ユーザーが「リアクションしたときに自動でWatchする」設定を + // オフにしていた場合はしない + watch(user._id, post._id); }); diff --git a/src/api/models/post-watching.ts b/src/api/models/post-watching.ts new file mode 100644 index 000000000..41d37e270 --- /dev/null +++ b/src/api/models/post-watching.ts @@ -0,0 +1,3 @@ +import db from '../../db/mongodb'; + +export default db.get('post_watching') as any; // fuck type definition