summaryrefslogtreecommitdiff
path: root/src/remote
diff options
context:
space:
mode:
authorAkihiko Odaki <nekomanma@pixiv.co.jp>2018-04-02 17:11:14 +0900
committerAkihiko Odaki <nekomanma@pixiv.co.jp>2018-04-02 17:11:14 +0900
commitce7efc4dbb9dca05b6b99b5ada22205890ca823f (patch)
tree7889620f2172fef7277b66a7abb00557e966fbf3 /src/remote
parentIntroduce acct directory (diff)
downloadsharkey-ce7efc4dbb9dca05b6b99b5ada22205890ca823f.tar.gz
sharkey-ce7efc4dbb9dca05b6b99b5ada22205890ca823f.tar.bz2
sharkey-ce7efc4dbb9dca05b6b99b5ada22205890ca823f.zip
Distribute posts from remote
Diffstat (limited to 'src/remote')
-rw-r--r--src/remote/activitypub/act/create.ts4
-rw-r--r--src/remote/activitypub/act/index.ts6
-rw-r--r--src/remote/activitypub/create.ts139
-rw-r--r--src/remote/activitypub/resolve-person.ts6
4 files changed, 92 insertions, 63 deletions
diff --git a/src/remote/activitypub/act/create.ts b/src/remote/activitypub/act/create.ts
index 9eb74800ea..a6ba9a1d2b 100644
--- a/src/remote/activitypub/act/create.ts
+++ b/src/remote/activitypub/act/create.ts
@@ -1,9 +1,9 @@
import create from '../create';
-export default (resolver, actor, activity) => {
+export default (resolver, actor, activity, distribute) => {
if ('actor' in activity && actor.account.uri !== activity.actor) {
throw new Error();
}
- return create(resolver, actor, activity.object);
+ return create(resolver, actor, activity.object, distribute);
};
diff --git a/src/remote/activitypub/act/index.ts b/src/remote/activitypub/act/index.ts
index a76983638f..06d662c191 100644
--- a/src/remote/activitypub/act/index.ts
+++ b/src/remote/activitypub/act/index.ts
@@ -2,10 +2,10 @@ import create from './create';
import createObject from '../create';
import Resolver from '../resolver';
-export default (actor, value) => {
+export default (actor, value, distribute) => {
return new Resolver().resolve(value).then(resolved => Promise.all(resolved.map(async promisedResult => {
const { resolver, object } = await promisedResult;
- const created = await (await createObject(resolver, actor, [object]))[0];
+ const created = await (await createObject(resolver, actor, [object], distribute))[0];
if (created !== null) {
return created;
@@ -13,7 +13,7 @@ export default (actor, value) => {
switch (object.type) {
case 'Create':
- return create(resolver, actor, object);
+ return create(resolver, actor, object, distribute);
default:
return null;
diff --git a/src/remote/activitypub/create.ts b/src/remote/activitypub/create.ts
index 8ea8a85fd8..dd3f7b0227 100644
--- a/src/remote/activitypub/create.ts
+++ b/src/remote/activitypub/create.ts
@@ -1,8 +1,11 @@
import { JSDOM } from 'jsdom';
import config from '../../config';
-import Post from '../../models/post';
+import { pack as packPost } from '../../models/post';
import RemoteUserObject, { IRemoteUserObject } from '../../models/remote-user-object';
+import { IRemoteUser } from '../../models/user';
import uploadFromUrl from '../../drive/upload-from-url';
+import createPost from '../../post/create';
+import distributePost from '../../post/distribute';
import Resolver from './resolver';
const createDOMPurify = require('dompurify');
@@ -16,72 +19,98 @@ function createRemoteUserObject($ref, $id, { id }) {
return RemoteUserObject.insert({ uri: id, object });
}
-async function createImage(actor, object) {
- if ('attributedTo' in object && actor.account.uri !== object.attributedTo) {
- throw new Error();
+class Creator {
+ private actor: IRemoteUser;
+ private distribute: boolean;
+
+ constructor(actor, distribute) {
+ this.actor = actor;
+ this.distribute = distribute;
}
- const { _id } = await uploadFromUrl(object.url, actor);
- return createRemoteUserObject('driveFiles.files', _id, object);
-}
+ private async createImage(object) {
+ if ('attributedTo' in object && this.actor.account.uri !== object.attributedTo) {
+ throw new Error();
+ }
-async function createNote(resolver, actor, object) {
- if ('attributedTo' in object && actor.account.uri !== object.attributedTo) {
- throw new Error();
+ const { _id } = await uploadFromUrl(object.url, this.actor);
+ return createRemoteUserObject('driveFiles.files', _id, object);
}
- const mediaIds = 'attachment' in object &&
- (await Promise.all(await create(resolver, actor, object.attachment)))
- .filter(media => media !== null && media.object.$ref === 'driveFiles.files')
- .map(({ object }) => object.$id);
+ private async createNote(resolver, object) {
+ if ('attributedTo' in object && this.actor.account.uri !== object.attributedTo) {
+ throw new Error();
+ }
- const { window } = new JSDOM(object.content);
+ const mediaIds = 'attachment' in object &&
+ (await Promise.all(await this.create(resolver, object.attachment)))
+ .filter(media => media !== null && media.object.$ref === 'driveFiles.files')
+ .map(({ object }) => object.$id);
- const { _id } = await Post.insert({
- channelId: undefined,
- index: undefined,
- createdAt: new Date(object.published),
- mediaIds,
- replyId: undefined,
- repostId: undefined,
- poll: undefined,
- text: window.document.body.textContent,
- textHtml: object.content && createDOMPurify(window).sanitize(object.content),
- userId: actor._id,
- appId: null,
- viaMobile: false,
- geo: undefined
- });
+ const { window } = new JSDOM(object.content);
- // Register to search database
- if (object.content && config.elasticsearch.enable) {
- const es = require('../../db/elasticsearch');
+ const inserted = await createPost({
+ channelId: undefined,
+ index: undefined,
+ createdAt: new Date(object.published),
+ mediaIds,
+ replyId: undefined,
+ repostId: undefined,
+ poll: undefined,
+ text: window.document.body.textContent,
+ textHtml: object.content && createDOMPurify(window).sanitize(object.content),
+ userId: this.actor._id,
+ appId: null,
+ viaMobile: false,
+ geo: undefined
+ }, null, null, []);
- es.index({
- index: 'misskey',
- type: 'post',
- id: _id.toString(),
- body: {
- text: window.document.body.textContent
- }
- });
- }
-
- return createRemoteUserObject('posts', _id, object);
-}
+ const promisedRemoteUserObject = createRemoteUserObject('posts', inserted._id, object);
+ const promises = [];
-export default async function create(parentResolver: Resolver, actor, value): Promise<Array<Promise<IRemoteUserObject>>> {
- const results = await parentResolver.resolveRemoteUserObjects(value);
+ if (this.distribute) {
+ promises.push(distributePost(this.actor, inserted.mentions, packPost(inserted)));
+ }
- return results.map(promisedResult => promisedResult.then(({ resolver, object }) => {
- switch (object.type) {
- case 'Image':
- return createImage(actor, object);
+ // Register to search database
+ if (object.content && config.elasticsearch.enable) {
+ const es = require('../../db/elasticsearch');
- case 'Note':
- return createNote(resolver, actor, object);
+ promises.push(new Promise((resolve, reject) => {
+ es.index({
+ index: 'misskey',
+ type: 'post',
+ id: inserted._id.toString(),
+ body: {
+ text: window.document.body.textContent
+ }
+ }, resolve);
+ }));
}
- return null;
- }));
+ await Promise.all(promises);
+
+ return promisedRemoteUserObject;
+ }
+
+ public async create(parentResolver, value): Promise<Array<Promise<IRemoteUserObject>>> {
+ const results = await parentResolver.resolveRemoteUserObjects(value);
+
+ return results.map(promisedResult => promisedResult.then(({ resolver, object }) => {
+ switch (object.type) {
+ case 'Image':
+ return this.createImage(object);
+
+ case 'Note':
+ return this.createNote(resolver, object);
+ }
+
+ return null;
+ }));
+ }
}
+
+export default (resolver: Resolver, actor, value, distribute?: boolean) => {
+ const creator = new Creator(actor, distribute);
+ return creator.create(resolver, value);
+};
diff --git a/src/remote/activitypub/resolve-person.ts b/src/remote/activitypub/resolve-person.ts
index d928e7ce19..4a2636b2f7 100644
--- a/src/remote/activitypub/resolve-person.ts
+++ b/src/remote/activitypub/resolve-person.ts
@@ -52,10 +52,10 @@ export default async (value, usernameLower, hostLower, acctLower) => {
bannerId: null,
createdAt: Date.parse(object.published),
description: summaryDOM.textContent,
- followersCount: followers.totalItem,
- followingCount: following.totalItem,
+ followersCount: followers ? followers.totalItem || 0 : 0,
+ followingCount: following ? following.totalItem || 0 : 0,
name: object.name,
- postsCount: outbox.totalItem,
+ postsCount: outbox ? outbox.totalItem || 0 : 0,
driveCapacity: 1024 * 1024 * 8, // 8MiB
username: object.preferredUsername,
usernameLower,