diff options
| author | MeiMei <30769358+mei23@users.noreply.github.com> | 2019-03-07 21:19:32 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2019-03-07 21:19:32 +0900 |
| commit | 7325d66c52365104b6b5d6343324a258470ad2a8 (patch) | |
| tree | 2e34ad9e592d64ab1a672877b33d384bc67e3d90 /src/services | |
| parent | Update README.md [AUTOGEN] (#4441) (diff) | |
| download | misskey-7325d66c52365104b6b5d6343324a258470ad2a8.tar.gz misskey-7325d66c52365104b6b5d6343324a258470ad2a8.tar.bz2 misskey-7325d66c52365104b6b5d6343324a258470ad2a8.zip | |
Implement Update Question (#4435)
* Update remote votes count
* save updatedAt
* deliver Update
* use renderNote
* use id
* fix typeof
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/note/polls/update.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/services/note/polls/update.ts b/src/services/note/polls/update.ts new file mode 100644 index 0000000000..d4e183889d --- /dev/null +++ b/src/services/note/polls/update.ts @@ -0,0 +1,61 @@ +import * as mongo from 'mongodb'; +import Note, { INote } from '../../../models/note'; +import { updateQuestion } from '../../../remote/activitypub/models/question'; +import ms = require('ms'); +import Logger from '../../logger'; +import User, { isLocalUser, isRemoteUser } from '../../../models/user'; +import Following from '../../../models/following'; +import renderUpdate from '../../../remote/activitypub/renderer/update'; +import { renderActivity } from '../../../remote/activitypub/renderer'; +import { deliver } from '../../../queue'; +import renderNote from '../../../remote/activitypub/renderer/note'; + +const logger = new Logger('pollsUpdate'); + +export async function triggerUpdate(note: INote) { + if (!note.updatedAt || Date.now() - new Date(note.updatedAt).getTime() > ms('1min')) { + logger.info(`Updating ${note._id}`); + + try { + const updated = await updateQuestion(note.uri); + logger.info(`Updated ${note._id} ${updated ? 'changed' : 'nochange'}`); + } catch (e) { + logger.error(e); + } + } +} + +export async function deliverQuestionUpdate(noteId: mongo.ObjectID) { + const note = await Note.findOne({ + _id: noteId, + }); + + const user = await User.findOne({ + _id: note.userId + }); + + const followers = await Following.find({ + followeeId: user._id + }); + + const queue: string[] = []; + + // フォロワーがリモートユーザーかつ投稿者がローカルユーザーならUpdateを配信 + if (isLocalUser(user)) { + for (const following of followers) { + const follower = following._follower; + + if (isRemoteUser(follower)) { + const inbox = follower.sharedInbox || follower.inbox; + if (!queue.includes(inbox)) queue.push(inbox); + } + } + + if (queue.length > 0) { + const content = renderActivity(renderUpdate(await renderNote(note, false), user)); + for (const inbox of queue) { + deliver(user, content, inbox); + } + } + } +} |