From 11496d887e89ceccd64035f9e1836c5d415f4349 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 18 Sep 2018 13:08:27 +0900 Subject: Publish pinned notes (#2731) --- src/server/activitypub.ts | 4 ++++ src/server/activitypub/featured.ts | 38 ++++++++++++++++++++++++++++++++++++++ src/server/api/endpoints/i/pin.ts | 10 +++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/server/activitypub/featured.ts (limited to 'src/server') 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); }); -- cgit v1.2.3-freya