95 lines
2.4 KiB
TypeScript
95 lines
2.4 KiB
TypeScript
import { Transaction } from 'sequelize/types'
|
|
import { logger } from '@server/helpers/logger'
|
|
import { ActorImageModel } from '@server/models/actor/actor-image'
|
|
import { MActorImage, MActorImages } from '@server/types/models'
|
|
import { ActorImageType } from '@shared/models'
|
|
|
|
type ImageInfo = {
|
|
name: string
|
|
fileUrl: string
|
|
height: number
|
|
width: number
|
|
onDisk?: boolean
|
|
}
|
|
|
|
async function updateActorImageInstance (actor: MActorImages, type: ActorImageType, imageInfo: ImageInfo | null, t: Transaction) {
|
|
const oldImageModel = type === ActorImageType.AVATAR
|
|
? actor.Avatar
|
|
: actor.Banner
|
|
|
|
if (oldImageModel) {
|
|
// Don't update the avatar if the file URL did not change
|
|
if (imageInfo?.fileUrl && oldImageModel.fileUrl === imageInfo.fileUrl) return actor
|
|
|
|
try {
|
|
await oldImageModel.destroy({ transaction: t })
|
|
|
|
setActorImage(actor, type, null)
|
|
} catch (err) {
|
|
logger.error('Cannot remove old actor image of actor %s.', actor.url, { err })
|
|
}
|
|
}
|
|
|
|
if (imageInfo) {
|
|
const imageModel = await ActorImageModel.create({
|
|
filename: imageInfo.name,
|
|
onDisk: imageInfo.onDisk ?? false,
|
|
fileUrl: imageInfo.fileUrl,
|
|
height: imageInfo.height,
|
|
width: imageInfo.width,
|
|
type
|
|
}, { transaction: t })
|
|
|
|
setActorImage(actor, type, imageModel)
|
|
}
|
|
|
|
return actor
|
|
}
|
|
|
|
async function deleteActorImageInstance (actor: MActorImages, type: ActorImageType, t: Transaction) {
|
|
try {
|
|
if (type === ActorImageType.AVATAR) {
|
|
await actor.Avatar.destroy({ transaction: t })
|
|
|
|
actor.avatarId = null
|
|
actor.Avatar = null
|
|
} else {
|
|
await actor.Banner.destroy({ transaction: t })
|
|
|
|
actor.bannerId = null
|
|
actor.Banner = null
|
|
}
|
|
} catch (err) {
|
|
logger.error('Cannot remove old image of actor %s.', actor.url, { err })
|
|
}
|
|
|
|
return actor
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export {
|
|
ImageInfo,
|
|
|
|
updateActorImageInstance,
|
|
deleteActorImageInstance
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
function setActorImage (actorModel: MActorImages, type: ActorImageType, imageModel: MActorImage) {
|
|
const id = imageModel
|
|
? imageModel.id
|
|
: null
|
|
|
|
if (type === ActorImageType.AVATAR) {
|
|
actorModel.avatarId = id
|
|
actorModel.Avatar = imageModel
|
|
} else {
|
|
actorModel.bannerId = id
|
|
actorModel.Banner = imageModel
|
|
}
|
|
|
|
return actorModel
|
|
}
|