X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fcontrollers%2Fapi%2Fusers%2Fme.ts;h=00f580ee959f78abfa4977300116013d483acd43;hb=a3b472a12ec6e57dbe2f650419f8064864686eab;hp=9f9d2d77ff5cb0d8b04411cea1b81f401c8d0a11;hpb=4024c44f9027a32809931de0692d40d001df721c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts index 9f9d2d77f..00f580ee9 100644 --- a/server/controllers/api/users/me.ts +++ b/server/controllers/api/users/me.ts @@ -1,17 +1,18 @@ import 'multer' -import * as express from 'express' +import express from 'express' import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '@server/helpers/audit-logger' +import { getBiggestActorImage } from '@server/lib/actor-image' import { Hooks } from '@server/lib/plugins/hooks' -import { ActorImageType, UserUpdateMe, UserVideoRate as FormattedUserVideoRate } from '../../../../shared' -import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' -import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model' +import { pick } from '@shared/core-utils' +import { ActorImageType, HttpStatusCode, UserUpdateMe, UserVideoQuota, UserVideoRate as FormattedUserVideoRate } from '@shared/models' +import { AttributesOnly } from '@shared/typescript-utils' import { createReqFiles } from '../../../helpers/express-utils' import { getFormattedObjects } from '../../../helpers/utils' import { CONFIG } from '../../../initializers/config' import { MIMETYPES } from '../../../initializers/constants' import { sequelizeTypescript } from '../../../initializers/database' import { sendUpdateActor } from '../../../lib/activitypub/send' -import { deleteLocalActorImageFile, updateLocalActorImageFile } from '../../../lib/actor-image' +import { deleteLocalActorImageFile, updateLocalActorImageFiles } from '../../../lib/local-actor' import { getOriginalVideoFileTotalDailyFromUser, getOriginalVideoFileTotalFromUser, sendVerifyUserEmail } from '../../../lib/user' import { asyncMiddleware, @@ -24,17 +25,23 @@ import { usersUpdateMeValidator, usersVideoRatingValidator } from '../../../middlewares' -import { deleteMeValidator, videoImportsSortValidator, videosSortValidator } from '../../../middlewares/validators' +import { + deleteMeValidator, + getMyVideoImportsValidator, + usersVideosValidator, + videoImportsSortValidator, + videosSortValidator +} from '../../../middlewares/validators' import { updateAvatarValidator } from '../../../middlewares/validators/actor-image' import { AccountModel } from '../../../models/account/account' import { AccountVideoRateModel } from '../../../models/account/account-video-rate' -import { UserModel } from '../../../models/account/user' +import { UserModel } from '../../../models/user/user' import { VideoModel } from '../../../models/video/video' import { VideoImportModel } from '../../../models/video/video-import' const auditLogger = auditLoggerFactory('users') -const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR }) +const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT) const meRouter = express.Router() @@ -59,6 +66,7 @@ meRouter.get('/me/videos/imports', videoImportsSortValidator, setDefaultSort, setDefaultPagination, + getMyVideoImportsValidator, asyncMiddleware(getUserVideoImports) ) @@ -68,6 +76,7 @@ meRouter.get('/me/videos', videosSortValidator, setDefaultVideosSort, setDefaultPagination, + asyncMiddleware(usersVideosValidator), asyncMiddleware(getUserVideos) ) @@ -111,7 +120,9 @@ async function getUserVideos (req: express.Request, res: express.Response) { start: req.query.start, count: req.query.count, sort: req.query.sort, - search: req.query.search + search: req.query.search, + channelId: res.locals.videoChannel?.id, + isLive: req.query.isLive }, 'filter:api.user.me.videos.list.params') const resultList = await Hooks.wrapPromiseFun( @@ -131,12 +142,11 @@ async function getUserVideos (req: express.Request, res: express.Response) { async function getUserVideoImports (req: express.Request, res: express.Response) { const user = res.locals.oauth.token.User - const resultList = await VideoImportModel.listUserVideoImportsForApi( - user.id, - req.query.start as number, - req.query.count as number, - req.query.sort - ) + const resultList = await VideoImportModel.listUserVideoImportsForApi({ + userId: user.id, + + ...pick(req.query, [ 'targetUrl', 'start', 'count', 'sort', 'search', 'videoChannelSyncId' ]) + }) return res.json(getFormattedObjects(resultList.data, resultList.total)) } @@ -181,7 +191,7 @@ async function deleteMe (req: express.Request, res: express.Response) { await user.destroy() - return res.sendStatus(HttpStatusCode.NO_CONTENT_204) + return res.status(HttpStatusCode.NO_CONTENT_204).end() } async function updateMe (req: express.Request, res: express.Response) { @@ -190,17 +200,30 @@ async function updateMe (req: express.Request, res: express.Response) { const user = res.locals.oauth.token.user - if (body.password !== undefined) user.password = body.password - if (body.nsfwPolicy !== undefined) user.nsfwPolicy = body.nsfwPolicy - if (body.webTorrentEnabled !== undefined) user.webTorrentEnabled = body.webTorrentEnabled - if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo - if (body.autoPlayNextVideo !== undefined) user.autoPlayNextVideo = body.autoPlayNextVideo - if (body.autoPlayNextVideoPlaylist !== undefined) user.autoPlayNextVideoPlaylist = body.autoPlayNextVideoPlaylist - if (body.videosHistoryEnabled !== undefined) user.videosHistoryEnabled = body.videosHistoryEnabled - if (body.videoLanguages !== undefined) user.videoLanguages = body.videoLanguages - if (body.theme !== undefined) user.theme = body.theme - if (body.noInstanceConfigWarningModal !== undefined) user.noInstanceConfigWarningModal = body.noInstanceConfigWarningModal - if (body.noWelcomeModal !== undefined) user.noWelcomeModal = body.noWelcomeModal + const keysToUpdate: (keyof UserUpdateMe & keyof AttributesOnly)[] = [ + 'password', + 'nsfwPolicy', + 'p2pEnabled', + 'autoPlayVideo', + 'autoPlayNextVideo', + 'autoPlayNextVideoPlaylist', + 'videosHistoryEnabled', + 'videoLanguages', + 'theme', + 'noInstanceConfigWarningModal', + 'noAccountSetupWarningModal', + 'noWelcomeModal' + ] + + for (const key of keysToUpdate) { + if (body[key] !== undefined) user.set(key, body[key]) + } + + if (body.p2pEnabled !== undefined) { + user.set('p2pEnabled', body.p2pEnabled) + } else if (body.webTorrentEnabled !== undefined) { // FIXME: deprecated in 4.1 + user.set('p2pEnabled', body.webTorrentEnabled) + } if (body.email !== undefined) { if (CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION) { @@ -214,22 +237,22 @@ async function updateMe (req: express.Request, res: express.Response) { await sequelizeTypescript.transaction(async t => { await user.save({ transaction: t }) - if (body.displayName !== undefined || body.description !== undefined) { - const userAccount = await AccountModel.load(user.Account.id, t) + if (body.displayName === undefined && body.description === undefined) return - if (body.displayName !== undefined) userAccount.name = body.displayName - if (body.description !== undefined) userAccount.description = body.description - await userAccount.save({ transaction: t }) + const userAccount = await AccountModel.load(user.Account.id, t) - await sendUpdateActor(userAccount, t) - } + if (body.displayName !== undefined) userAccount.name = body.displayName + if (body.description !== undefined) userAccount.description = body.description + await userAccount.save({ transaction: t }) + + await sendUpdateActor(userAccount, t) }) if (sendVerificationEmail === true) { await sendVerifyUserEmail(user, true) } - return res.sendStatus(HttpStatusCode.NO_CONTENT_204) + return res.status(HttpStatusCode.NO_CONTENT_204).end() } async function updateMyAvatar (req: express.Request, res: express.Response) { @@ -238,9 +261,17 @@ async function updateMyAvatar (req: express.Request, res: express.Response) { const userAccount = await AccountModel.load(user.Account.id) - const avatar = await updateLocalActorImageFile(userAccount, avatarPhysicalFile, ActorImageType.AVATAR) + const avatars = await updateLocalActorImageFiles( + userAccount, + avatarPhysicalFile, + ActorImageType.AVATAR + ) - return res.json({ avatar: avatar.toFormattedJSON() }) + return res.json({ + // TODO: remove, deprecated in 4.2 + avatar: getBiggestActorImage(avatars).toFormattedJSON(), + avatars: avatars.map(avatar => avatar.toFormattedJSON()) + }) } async function deleteMyAvatar (req: express.Request, res: express.Response) { @@ -249,5 +280,5 @@ async function deleteMyAvatar (req: express.Request, res: express.Response) { const userAccount = await AccountModel.load(user.Account.id) await deleteLocalActorImageFile(userAccount, ActorImageType.AVATAR) - return res.sendStatus(HttpStatusCode.NO_CONTENT_204) + return res.json({ avatars: [] }) }