X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fcontrollers%2Fapi%2Fusers%2Fme.ts;h=ebe6681102554fdfda7c3ccb45c55d92b9d2c234;hb=7ad9b9846c44d198a736183fb186c2039f5236b5;hp=403842163187735629371bf1abd9c2d7a6f2b5b8;hpb=06a05d5f4784a7cbb27aa1188385b5679845dad8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts index 403842163..ebe668110 100644 --- a/server/controllers/api/users/me.ts +++ b/server/controllers/api/users/me.ts @@ -6,17 +6,19 @@ import { CONFIG, IMAGE_MIMETYPE_EXT, sequelizeTypescript } from '../../../initia import { sendUpdateActor } from '../../../lib/activitypub/send' import { asyncMiddleware, + asyncRetryTransactionMiddleware, authenticate, commonVideosFiltersValidator, paginationValidator, setDefaultPagination, setDefaultSort, userSubscriptionAddValidator, - userSubscriptionRemoveValidator, + userSubscriptionGetValidator, usersUpdateMeValidator, usersVideoRatingValidator } from '../../../middlewares' import { + areSubscriptionsExistValidator, deleteMeValidator, userSubscriptionsSortValidator, videoImportsSortValidator, @@ -30,12 +32,13 @@ 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 { auditLoggerFactory, getAuditIdFromRes, 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' +import { AccountModel } from '../../../models/account/account' const auditLogger = auditLoggerFactory('users-me') @@ -84,19 +87,35 @@ meRouter.get('/me/videos/:videoId/rating', meRouter.put('/me', authenticate, - usersUpdateMeValidator, - asyncMiddleware(updateMe) + asyncMiddleware(usersUpdateMeValidator), + asyncRetryTransactionMiddleware(updateMe) ) meRouter.post('/me/avatar/pick', authenticate, reqAvatarFile, updateAvatarValidator, - asyncMiddleware(updateMyAvatar) + asyncRetryTransactionMiddleware(updateMyAvatar) ) // ##### Subscriptions part ##### +meRouter.get('/me/subscriptions/videos', + authenticate, + paginationValidator, + videosSortValidator, + setDefaultSort, + setDefaultPagination, + commonVideosFiltersValidator, + asyncMiddleware(getUserSubscriptionVideos) +) + +meRouter.get('/me/subscriptions/exist', + authenticate, + areSubscriptionsExistValidator, + asyncMiddleware(areSubscriptionsExist) +) + meRouter.get('/me/subscriptions', authenticate, paginationValidator, @@ -112,21 +131,16 @@ meRouter.post('/me/subscriptions', asyncMiddleware(addUserSubscription) ) -meRouter.delete('/me/subscriptions/:uri', +meRouter.get('/me/subscriptions/:uri', authenticate, - userSubscriptionRemoveValidator, - asyncMiddleware(deleteUserSubscription) + userSubscriptionGetValidator, + getUserSubscription ) -meRouter.get('/me/subscriptions/videos', - authenticate, +meRouter.delete('/me/subscriptions/:uri', authenticate, - paginationValidator, - videosSortValidator, - setDefaultSort, - setDefaultPagination, - commonVideosFiltersValidator, - asyncMiddleware(getUserSubscriptionVideos) + userSubscriptionGetValidator, + asyncRetryTransactionMiddleware(deleteUserSubscription) ) // --------------------------------------------------------------------------- @@ -137,6 +151,37 @@ export { // --------------------------------------------------------------------------- +async function areSubscriptionsExist (req: express.Request, res: express.Response) { + const uris = req.query.uris as string[] + const user = res.locals.oauth.token.User as UserModel + + const handles = uris.map(u => { + let [ name, host ] = u.split('@') + if (host === CONFIG.WEBSERVER.HOST) host = null + + return { name, host, uri: u } + }) + + const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles) + + const existObject: { [id: string ]: boolean } = {} + for (const handle of handles) { + const obj = results.find(r => { + const server = r.ActorFollowing.Server + + return r.ActorFollowing.preferredUsername === handle.name && + ( + (!server && !handle.host) || + (server.host === handle.host) + ) + }) + + existObject[handle.uri] = obj !== undefined + } + + return res.json(existObject) +} + 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('@') @@ -153,6 +198,12 @@ async function addUserSubscription (req: express.Request, res: express.Response) return res.status(204).end() } +function getUserSubscription (req: express.Request, res: express.Response) { + const subscription: ActorFollowModel = res.locals.subscription + + return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON()) +} + async function deleteUserSubscription (req: express.Request, res: express.Response) { const subscription: ActorFollowModel = res.locals.subscription @@ -187,7 +238,8 @@ async function getUserSubscriptionVideos (req: express.Request, res: express.Res nsfw: buildNSFWFilter(res, req.query.nsfw), filter: req.query.filter as VideoFilter, withFiles: false, - actorId: user.Account.Actor.id + actorId: user.Account.Actor.id, + user }) return res.json(getFormattedObjects(resultList.data, resultList.total)) @@ -234,15 +286,17 @@ async function getUserVideoQuotaUsed (req: express.Request, res: express.Respons // We did not load channels in res.locals.user const user = await UserModel.loadByUsernameAndPopulateChannels(res.locals.oauth.token.user.username) const videoQuotaUsed = await UserModel.getOriginalVideoFileTotalFromUser(user) + const videoQuotaUsedDaily = await UserModel.getOriginalVideoFileTotalDailyFromUser(user) const data: UserVideoQuota = { - videoQuotaUsed + videoQuotaUsed, + videoQuotaUsedDaily } return res.json(data) } async function getUserVideoRating (req: express.Request, res: express.Response, next: express.NextFunction) { - const videoId = +req.params.videoId + const videoId = res.locals.video.id const accountId = +res.locals.oauth.token.User.Account.id const ratingObj = await AccountVideoRateModel.load(accountId, videoId, null) @@ -260,7 +314,7 @@ async function deleteMe (req: express.Request, res: express.Response) { await user.destroy() - auditLogger.delete(res.locals.oauth.token.User.Account.Actor.getIdentifier(), new UserAuditView(user.toFormattedJSON())) + auditLogger.delete(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON())) return res.sendStatus(204) } @@ -277,19 +331,17 @@ async function updateMe (req: express.Request, res: express.Response, next: expr if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo await sequelizeTypescript.transaction(async t => { + const userAccount = await AccountModel.load(user.Account.id) + await user.save({ transaction: t }) - if (body.displayName !== undefined) user.Account.name = body.displayName - if (body.description !== undefined) user.Account.description = body.description - await user.Account.save({ transaction: t }) + if (body.displayName !== undefined) userAccount.name = body.displayName + if (body.description !== undefined) userAccount.description = body.description + await userAccount.save({ transaction: t }) - await sendUpdateActor(user.Account, t) + await sendUpdateActor(userAccount, t) - auditLogger.update( - res.locals.oauth.token.User.Account.Actor.getIdentifier(), - new UserAuditView(user.toFormattedJSON()), - oldUserAuditView - ) + auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) }) return res.sendStatus(204) @@ -299,15 +351,12 @@ async function updateMyAvatar (req: express.Request, res: express.Response, next const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ] const user: UserModel = res.locals.oauth.token.user const oldUserAuditView = new UserAuditView(user.toFormattedJSON()) - const account = user.Account - const avatar = await updateActorAvatarFile(avatarPhysicalFile, account.Actor, account) + const userAccount = await AccountModel.load(user.Account.id) - auditLogger.update( - res.locals.oauth.token.User.Account.Actor.getIdentifier(), - new UserAuditView(user.toFormattedJSON()), - oldUserAuditView - ) + const avatar = await updateActorAvatarFile(avatarPhysicalFile, userAccount) + + auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) return res.json({ avatar: avatar.toFormattedJSON() }) }