X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fusers%2Fmy-subscriptions.ts;h=6e2aa371108a9b97b11db69f49b29b0fefb4f2a0;hb=85c20aaeb90ef0e0f44c377e62c323fde275cdde;hp=26a715704b66a882315d27ad6c3aa8d5a7259c87;hpb=d6886027109af42be2e3ec5d14ad166199add11d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/users/my-subscriptions.ts b/server/controllers/api/users/my-subscriptions.ts index 26a715704..6e2aa3711 100644 --- a/server/controllers/api/users/my-subscriptions.ts +++ b/server/controllers/api/users/my-subscriptions.ts @@ -1,12 +1,13 @@ import 'multer' -import * as express from 'express' +import express from 'express' +import { handlesToNameAndHost } from '@server/helpers/actors' import { pickCommonVideoQuery } from '@server/helpers/query' import { sendUndoFollow } from '@server/lib/activitypub/send' +import { guessAdditionalAttributesFromQuery } from '@server/models/video/formatter/video-format-utils' import { VideoChannelModel } from '@server/models/video/video-channel' import { HttpStatusCode } from '../../../../shared/models/http/http-error-codes' import { buildNSFWFilter, getCountVideos } from '../../../helpers/express-utils' import { getFormattedObjects } from '../../../helpers/utils' -import { WEBSERVER } from '../../../initializers/constants' import { sequelizeTypescript } from '../../../initializers/database' import { JobQueue } from '../../../lib/job-queue' import { @@ -29,6 +30,7 @@ import { } from '../../../middlewares/validators' import { ActorFollowModel } from '../../../models/actor/actor-follow' import { VideoModel } from '../../../models/video/video' +import { Hooks } from '@server/lib/plugins/hooks' const mySubscriptionsRouter = express.Router() @@ -88,28 +90,23 @@ async function areSubscriptionsExist (req: express.Request, res: express.Respons const uris = req.query.uris as string[] const user = res.locals.oauth.token.User - const handles = uris.map(u => { - let [ name, host ] = u.split('@') - if (host === WEBSERVER.HOST) host = null + const sanitizedHandles = handlesToNameAndHost(uris) - return { name, host, uri: u } - }) - - const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles) + const results = await ActorFollowModel.listSubscriptionsOf(user.Account.Actor.id, sanitizedHandles) const existObject: { [id: string ]: boolean } = {} - for (const handle of handles) { + for (const sanitizedHandle of sanitizedHandles) { const obj = results.find(r => { const server = r.ActorFollowing.Server - return r.ActorFollowing.preferredUsername === handle.name && + return r.ActorFollowing.preferredUsername.toLowerCase() === sanitizedHandle.name.toLowerCase() && ( - (!server && !handle.host) || - (server.host === handle.host) + (!server && !sanitizedHandle.host) || + (server.host === sanitizedHandle.host) ) }) - existObject[handle.uri] = obj !== undefined + existObject[sanitizedHandle.handle] = obj !== undefined } return res.json(existObject) @@ -126,7 +123,7 @@ function addUserSubscription (req: express.Request, res: express.Response) { followerActorId: user.Account.Actor.id } - JobQueue.Instance.createJob({ type: 'activitypub-follow', payload }) + JobQueue.Instance.createJobAsync({ type: 'activitypub-follow', payload }) return res.status(HttpStatusCode.NO_CONTENT_204).end() } @@ -142,7 +139,9 @@ async function deleteUserSubscription (req: express.Request, res: express.Respon const subscription = res.locals.subscription await sequelizeTypescript.transaction(async t => { - if (subscription.state === 'accepted') await sendUndoFollow(subscription, t) + if (subscription.state === 'accepted') { + sendUndoFollow(subscription, t) + } return subscription.destroy({ transaction: t }) }) @@ -172,16 +171,23 @@ async function getUserSubscriptionVideos (req: express.Request, res: express.Res const countVideos = getCountVideos(req) const query = pickCommonVideoQuery(req.query) - const resultList = await VideoModel.listForApi({ + const apiOptions = await Hooks.wrapObject({ ...query, - includeLocalVideos: false, + displayOnlyForFollower: { + actorId: user.Account.Actor.id, + orLocalVideos: false + }, nsfw: buildNSFWFilter(res, query.nsfw), - withFiles: false, - followerActorId: user.Account.Actor.id, user, countVideos - }) + }, 'filter:api.user.me.subscription-videos.list.params') - return res.json(getFormattedObjects(resultList.data, resultList.total)) + const resultList = await Hooks.wrapPromiseFun( + VideoModel.listForApi, + apiOptions, + 'filter:api.user.me.subscription-videos.list.result' + ) + + return res.json(getFormattedObjects(resultList.data, resultList.total, guessAdditionalAttributesFromQuery(query))) }