summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2018-04-01 19:24:18 +0900
committerGitHub <noreply@github.com>2018-04-01 19:24:18 +0900
commitd9c7b89a47dd95c59aede9c0b74059f48ba7a85f (patch)
tree7f209df7929887c4982a29feeb218d33e613d6cd /src/server
parentRefactor: Better variable name (diff)
parentImplement outbox (diff)
downloadsharkey-d9c7b89a47dd95c59aede9c0b74059f48ba7a85f.tar.gz
sharkey-d9c7b89a47dd95c59aede9c0b74059f48ba7a85f.tar.bz2
sharkey-d9c7b89a47dd95c59aede9c0b74059f48ba7a85f.zip
Merge pull request #1353 from akihikodaki/webfinger
Implement outbox
Diffstat (limited to 'src/server')
-rw-r--r--src/server/activitypub/index.ts6
-rw-r--r--src/server/activitypub/outbox.ts45
-rw-r--r--src/server/activitypub/post.ts51
-rw-r--r--src/server/activitypub/user.ts36
4 files changed, 62 insertions, 76 deletions
diff --git a/src/server/activitypub/index.ts b/src/server/activitypub/index.ts
index 6618c291f7..c81024d15f 100644
--- a/src/server/activitypub/index.ts
+++ b/src/server/activitypub/index.ts
@@ -1,14 +1,16 @@
import * as express from 'express';
-import post from './post';
import user from './user';
import inbox from './inbox';
+import outbox from './outbox';
+import post from './post';
const app = express();
app.disable('x-powered-by');
-app.use(post);
app.use(user);
app.use(inbox);
+app.use(outbox);
+app.use(post);
export default app;
diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts
new file mode 100644
index 0000000000..c5a42ae0a9
--- /dev/null
+++ b/src/server/activitypub/outbox.ts
@@ -0,0 +1,45 @@
+import * as express from 'express';
+import context from '../../common/remote/activitypub/renderer/context';
+import renderNote from '../../common/remote/activitypub/renderer/note';
+import renderOrderedCollection from '../../common/remote/activitypub/renderer/ordered-collection';
+import parseAcct from '../../common/user/parse-acct';
+import config from '../../conf';
+import Post from '../../models/post';
+import User from '../../models/user';
+
+const app = express();
+app.disable('x-powered-by');
+
+app.get('/@:user/outbox', async (req, res) => {
+ const { username, host } = parseAcct(req.params.user);
+ if (host !== null) {
+ return res.sendStatus(422);
+ }
+
+ const user = await User.findOne({
+ usernameLower: username.toLowerCase(),
+ host: null
+ });
+ if (user === null) {
+ return res.sendStatus(404);
+ }
+
+ const id = `${config.url}/@${user.username}/inbox`;
+
+ if (username !== user.username) {
+ return res.redirect(id);
+ }
+
+ const posts = await Post.find({ userId: user._id }, {
+ limit: 20,
+ sort: { _id: -1 }
+ });
+
+ const renderedPosts = await Promise.all(posts.map(post => renderNote(user, post)));
+ const rendered = renderOrderedCollection(id, user.postsCount, renderedPosts);
+ rendered['@context'] = context;
+
+ res.json(rendered);
+});
+
+export default app;
diff --git a/src/server/activitypub/post.ts b/src/server/activitypub/post.ts
index bdfce0606d..6644563d8c 100644
--- a/src/server/activitypub/post.ts
+++ b/src/server/activitypub/post.ts
@@ -1,8 +1,7 @@
import * as express from 'express';
-import context from '../../common/remote/activitypub/context';
+import context from '../../common/remote/activitypub/renderer/context';
+import render from '../../common/remote/activitypub/renderer/note';
import parseAcct from '../../common/user/parse-acct';
-import config from '../../conf';
-import DriveFile from '../../models/drive-file';
import Post from '../../models/post';
import User from '../../models/user';
@@ -36,50 +35,10 @@ app.get('/@:user/:post', async (req, res, next) => {
return res.sendStatus(404);
}
- const promisedFiles = DriveFile.find({ _id: { $in: post.mediaIds } });
- let inReplyTo;
+ const rendered = await render(user, post);
+ rendered['@context'] = context;
- if (post.replyId) {
- const inReplyToPost = await Post.findOne({
- _id: post.replyId,
- });
-
- if (inReplyToPost !== null) {
- const inReplyToUser = await User.findOne({
- _id: post.userId,
- });
-
- if (inReplyToUser !== null) {
- inReplyTo = `${config.url}@${inReplyToUser.username}/${inReplyToPost._id}`;
- }
- }
- } else {
- inReplyTo = null;
- }
-
- const attributedTo = `${config.url}/@${user.username}`;
-
- res.json({
- '@context': context,
- id: `${attributedTo}/${post._id}`,
- type: 'Note',
- attributedTo,
- content: post.textHtml,
- published: post.createdAt.toISOString(),
- to: 'https://www.w3.org/ns/activitystreams#Public',
- cc: `${attributedTo}/followers`,
- inReplyTo,
- attachment: (await promisedFiles).map(({ _id, contentType }) => ({
- type: 'Document',
- mediaType: contentType,
- url: `${config.drive_url}/${_id}`
- })),
- tag: post.tags.map(tag => ({
- type: 'Hashtag',
- href: `${config.url}/search?q=#${encodeURIComponent(tag)}`,
- name: '#' + tag
- }))
- });
+ res.json(rendered);
});
export default app;
diff --git a/src/server/activitypub/user.ts b/src/server/activitypub/user.ts
index ef365c2078..d43a9793d4 100644
--- a/src/server/activitypub/user.ts
+++ b/src/server/activitypub/user.ts
@@ -1,9 +1,9 @@
import * as express from 'express';
import config from '../../conf';
-import { extractPublic } from '../../crypto_key';
-import context from '../../common/remote/activitypub/context';
+import context from '../../common/remote/activitypub/renderer/context';
+import render from '../../common/remote/activitypub/renderer/person';
import parseAcct from '../../common/user/parse-acct';
-import User, { ILocalAccount } from '../../models/user';
+import User from '../../models/user';
const app = express();
app.disable('x-powered-by');
@@ -27,34 +27,14 @@ app.get('/@:user', async (req, res, next) => {
return res.sendStatus(404);
}
- const id = `${config.url}/@${user.username}`;
-
if (username !== user.username) {
- return res.redirect(id);
+ return res.redirect(`${config.url}/@${user.username}`);
}
- res.json({
- '@context': context,
- type: 'Person',
- id,
- inbox: `${id}/inbox`,
- preferredUsername: user.username,
- name: user.name,
- summary: user.description,
- icon: user.avatarId && {
- type: 'Image',
- url: `${config.drive_url}/${user.avatarId}`
- },
- image: user.bannerId && {
- type: 'Image',
- url: `${config.drive_url}/${user.bannerId}`
- },
- publicKey: {
- type: 'Key',
- owner: id,
- publicKeyPem: extractPublic((user.account as ILocalAccount).keypair)
- }
- });
+ const rendered = render(user);
+ rendered['@context'] = context;
+
+ res.json(rendered);
});
export default app;