From 06a05d5f4784a7cbb27aa1188385b5679845dad8 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 16 Aug 2018 15:25:20 +0200 Subject: Add subscriptions endpoints to REST API --- server/controllers/api/users/me.ts | 114 ++++++++++++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 8 deletions(-) (limited to 'server/controllers/api/users/me.ts') diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts index 1e096a35d..403842163 100644 --- a/server/controllers/api/users/me.ts +++ b/server/controllers/api/users/me.ts @@ -7,23 +7,35 @@ import { sendUpdateActor } from '../../../lib/activitypub/send' import { asyncMiddleware, authenticate, + commonVideosFiltersValidator, paginationValidator, setDefaultPagination, setDefaultSort, + userSubscriptionAddValidator, + userSubscriptionRemoveValidator, usersUpdateMeValidator, usersVideoRatingValidator } from '../../../middlewares' -import { deleteMeValidator, videoImportsSortValidator, videosSortValidator } from '../../../middlewares/validators' +import { + deleteMeValidator, + userSubscriptionsSortValidator, + videoImportsSortValidator, + videosSortValidator +} from '../../../middlewares/validators' import { AccountVideoRateModel } from '../../../models/account/account-video-rate' import { UserModel } from '../../../models/account/user' import { VideoModel } from '../../../models/video/video' import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type' -import { createReqFiles } from '../../../helpers/express-utils' +import { buildNSFWFilter, createReqFiles } from '../../../helpers/express-utils' import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model' import { updateAvatarValidator } from '../../../middlewares/validators/avatar' import { updateActorAvatarFile } from '../../../lib/avatar' import { auditLoggerFactory, UserAuditView } from '../../../helpers/audit-logger' import { VideoImportModel } from '../../../models/video/video-import' +import { VideoFilter } from '../../../../shared/models/videos/video-query.type' +import { ActorFollowModel } from '../../../models/activitypub/actor-follow' +import { JobQueue } from '../../../lib/job-queue' +import { logger } from '../../../helpers/logger' const auditLogger = auditLoggerFactory('users-me') @@ -83,6 +95,40 @@ meRouter.post('/me/avatar/pick', asyncMiddleware(updateMyAvatar) ) +// ##### Subscriptions part ##### + +meRouter.get('/me/subscriptions', + authenticate, + paginationValidator, + userSubscriptionsSortValidator, + setDefaultSort, + setDefaultPagination, + asyncMiddleware(getUserSubscriptions) +) + +meRouter.post('/me/subscriptions', + authenticate, + userSubscriptionAddValidator, + asyncMiddleware(addUserSubscription) +) + +meRouter.delete('/me/subscriptions/:uri', + authenticate, + userSubscriptionRemoveValidator, + asyncMiddleware(deleteUserSubscription) +) + +meRouter.get('/me/subscriptions/videos', + authenticate, + authenticate, + paginationValidator, + videosSortValidator, + setDefaultSort, + setDefaultPagination, + commonVideosFiltersValidator, + asyncMiddleware(getUserSubscriptionVideos) +) + // --------------------------------------------------------------------------- export { @@ -91,6 +137,62 @@ export { // --------------------------------------------------------------------------- +async function addUserSubscription (req: express.Request, res: express.Response) { + const user = res.locals.oauth.token.User as UserModel + const [ name, host ] = req.body.uri.split('@') + + const payload = { + name, + host, + followerActorId: user.Account.Actor.id + } + + JobQueue.Instance.createJob({ type: 'activitypub-follow', payload }) + .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err)) + + return res.status(204).end() +} + +async function deleteUserSubscription (req: express.Request, res: express.Response) { + const subscription: ActorFollowModel = res.locals.subscription + + await sequelizeTypescript.transaction(async t => { + return subscription.destroy({ transaction: t }) + }) + + return res.type('json').status(204).end() +} + +async function getUserSubscriptions (req: express.Request, res: express.Response) { + const user = res.locals.oauth.token.User as UserModel + const actorId = user.Account.Actor.id + + const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort) + + return res.json(getFormattedObjects(resultList.data, resultList.total)) +} + +async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) { + const user = res.locals.oauth.token.User as UserModel + const resultList = await VideoModel.listForApi({ + start: req.query.start, + count: req.query.count, + sort: req.query.sort, + includeLocalVideos: false, + categoryOneOf: req.query.categoryOneOf, + licenceOneOf: req.query.licenceOneOf, + languageOneOf: req.query.languageOneOf, + tagsOneOf: req.query.tagsOneOf, + tagsAllOf: req.query.tagsAllOf, + nsfw: buildNSFWFilter(res, req.query.nsfw), + filter: req.query.filter as VideoFilter, + withFiles: false, + actorId: user.Account.Actor.id + }) + + return res.json(getFormattedObjects(resultList.data, resultList.total)) +} + async function getUserVideos (req: express.Request, res: express.Response, next: express.NextFunction) { const user = res.locals.oauth.token.User as UserModel const resultList = await VideoModel.listUserVideosForApi( @@ -150,7 +252,7 @@ async function getUserVideoRating (req: express.Request, res: express.Response, videoId, rating } - res.json(json) + return res.json(json) } async function deleteMe (req: express.Request, res: express.Response) { @@ -207,9 +309,5 @@ async function updateMyAvatar (req: express.Request, res: express.Response, next oldUserAuditView ) - return res - .json({ - avatar: avatar.toFormattedJSON() - }) - .end() + return res.json({ avatar: avatar.toFormattedJSON() }) } -- cgit v1.2.3