From 6d07ce46dc69a6a88e40277cc7617096bce4a40e Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Tue, 3 Apr 2018 17:50:52 +0900 Subject: [PATCH] Implement Delete activity --- src/processor/db/delete-post-dependents.ts | 22 ++++++++++++++++++++ src/processor/db/index.ts | 7 +++++++ src/processor/index.ts | 23 +++++++++++++-------- src/remote/activitypub/act/delete/index.ts | 24 ++++++++++++++++++++++ src/remote/activitypub/act/delete/post.ts | 10 +++++++++ src/remote/activitypub/act/index.ts | 4 ++++ 6 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 src/processor/db/delete-post-dependents.ts create mode 100644 src/processor/db/index.ts create mode 100644 src/remote/activitypub/act/delete/index.ts create mode 100644 src/remote/activitypub/act/delete/post.ts diff --git a/src/processor/db/delete-post-dependents.ts b/src/processor/db/delete-post-dependents.ts new file mode 100644 index 000000000..879c41ec9 --- /dev/null +++ b/src/processor/db/delete-post-dependents.ts @@ -0,0 +1,22 @@ +import Favorite from '../../models/favorite'; +import Notification from '../../models/notification'; +import PollVote from '../../models/poll-vote'; +import PostReaction from '../../models/post-reaction'; +import PostWatching from '../../models/post-watching'; +import Post from '../../models/post'; + +export default async ({ data }) => Promise.all([ + Favorite.remove({ postId: data._id }), + Notification.remove({ postId: data._id }), + PollVote.remove({ postId: data._id }), + PostReaction.remove({ postId: data._id }), + PostWatching.remove({ postId: data._id }), + Post.find({ repostId: data._id }).then(reposts => Promise.all([ + Notification.remove({ + postId: { + $in: reposts.map(({ _id }) => _id) + } + }), + Post.remove({ repostId: data._id }) + ])) +]); diff --git a/src/processor/db/index.ts b/src/processor/db/index.ts new file mode 100644 index 000000000..75838c099 --- /dev/null +++ b/src/processor/db/index.ts @@ -0,0 +1,7 @@ +import deletePostDependents from './delete-post-dependents'; + +const handlers = { + deletePostDependents +}; + +export default (job, done) => handlers[job.data.type](job).then(() => done(), done); diff --git a/src/processor/index.ts b/src/processor/index.ts index cd271d372..172048dda 100644 --- a/src/processor/index.ts +++ b/src/processor/index.ts @@ -1,13 +1,18 @@ import queue from '../queue'; +import db from './db'; import http from './http'; -/* - 256 is the default concurrency limit of Mozilla Firefox and Google - Chromium. +export default () => { + queue.process('db', db); - a8af215e691f3a2205a3758d2d96e9d328e100ff - chromium/src.git - Git at Google - https://chromium.googlesource.com/chromium/src.git/+/a8af215e691f3a2205a3758d2d96e9d328e100ff - Network.http.max-connections - MozillaZine Knowledge Base - http://kb.mozillazine.org/Network.http.max-connections -*/ -export default () => queue.process('http', 256, http); + /* + 256 is the default concurrency limit of Mozilla Firefox and Google + Chromium. + + a8af215e691f3a2205a3758d2d96e9d328e100ff - chromium/src.git - Git at Google + https://chromium.googlesource.com/chromium/src.git/+/a8af215e691f3a2205a3758d2d96e9d328e100ff + Network.http.max-connections - MozillaZine Knowledge Base + http://kb.mozillazine.org/Network.http.max-connections + */ + queue.process('http', 256, http); +}; diff --git a/src/remote/activitypub/act/delete/index.ts b/src/remote/activitypub/act/delete/index.ts new file mode 100644 index 000000000..eabf9a043 --- /dev/null +++ b/src/remote/activitypub/act/delete/index.ts @@ -0,0 +1,24 @@ +import create from '../../create'; +import deletePost from './post'; + +export default async (resolver, actor, activity) => { + if ('actor' in activity && actor.account.uri !== activity.actor) { + throw new Error(); + } + + const results = await create(resolver, actor, activity.object); + + await Promise.all(results.map(async promisedResult => { + const result = await promisedResult; + if (result === null) { + return; + } + + switch (result.object.$ref) { + case 'posts': + await deletePost(result.object); + } + })); + + return null; +}; diff --git a/src/remote/activitypub/act/delete/post.ts b/src/remote/activitypub/act/delete/post.ts new file mode 100644 index 000000000..1b748afe8 --- /dev/null +++ b/src/remote/activitypub/act/delete/post.ts @@ -0,0 +1,10 @@ +import Post from '../../../../models/post'; +import queue from '../../../../queue'; + +export default ({ $id }) => Promise.all([ + Post.findOneAndDelete({ _id: $id }), + new Promise((resolve, reject) => queue.create('db', { + type: 'deletePostDependents', + id: $id + }).delay(65536).save(error => error ? reject(error) : resolve())) +]); diff --git a/src/remote/activitypub/act/index.ts b/src/remote/activitypub/act/index.ts index 030f1cf25..d282e1288 100644 --- a/src/remote/activitypub/act/index.ts +++ b/src/remote/activitypub/act/index.ts @@ -1,4 +1,5 @@ import create from './create'; +import performDeleteActivity from './delete'; import follow from './follow'; import undo from './undo'; import createObject from '../create'; @@ -19,6 +20,9 @@ export default async (parentResolver: Resolver, actor, value, distribute?: boole case 'Create': return create(resolver, actor, object, distribute); + case 'Delete': + return performDeleteActivity(resolver, actor, object); + case 'Follow': return follow(resolver, actor, object, distribute);