mirror of https://github.com/Chocobozzz/PeerTube
Reset video fields when remote update fails
parent
51c443dbe0
commit
a041b17147
|
@ -16,7 +16,7 @@ import {
|
|||
remoteQaduVideosValidator,
|
||||
remoteEventsVideosValidator
|
||||
} from '../../../middlewares'
|
||||
import { logger, retryTransactionWrapper } from '../../../helpers'
|
||||
import { logger, retryTransactionWrapper, resetSequelizeInstance } from '../../../helpers'
|
||||
import { quickAndDirtyUpdatesVideoToFriends, fetchVideoChannelByHostAndUUID } from '../../../lib'
|
||||
import { PodInstance, VideoFileInstance } from '../../../models'
|
||||
import {
|
||||
|
@ -35,6 +35,7 @@ import {
|
|||
RemoteVideoAuthorRemoveData,
|
||||
RemoteVideoAuthorCreateData
|
||||
} from '../../../../shared'
|
||||
import { VideoInstance } from '../../../models/video/video-interface'
|
||||
|
||||
const ENDPOINT_ACTIONS = REQUEST_ENDPOINT_ACTIONS[REQUEST_ENDPOINTS.VIDEOS]
|
||||
|
||||
|
@ -145,7 +146,7 @@ async function processVideosEventsRetryWrapper (eventData: RemoteVideoEventData,
|
|||
async function processVideosEvents (eventData: RemoteVideoEventData, fromPod: PodInstance) {
|
||||
await db.sequelize.transaction(async t => {
|
||||
const sequelizeOptions = { transaction: t }
|
||||
const videoInstance = await fetchVideoByUUID(eventData.uuid, t)
|
||||
const videoInstance = await fetchLocalVideoByUUID(eventData.uuid, t)
|
||||
|
||||
let columnToUpdate
|
||||
let qaduType
|
||||
|
@ -306,6 +307,8 @@ async function updateRemoteVideoRetryWrapper (videoAttributesToUpdate: RemoteVid
|
|||
|
||||
async function updateRemoteVideo (videoAttributesToUpdate: RemoteVideoUpdateData, fromPod: PodInstance) {
|
||||
logger.debug('Updating remote video "%s".', videoAttributesToUpdate.uuid)
|
||||
let videoInstance: VideoInstance
|
||||
let videoFieldsSave: object
|
||||
|
||||
try {
|
||||
await db.sequelize.transaction(async t => {
|
||||
|
@ -314,6 +317,7 @@ async function updateRemoteVideo (videoAttributesToUpdate: RemoteVideoUpdateData
|
|||
}
|
||||
|
||||
const videoInstance = await fetchVideoByHostAndUUID(fromPod.host, videoAttributesToUpdate.uuid, t)
|
||||
videoFieldsSave = videoInstance.toJSON()
|
||||
const tags = videoAttributesToUpdate.tags
|
||||
|
||||
const tagInstances = await db.Tag.findOrCreateTags(tags, t)
|
||||
|
@ -360,6 +364,10 @@ async function updateRemoteVideo (videoAttributesToUpdate: RemoteVideoUpdateData
|
|||
|
||||
logger.info('Remote video with uuid %s updated', videoAttributesToUpdate.uuid)
|
||||
} catch (err) {
|
||||
if (videoInstance !== undefined && videoFieldsSave !== undefined) {
|
||||
resetSequelizeInstance(videoInstance, videoFieldsSave)
|
||||
}
|
||||
|
||||
// This is just a debug because we will retry the insert
|
||||
logger.debug('Cannot update the remote video.', err)
|
||||
throw err
|
||||
|
@ -538,7 +546,7 @@ async function reportAbuseRemoteVideo (reportData: RemoteVideoReportAbuseData, f
|
|||
logger.debug('Reporting remote abuse for video %s.', reportData.videoUUID)
|
||||
|
||||
await db.sequelize.transaction(async t => {
|
||||
const videoInstance = await fetchVideoByUUID(reportData.videoUUID, t)
|
||||
const videoInstance = await fetchLocalVideoByUUID(reportData.videoUUID, t)
|
||||
const videoAbuseData = {
|
||||
reporterUsername: reportData.reporterUsername,
|
||||
reason: reportData.reportReason,
|
||||
|
@ -553,9 +561,9 @@ async function reportAbuseRemoteVideo (reportData: RemoteVideoReportAbuseData, f
|
|||
logger.info('Remote abuse for video uuid %s created', reportData.videoUUID)
|
||||
}
|
||||
|
||||
async function fetchVideoByUUID (id: string, t: Sequelize.Transaction) {
|
||||
async function fetchLocalVideoByUUID (id: string, t: Sequelize.Transaction) {
|
||||
try {
|
||||
const video = await db.Video.loadByUUID(id, t)
|
||||
const video = await db.Video.loadLocalVideoByUUID(id, t)
|
||||
|
||||
if (!video) throw new Error('Video ' + id + ' not found')
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ export namespace VideoMethods {
|
|||
|
||||
export type Load = (id: number) => Promise<VideoInstance>
|
||||
export type LoadByUUID = (uuid: string, t?: Sequelize.Transaction) => Promise<VideoInstance>
|
||||
export type LoadLocalVideoByUUID = (uuid: string, t?: Sequelize.Transaction) => Promise<VideoInstance>
|
||||
export type LoadByHostAndUUID = (fromHost: string, uuid: string, t?: Sequelize.Transaction) => Promise<VideoInstance>
|
||||
export type LoadAndPopulateAuthor = (id: number) => Promise<VideoInstance>
|
||||
export type LoadAndPopulateAuthorAndPodAndTags = (id: number) => Promise<VideoInstance>
|
||||
|
@ -79,6 +80,7 @@ export interface VideoClass {
|
|||
loadAndPopulateAuthorAndPodAndTags: VideoMethods.LoadAndPopulateAuthorAndPodAndTags
|
||||
loadByHostAndUUID: VideoMethods.LoadByHostAndUUID
|
||||
loadByUUID: VideoMethods.LoadByUUID
|
||||
loadLocalVideoByUUID: VideoMethods.LoadLocalVideoByUUID
|
||||
loadByUUIDAndPopulateAuthorAndPodAndTags: VideoMethods.LoadByUUIDAndPopulateAuthorAndPodAndTags
|
||||
searchAndPopulateAuthorAndPodAndTags: VideoMethods.SearchAndPopulateAuthorAndPodAndTags
|
||||
}
|
||||
|
|
|
@ -80,6 +80,7 @@ let listOwnedAndPopulateAuthorAndTags: VideoMethods.ListOwnedAndPopulateAuthorAn
|
|||
let listOwnedByAuthor: VideoMethods.ListOwnedByAuthor
|
||||
let load: VideoMethods.Load
|
||||
let loadByUUID: VideoMethods.LoadByUUID
|
||||
let loadLocalVideoByUUID: VideoMethods.LoadLocalVideoByUUID
|
||||
let loadAndPopulateAuthor: VideoMethods.LoadAndPopulateAuthor
|
||||
let loadAndPopulateAuthorAndPodAndTags: VideoMethods.LoadAndPopulateAuthorAndPodAndTags
|
||||
let loadByUUIDAndPopulateAuthorAndPodAndTags: VideoMethods.LoadByUUIDAndPopulateAuthorAndPodAndTags
|
||||
|
@ -247,6 +248,7 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da
|
|||
loadAndPopulateAuthorAndPodAndTags,
|
||||
loadByHostAndUUID,
|
||||
loadByUUID,
|
||||
loadLocalVideoByUUID,
|
||||
loadByUUIDAndPopulateAuthorAndPodAndTags,
|
||||
searchAndPopulateAuthorAndPodAndTags
|
||||
]
|
||||
|
@ -899,6 +901,20 @@ loadByUUID = function (uuid: string, t?: Sequelize.Transaction) {
|
|||
return Video.findOne(query)
|
||||
}
|
||||
|
||||
loadLocalVideoByUUID = function (uuid: string, t?: Sequelize.Transaction) {
|
||||
const query: Sequelize.FindOptions<VideoAttributes> = {
|
||||
where: {
|
||||
uuid,
|
||||
remote: false
|
||||
},
|
||||
include: [ Video['sequelize'].models.VideoFile ]
|
||||
}
|
||||
|
||||
if (t !== undefined) query.transaction = t
|
||||
|
||||
return Video.findOne(query)
|
||||
}
|
||||
|
||||
loadAndPopulateAuthor = function (id: number) {
|
||||
const options = {
|
||||
include: [
|
||||
|
|
Loading…
Reference in New Issue