Publish pinned notes (#2731)
This commit is contained in:
parent
bec48319ec
commit
11496d887e
9 changed files with 135 additions and 2 deletions
|
@ -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);
|
||||
|
|
38
src/server/activitypub/featured.ts
Normal file
38
src/server/activitypub/featured.ts
Normal file
|
@ -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);
|
||||
};
|
|
@ -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);
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue