diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2018-04-02 19:53:04 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-02 19:53:04 +0900 |
| commit | 4fc04acdc1f08b6770a5f34d562f130b4c4db0c4 (patch) | |
| tree | 87ff0708cb2c8ea8953d16f289bf22fc71df5307 /src/remote | |
| parent | Merge pull request #1372 from akihikodaki/misc (diff) | |
| parent | Implement Follow activity (diff) | |
| download | misskey-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.ts | 51 | ||||
| -rw-r--r-- | src/remote/activitypub/act/index.ts | 4 |
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; } |