summaryrefslogtreecommitdiff
path: root/src/remote
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2018-04-02 19:53:04 +0900
committerGitHub <noreply@github.com>2018-04-02 19:53:04 +0900
commit4fc04acdc1f08b6770a5f34d562f130b4c4db0c4 (patch)
tree87ff0708cb2c8ea8953d16f289bf22fc71df5307 /src/remote
parentMerge pull request #1372 from akihikodaki/misc (diff)
parentImplement Follow activity (diff)
downloadmisskey-4fc04acdc1f08b6770a5f34d562f130b4c4db0c4.tar.gz
misskey-4fc04acdc1f08b6770a5f34d562f130b4c4db0c4.tar.bz2
misskey-4fc04acdc1f08b6770a5f34d562f130b4c4db0c4.zip
Merge pull request #1373 from akihikodaki/misc
Implement Follow activity
Diffstat (limited to 'src/remote')
-rw-r--r--src/remote/activitypub/act/follow.ts51
-rw-r--r--src/remote/activitypub/act/index.ts4
2 files changed, 55 insertions, 0 deletions
diff --git a/src/remote/activitypub/act/follow.ts b/src/remote/activitypub/act/follow.ts
new file mode 100644
index 0000000000..ec9e080dfc
--- /dev/null
+++ b/src/remote/activitypub/act/follow.ts
@@ -0,0 +1,51 @@
+import { MongoError } from 'mongodb';
+import parseAcct from '../../../acct/parse';
+import Following from '../../../models/following';
+import User from '../../../models/user';
+import config from '../../../config';
+import queue from '../../../queue';
+
+export default async (actor, activity) => {
+ const prefix = config.url + '/@';
+ const id = activity.object.id || activity.object;
+ let following;
+
+ if (!id.startsWith(prefix)) {
+ return null;
+ }
+
+ const { username, host } = parseAcct(id.slice(prefix.length));
+ if (host !== null) {
+ throw new Error();
+ }
+
+ const followee = await User.findOne({ username, host });
+ if (followee === null) {
+ throw new Error();
+ }
+
+ try {
+ following = await Following.insert({
+ createdAt: new Date(),
+ followerId: actor._id,
+ followeeId: followee._id
+ });
+ } catch (exception) {
+ // duplicate key error
+ if (exception instanceof MongoError && exception.code === 11000) {
+ return null;
+ }
+
+ throw exception;
+ }
+
+ await new Promise((resolve, reject) => {
+ queue.create('http', { type: 'follow', following: following._id }).save(error => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve(null);
+ }
+ });
+ });
+};
diff --git a/src/remote/activitypub/act/index.ts b/src/remote/activitypub/act/index.ts
index 06d662c191..24320dcb1d 100644
--- a/src/remote/activitypub/act/index.ts
+++ b/src/remote/activitypub/act/index.ts
@@ -1,4 +1,5 @@
import create from './create';
+import follow from './follow';
import createObject from '../create';
import Resolver from '../resolver';
@@ -15,6 +16,9 @@ export default (actor, value, distribute) => {
case 'Create':
return create(resolver, actor, object, distribute);
+ case 'Follow':
+ return follow(actor, object);
+
default:
return null;
}