123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- import * as express from 'express'
- import 'multer'
- import { UserUpdateMe, UserVideoRate as FormattedUserVideoRate } from '../../../../shared'
- import { getFormattedObjects } from '../../../helpers/utils'
- import { MIMETYPES } from '../../../initializers/constants'
- import { sendUpdateActor } from '../../../lib/activitypub/send'
- import {
- asyncMiddleware,
- asyncRetryTransactionMiddleware,
- authenticate,
- paginationValidator,
- setDefaultPagination,
- setDefaultSort,
- usersUpdateMeValidator,
- usersVideoRatingValidator
- } from '../../../middlewares'
- import { deleteMeValidator, 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 { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model'
- import { updateAvatarValidator } from '../../../middlewares/validators/avatar'
- import { updateActorAvatarFile } from '../../../lib/avatar'
- import { VideoImportModel } from '../../../models/video/video-import'
- import { AccountModel } from '../../../models/account/account'
- import { CONFIG } from '../../../initializers/config'
- import { sequelizeTypescript } from '../../../initializers/database'
- import { sendVerifyUserEmail } from '../../../lib/user'
- const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR })
- const meRouter = express.Router()
- meRouter.get('/me',
- authenticate,
- asyncMiddleware(getUserInformation)
- )
- meRouter.delete('/me',
- authenticate,
- asyncMiddleware(deleteMeValidator),
- asyncMiddleware(deleteMe)
- )
- meRouter.get('/me/video-quota-used',
- authenticate,
- asyncMiddleware(getUserVideoQuotaUsed)
- )
- meRouter.get('/me/videos/imports',
- authenticate,
- paginationValidator,
- videoImportsSortValidator,
- setDefaultSort,
- setDefaultPagination,
- asyncMiddleware(getUserVideoImports)
- )
- meRouter.get('/me/videos',
- authenticate,
- paginationValidator,
- videosSortValidator,
- setDefaultSort,
- setDefaultPagination,
- asyncMiddleware(getUserVideos)
- )
- meRouter.get('/me/videos/:videoId/rating',
- authenticate,
- asyncMiddleware(usersVideoRatingValidator),
- asyncMiddleware(getUserVideoRating)
- )
- meRouter.put('/me',
- authenticate,
- asyncMiddleware(usersUpdateMeValidator),
- asyncRetryTransactionMiddleware(updateMe)
- )
- meRouter.post('/me/avatar/pick',
- authenticate,
- reqAvatarFile,
- updateAvatarValidator,
- asyncRetryTransactionMiddleware(updateMyAvatar)
- )
- // ---------------------------------------------------------------------------
- export {
- meRouter
- }
- // ---------------------------------------------------------------------------
- async function getUserVideos (req: express.Request, res: express.Response) {
- const user = res.locals.oauth.token.User
- const resultList = await VideoModel.listUserVideosForApi(
- user.Account.id,
- req.query.start as number,
- req.query.count as number,
- req.query.sort as VideoSortField,
- req.query.search as string
- )
- const additionalAttributes = {
- waitTranscoding: true,
- state: true,
- scheduledUpdate: true,
- blacklistInfo: true
- }
- return res.json(getFormattedObjects(resultList.data, resultList.total, { additionalAttributes }))
- }
- 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
- )
- return res.json(getFormattedObjects(resultList.data, resultList.total))
- }
- async function getUserInformation (req: express.Request, res: express.Response) {
- // We did not load channels in res.locals.user
- const user = await UserModel.loadForMeAPI(res.locals.oauth.token.user.username)
- return res.json(user.toMeFormattedJSON())
- }
- async function getUserVideoQuotaUsed (req: express.Request, res: express.Response) {
- const user = res.locals.oauth.token.user
- const videoQuotaUsed = await UserModel.getOriginalVideoFileTotalFromUser(user)
- const videoQuotaUsedDaily = await UserModel.getOriginalVideoFileTotalDailyFromUser(user)
- const data: UserVideoQuota = {
- videoQuotaUsed,
- videoQuotaUsedDaily
- }
- return res.json(data)
- }
- async function getUserVideoRating (req: express.Request, res: express.Response) {
- const videoId = res.locals.videoId.id
- const accountId = +res.locals.oauth.token.User.Account.id
- const ratingObj = await AccountVideoRateModel.load(accountId, videoId, null)
- const rating = ratingObj ? ratingObj.type : 'none'
- const json: FormattedUserVideoRate = {
- videoId,
- rating
- }
- return res.json(json)
- }
- async function deleteMe (req: express.Request, res: express.Response) {
- const user = res.locals.oauth.token.User
- await user.destroy()
- return res.sendStatus(204)
- }
- async function updateMe (req: express.Request, res: express.Response) {
- const body: UserUpdateMe = req.body
- let sendVerificationEmail = false
- 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
- if (body.email !== undefined) {
- if (CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION) {
- user.pendingEmail = body.email
- sendVerificationEmail = true
- } else {
- user.email = body.email
- }
- }
- 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) 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(204)
- }
- async function updateMyAvatar (req: express.Request, res: express.Response) {
- const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ]
- const user = res.locals.oauth.token.user
- const userAccount = await AccountModel.load(user.Account.id)
- const avatar = await updateActorAvatarFile(avatarPhysicalFile, userAccount)
- return res.json({ avatar: avatar.toFormattedJSON() })
- }
|