X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fhelpers%2Fdatabase-utils.ts;h=b3ff42a37b2c68541dd503d008e3f66d1c48f741;hb=ff193d5e3fbe648f689be2e235dcf88daa1bba48;hp=d62462d353db26fdcbfc8ab3d3d4d85db6eb7860;hpb=53abc4c272be9ecc951274458d054dbaf86e594d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/database-utils.ts b/server/helpers/database-utils.ts index d62462d35..b3ff42a37 100644 --- a/server/helpers/database-utils.ts +++ b/server/helpers/database-utils.ts @@ -1,40 +1,52 @@ -// TODO: import from ES6 when retry typing file will include errorFilter function import * as retry from 'async/retry' - +import * as Bluebird from 'bluebird' +import { Model } from 'sequelize-typescript' import { logger } from './logger' type RetryTransactionWrapperOptions = { errorMessage: string, arguments?: any[] } -function retryTransactionWrapper (functionToRetry: (...args) => Promise, options: RetryTransactionWrapperOptions) { +function retryTransactionWrapper ( + functionToRetry: (...args) => Promise | Bluebird, + options: RetryTransactionWrapperOptions +): Promise { const args = options.arguments ? options.arguments : [] - return transactionRetryer(callback => { + return transactionRetryer(callback => { functionToRetry.apply(this, args) - .then(result => callback(null, result)) + .then((result: T) => callback(null, result)) .catch(err => callback(err)) }) .catch(err => { - // Do not throw the error, continue the process - logger.error(options.errorMessage, err) + logger.error(options.errorMessage, { err }) + throw err }) } -function transactionRetryer (func: Function) { - return new Promise((res, rej) => { +function transactionRetryer (func: (err: any, data: T) => any) { + return new Promise((res, rej) => { retry({ times: 5, errorFilter: err => { const willRetry = (err.name === 'SequelizeDatabaseError') - logger.debug('Maybe retrying the transaction function.', { willRetry }) + logger.debug('Maybe retrying the transaction function.', { willRetry, err }) return willRetry } - }, func, err => err ? rej(err) : res()) + }, func, (err, data) => err ? rej(err) : res(data)) }) } +function updateInstanceWithAnother > (instanceToUpdate: Model, baseInstance: Model) { + const obj = baseInstance.toJSON() + + for (const key of Object.keys(obj)) { + instanceToUpdate.set(key, obj[key]) + } +} + // --------------------------------------------------------------------------- export { retryTransactionWrapper, - transactionRetryer + transactionRetryer, + updateInstanceWithAnother }