Reset video fields when remote update fails
authorChocobozzz <florian.bigard@gmail.com>
Thu, 26 Oct 2017 09:26:35 +0000 (11:26 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Thu, 26 Oct 2017 09:26:35 +0000 (11:26 +0200)
server/controllers/api/remote/videos.ts
server/models/video/video-interface.ts
server/models/video/video.ts

index bf442c6e58627ba66c73507cfbc24285cd7a719c..d0febdd4b3a4637aec8ea01ac1b1a789d0a5e076 100644 (file)
@@ -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')
 
index dd457bb00620ff476573fc74a1b707ba50c22605..2afbaf09ed5a0f44a545fd4a7c9e8de4a0b3ef4d 100644 (file)
@@ -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
 }
index d9b9764042b45bab0a3030eda67e7a7272049a6e..01a801da30cd4f6f726d92ea93f9980b91a7b5d7 100644 (file)
@@ -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: [