1
0
Fork 0
mirror of https://github.com/Chocobozzz/PeerTube.git synced 2025-10-03 09:49:20 +02:00

Add ability to customize instance logo

This commit is contained in:
Chocobozzz 2025-06-19 14:25:54 +02:00
parent f5fd593976
commit c0f4de6077
No known key found for this signature in database
GPG key ID: 583A612D890159BE
96 changed files with 1910 additions and 532 deletions

View file

@ -1,8 +1,9 @@
import { About, ActorImageType, ActorImageType_Type, CustomConfig, HttpStatusCode, UserRight } from '@peertube/peertube-models'
import { About, ActorImageType, ActorImageType_Type, CustomConfig, HttpStatusCode, LogoType, UserRight } from '@peertube/peertube-models'
import { createReqFiles } from '@server/helpers/express-utils.js'
import { MIMETYPES } from '@server/initializers/constants.js'
import { deleteLocalActorImageFile, updateLocalActorImageFiles } from '@server/lib/local-actor.js'
import { ServerConfigManager } from '@server/lib/server-config-manager.js'
import { deleteUploadImages, logoTypeToUploadImageEnum, replaceUploadImage } from '@server/lib/upload-image.js'
import { ActorImageModel } from '@server/models/actor/actor-image.js'
import { getServerActor } from '@server/models/application/application.js'
import { ModelCache } from '@server/models/shared/model-cache.js'
@ -23,7 +24,12 @@ import {
updateAvatarValidator,
updateBannerValidator
} from '../../middlewares/index.js'
import { customConfigUpdateValidator, ensureConfigIsEditable } from '../../middlewares/validators/config.js'
import {
customConfigUpdateValidator,
ensureConfigIsEditable,
updateInstanceLogoValidator,
updateOrDeleteLogoValidator
} from '../../middlewares/validators/config.js'
const configRouter = express.Router()
@ -100,6 +106,26 @@ configRouter.delete(
// ---------------------------------------------------------------------------
configRouter.post(
'/instance-logo/:logoType/pick',
authenticate,
createReqFiles([ 'logofile' ], MIMETYPES.IMAGE.MIMETYPE_EXT),
ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
updateOrDeleteLogoValidator,
updateInstanceLogoValidator,
asyncMiddleware(updateInstanceLogo)
)
configRouter.delete(
'/instance-logo/:logoType',
authenticate,
ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
updateOrDeleteLogoValidator,
asyncMiddleware(deleteInstanceLogo)
)
// ---------------------------------------------------------------------------
async function getConfig (req: express.Request, res: express.Response) {
const json = await ServerConfigManager.Instance.getServerConfig(req.ip)
@ -187,13 +213,17 @@ function updateInstanceImageFactory (imageType: ActorImageType_Type) {
const imagePhysicalFile = req.files[field][0]
const serverActor = await getServerActor()
await updateLocalActorImageFiles({
accountOrChannel: (await getServerActorWithUpdatedImages(imageType)).Account,
accountOrChannel: serverActor.Account,
imagePhysicalFile,
type: imageType,
sendActorUpdate: false
})
await updateServerActorImages(imageType)
ClientHtml.invalidateCache()
ModelCache.Instance.clearCache('server-account')
@ -203,7 +233,11 @@ function updateInstanceImageFactory (imageType: ActorImageType_Type) {
function deleteInstanceImageFactory (imageType: ActorImageType_Type) {
return async (req: express.Request, res: express.Response) => {
await deleteLocalActorImageFile((await getServerActorWithUpdatedImages(imageType)).Account, imageType)
const serverActor = await getServerActor()
await deleteLocalActorImageFile(serverActor.Account, imageType)
await updateServerActorImages(imageType)
ClientHtml.invalidateCache()
ModelCache.Instance.clearCache('server-account')
@ -212,7 +246,7 @@ function deleteInstanceImageFactory (imageType: ActorImageType_Type) {
}
}
async function getServerActorWithUpdatedImages (imageType: ActorImageType_Type) {
async function updateServerActorImages (imageType: ActorImageType_Type) {
const serverActor = await getServerActor()
const updatedImages = await ActorImageModel.listByActor(serverActor, imageType) // Reload images from DB
@ -224,6 +258,35 @@ async function getServerActorWithUpdatedImages (imageType: ActorImageType_Type)
// ---------------------------------------------------------------------------
async function updateInstanceLogo (req: express.Request, res: express.Response) {
const imagePhysicalFile = req.files['logofile'][0]
await replaceUploadImage({
actor: await getServerActor(),
imagePhysicalFile,
type: logoTypeToUploadImageEnum(req.params.logoType as LogoType)
})
ClientHtml.invalidateCache()
ModelCache.Instance.clearCache('server-account')
return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}
async function deleteInstanceLogo (req: express.Request, res: express.Response) {
await deleteUploadImages({
actor: await getServerActor(),
type: logoTypeToUploadImageEnum(req.params.logoType as LogoType)
})
ClientHtml.invalidateCache()
ModelCache.Instance.clearCache('server-account')
return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}
// ---------------------------------------------------------------------------
export {
configRouter
}
@ -293,6 +356,9 @@ function customConfig (): CustomConfig {
}
},
client: {
header: {
hideInstanceName: CONFIG.CLIENT.HEADER.HIDE_INSTANCE_NAME
},
videos: {
miniature: {
preferAuthorDisplayName: CONFIG.CLIENT.VIDEOS.MINIATURE.PREFER_AUTHOR_DISPLAY_NAME