From a041b1714715593b46805d7fd0106501770d11c3 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 26 Oct 2017 11:26:35 +0200 Subject: [PATCH] Reset video fields when remote update fails --- server/controllers/api/remote/videos.ts | 18 +++++++++++++----- server/models/video/video-interface.ts | 2 ++ server/models/video/video.ts | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/server/controllers/api/remote/videos.ts b/server/controllers/api/remote/videos.ts index bf442c6e5..d0febdd4b 100644 --- a/server/controllers/api/remote/videos.ts +++ b/server/controllers/api/remote/videos.ts @@ -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') diff --git a/server/models/video/video-interface.ts b/server/models/video/video-interface.ts index dd457bb00..2afbaf09e 100644 --- a/server/models/video/video-interface.ts +++ b/server/models/video/video-interface.ts @@ -57,6 +57,7 @@ export namespace VideoMethods { export type Load = (id: number) => Promise export type LoadByUUID = (uuid: string, t?: Sequelize.Transaction) => Promise + export type LoadLocalVideoByUUID = (uuid: string, t?: Sequelize.Transaction) => Promise export type LoadByHostAndUUID = (fromHost: string, uuid: string, t?: Sequelize.Transaction) => Promise export type LoadAndPopulateAuthor = (id: number) => Promise export type LoadAndPopulateAuthorAndPodAndTags = (id: number) => Promise @@ -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 } diff --git a/server/models/video/video.ts b/server/models/video/video.ts index d9b976404..01a801da3 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -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 = { + 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: [