summaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2019-03-07 21:19:32 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2019-03-07 21:19:32 +0900
commit7325d66c52365104b6b5d6343324a258470ad2a8 (patch)
tree2e34ad9e592d64ab1a672877b33d384bc67e3d90 /src/services
parentUpdate README.md [AUTOGEN] (#4441) (diff)
downloadmisskey-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.ts61
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);
+ }
+ }
+ }
+}