summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorMeiMei <30769358+mei23@users.noreply.github.com>2018-09-18 13:08:27 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2018-09-18 13:08:27 +0900
commit11496d887e89ceccd64035f9e1836c5d415f4349 (patch)
tree6c3d3b542a893127b5b0afe1f05627b703838915 /src/server
parent8.50.0 (diff)
downloadmisskey-11496d887e89ceccd64035f9e1836c5d415f4349.tar.gz
misskey-11496d887e89ceccd64035f9e1836c5d415f4349.tar.bz2
misskey-11496d887e89ceccd64035f9e1836c5d415f4349.zip
Publish pinned notes (#2731)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/activitypub.ts4
-rw-r--r--src/server/activitypub/featured.ts38
-rw-r--r--src/server/api/endpoints/i/pin.ts10
3 files changed, 51 insertions, 1 deletions
diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index 3d346693d8..2cbce8cfbc 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -13,6 +13,7 @@ import renderPerson from '../remote/activitypub/renderer/person';
import Outbox, { packActivity } from './activitypub/outbox';
import Followers from './activitypub/followers';
import Following from './activitypub/following';
+import Featured from './activitypub/featured';
// Init router
const router = new Router();
@@ -102,6 +103,9 @@ router.get('/users/:user/followers', Followers);
// following
router.get('/users/:user/following', Following);
+// featured
+router.get('/users/:user/collections/featured', Featured);
+
// publickey
router.get('/users/:user/publickey', async ctx => {
const userId = new mongo.ObjectID(ctx.params.user);
diff --git a/src/server/activitypub/featured.ts b/src/server/activitypub/featured.ts
new file mode 100644
index 0000000000..93c3700206
--- /dev/null
+++ b/src/server/activitypub/featured.ts
@@ -0,0 +1,38 @@
+import * as mongo from 'mongodb';
+import * as Router from 'koa-router';
+import config from '../../config';
+import User from '../../models/user';
+import pack from '../../remote/activitypub/renderer';
+import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-collection';
+import { setResponseType } from '../activitypub';
+import Note from '../../models/note';
+import renderNote from '../../remote/activitypub/renderer/note';
+
+export default async (ctx: Router.IRouterContext) => {
+ const userId = new mongo.ObjectID(ctx.params.user);
+
+ // Verify user
+ const user = await User.findOne({
+ _id: userId,
+ host: null
+ });
+
+ if (user === null) {
+ ctx.status = 404;
+ return;
+ }
+
+ const pinnedNoteIds = user.pinnedNoteIds || [];
+
+ const pinnedNotes = await Promise.all(pinnedNoteIds.map(id => Note.findOne({ _id: id })));
+
+ const renderedNotes = await Promise.all(pinnedNotes.map(note => renderNote(note)));
+
+ const rendered = renderOrderedCollection(
+ `${config.url}/users/${userId}/collections/featured`,
+ renderedNotes.length, null, null, renderedNotes
+ );
+
+ ctx.body = pack(rendered);
+ setResponseType(ctx);
+};
diff --git a/src/server/api/endpoints/i/pin.ts b/src/server/api/endpoints/i/pin.ts
index 8804d5aa70..ce3b0318a9 100644
--- a/src/server/api/endpoints/i/pin.ts
+++ b/src/server/api/endpoints/i/pin.ts
@@ -2,6 +2,7 @@ import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import User, { ILocalUser } from '../../../../models/user';
import Note from '../../../../models/note';
import { pack } from '../../../../models/user';
+import { deliverPinnedChange } from '../../../../services/i/pin';
/**
* Pin note
@@ -21,6 +22,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
return rej('note not found');
}
+ let addedId;
+ let removedId;
+
const pinnedNoteIds = user.pinnedNoteIds || [];
if (pinnedNoteIds.some(id => id.equals(note._id))) {
@@ -28,9 +32,10 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
}
pinnedNoteIds.unshift(note._id);
+ addedId = note._id;
if (pinnedNoteIds.length > 5) {
- pinnedNoteIds.pop();
+ removedId = pinnedNoteIds.pop();
}
await User.update(user._id, {
@@ -44,6 +49,9 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
detail: true
});
+ // Send Add/Remove to followers
+ deliverPinnedChange(user._id, removedId, addedId);
+
// Send response
res(iObj);
});