139 lines
5.0 KiB
TypeScript
139 lines
5.0 KiB
TypeScript
import { ActorImageType, HttpStatusCode, VideoChannelActivityAction } from '@peertube/peertube-models'
|
|
import { VideoChannelActivityModel } from '@server/models/video/video-channel-activity.js'
|
|
import express from 'express'
|
|
import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../../helpers/audit-logger.js'
|
|
import { createReqFiles } from '../../../helpers/express-utils.js'
|
|
import { MIMETYPES } from '../../../initializers/constants.js'
|
|
import { deleteLocalActorImageFile, updateLocalActorImageFiles } from '../../../lib/local-actor.js'
|
|
import { asyncMiddleware, authenticate } from '../../../middlewares/index.js'
|
|
import { updateAvatarValidator, updateBannerValidator } from '../../../middlewares/validators/actor-image.js'
|
|
import { videoChannelsHandleValidatorFactory } from '../../../middlewares/validators/index.js'
|
|
|
|
const auditLogger = auditLoggerFactory('channels')
|
|
const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT)
|
|
const reqBannerFile = createReqFiles([ 'bannerfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT)
|
|
|
|
const videoChannelLogosRouter = express.Router()
|
|
|
|
videoChannelLogosRouter.post(
|
|
'/:handle/avatar/pick',
|
|
authenticate,
|
|
reqAvatarFile,
|
|
asyncMiddleware(videoChannelsHandleValidatorFactory({ checkIsLocal: true, checkCanManage: true, checkIsOwner: false })),
|
|
updateAvatarValidator,
|
|
asyncMiddleware(updateVideoChannelAvatar)
|
|
)
|
|
|
|
videoChannelLogosRouter.post(
|
|
'/:handle/banner/pick',
|
|
authenticate,
|
|
reqBannerFile,
|
|
asyncMiddleware(videoChannelsHandleValidatorFactory({ checkIsLocal: true, checkCanManage: true, checkIsOwner: false })),
|
|
updateBannerValidator,
|
|
asyncMiddleware(updateVideoChannelBanner)
|
|
)
|
|
|
|
videoChannelLogosRouter.delete(
|
|
'/:handle/avatar',
|
|
authenticate,
|
|
asyncMiddleware(videoChannelsHandleValidatorFactory({ checkIsLocal: true, checkCanManage: true, checkIsOwner: false })),
|
|
asyncMiddleware(deleteVideoChannelAvatar)
|
|
)
|
|
|
|
videoChannelLogosRouter.delete(
|
|
'/:handle/banner',
|
|
authenticate,
|
|
asyncMiddleware(videoChannelsHandleValidatorFactory({ checkIsLocal: true, checkCanManage: true, checkIsOwner: false })),
|
|
asyncMiddleware(deleteVideoChannelBanner)
|
|
)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export {
|
|
videoChannelLogosRouter
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
async function updateVideoChannelBanner (req: express.Request, res: express.Response) {
|
|
const bannerPhysicalFile = req.files['bannerfile'][0]
|
|
const videoChannel = res.locals.videoChannel
|
|
const oldVideoChannelAuditKeys = new VideoChannelAuditView(videoChannel.toFormattedJSON())
|
|
|
|
const banners = await updateLocalActorImageFiles({
|
|
accountOrChannel: videoChannel,
|
|
imagePhysicalFile: bannerPhysicalFile,
|
|
type: ActorImageType.BANNER,
|
|
sendActorUpdate: true
|
|
})
|
|
|
|
await VideoChannelActivityModel.addChannelActivity({
|
|
action: VideoChannelActivityAction.UPDATE,
|
|
user: res.locals.oauth.token.User,
|
|
channel: videoChannel,
|
|
transaction: undefined
|
|
})
|
|
|
|
auditLogger.update(getAuditIdFromRes(res), new VideoChannelAuditView(videoChannel.toFormattedJSON()), oldVideoChannelAuditKeys)
|
|
|
|
return res.json({
|
|
banners: banners.map(b => b.toFormattedJSON())
|
|
})
|
|
}
|
|
|
|
async function updateVideoChannelAvatar (req: express.Request, res: express.Response) {
|
|
const avatarPhysicalFile = req.files['avatarfile'][0]
|
|
const videoChannel = res.locals.videoChannel
|
|
const oldVideoChannelAuditKeys = new VideoChannelAuditView(videoChannel.toFormattedJSON())
|
|
|
|
const avatars = await updateLocalActorImageFiles({
|
|
accountOrChannel: videoChannel,
|
|
imagePhysicalFile: avatarPhysicalFile,
|
|
type: ActorImageType.AVATAR,
|
|
sendActorUpdate: true
|
|
})
|
|
|
|
await VideoChannelActivityModel.addChannelActivity({
|
|
action: VideoChannelActivityAction.UPDATE,
|
|
user: res.locals.oauth.token.User,
|
|
channel: videoChannel,
|
|
transaction: undefined
|
|
})
|
|
|
|
auditLogger.update(getAuditIdFromRes(res), new VideoChannelAuditView(videoChannel.toFormattedJSON()), oldVideoChannelAuditKeys)
|
|
|
|
return res.json({
|
|
avatars: avatars.map(a => a.toFormattedJSON())
|
|
})
|
|
}
|
|
|
|
async function deleteVideoChannelAvatar (req: express.Request, res: express.Response) {
|
|
const videoChannel = res.locals.videoChannel
|
|
|
|
await deleteLocalActorImageFile(videoChannel, ActorImageType.AVATAR)
|
|
|
|
await VideoChannelActivityModel.addChannelActivity({
|
|
action: VideoChannelActivityAction.UPDATE,
|
|
user: res.locals.oauth.token.User,
|
|
channel: videoChannel,
|
|
transaction: undefined
|
|
})
|
|
|
|
return res.status(HttpStatusCode.NO_CONTENT_204).end()
|
|
}
|
|
|
|
async function deleteVideoChannelBanner (req: express.Request, res: express.Response) {
|
|
const videoChannel = res.locals.videoChannel
|
|
|
|
await deleteLocalActorImageFile(videoChannel, ActorImageType.BANNER)
|
|
|
|
await VideoChannelActivityModel.addChannelActivity({
|
|
action: VideoChannelActivityAction.UPDATE,
|
|
user: res.locals.oauth.token.User,
|
|
channel: videoChannel,
|
|
transaction: undefined
|
|
})
|
|
|
|
return res.status(HttpStatusCode.NO_CONTENT_204).end()
|
|
}
|