45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
import { PlayerChannelSettings, PlayerVideoSettings, VideoChannelActivityAction } from '@peertube/peertube-models'
|
|
import { retryTransactionWrapper } from '@server/helpers/database-utils.js'
|
|
import { sequelizeTypescript } from '@server/initializers/database.js'
|
|
import { PlayerSettingModel } from '@server/models/video/player-setting.js'
|
|
import { VideoChannelActivityModel } from '@server/models/video/video-channel-activity.js'
|
|
import { MChannelDefault, MUserAccountId, MVideoId } from '@server/types/models/index.js'
|
|
|
|
export async function upsertPlayerSettings (options: {
|
|
user: MUserAccountId
|
|
settings: PlayerVideoSettings | PlayerChannelSettings
|
|
channel: MChannelDefault
|
|
video: MVideoId
|
|
}) {
|
|
const { user, settings, channel, video } = options
|
|
|
|
if (!channel && !video) throw new Error('channel or video must be specified')
|
|
|
|
return retryTransactionWrapper(() => {
|
|
return sequelizeTypescript.transaction(async transaction => {
|
|
const setting = channel
|
|
? await PlayerSettingModel.loadByChannelId(channel.id, transaction)
|
|
: await PlayerSettingModel.loadByVideoId(video.id, transaction)
|
|
|
|
if (setting) await setting.destroy({ transaction })
|
|
|
|
const playerSettings = await PlayerSettingModel.create({
|
|
theme: settings.theme,
|
|
channelId: channel?.id,
|
|
videoId: video?.id
|
|
}, { transaction })
|
|
|
|
if (user && channel) {
|
|
await VideoChannelActivityModel.addChannelActivity({
|
|
action: VideoChannelActivityAction.UPDATE,
|
|
user,
|
|
channel,
|
|
transaction
|
|
})
|
|
}
|
|
|
|
return playerSettings
|
|
})
|
|
})
|
|
}
|