X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fhelpers%2Fdatabase-utils.ts;h=53f881fb36a4a5fe8a5106bf6783169c2a194cd9;hb=2769e297ca6703f761f9b57792585eb1fc5aac49;hp=dacd747c92c700a0bbd0913e25adfce54f79754e;hpb=0f91ae62df8a37194fea84ce1efa9e733d9c1fd8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/helpers/database-utils.ts b/server/helpers/database-utils.ts index dacd747c9..53f881fb3 100644 --- a/server/helpers/database-utils.ts +++ b/server/helpers/database-utils.ts @@ -1,43 +1,75 @@ -// 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, Sequelize } from 'sequelize-typescript' import { logger } from './logger' -type RetryTransactionWrapperOptions = { errorMessage: string, arguments?: any[] } +function retryTransactionWrapper ( + functionToRetry: (arg1: A, arg2: B, arg3: C) => Promise | Bluebird, + arg1: A, + arg2: B, + arg3: C +): Promise + +function retryTransactionWrapper ( + functionToRetry: (arg1: A, arg2: B) => Promise | Bluebird, + arg1: A, + arg2: B +): Promise + +function retryTransactionWrapper ( + functionToRetry: (arg1: A) => Promise | Bluebird, + arg1: A +): Promise + function retryTransactionWrapper ( - functionToRetry: (...args) => Promise | Bluebird, - options: RetryTransactionWrapperOptions -): Promise { - const args = options.arguments ? options.arguments : [] + functionToRetry: () => Promise | Bluebird +): Promise +function retryTransactionWrapper ( + functionToRetry: (...args: any[]) => Promise | Bluebird, + ...args: any[] +): Promise { return transactionRetryer(callback => { - functionToRetry.apply(this, args) + functionToRetry.apply(null, args) .then((result: T) => callback(null, result)) .catch(err => callback(err)) }) .catch(err => { - logger.error(options.errorMessage, err) + logger.error(`Cannot execute ${functionToRetry.name} with many retries.`, { err }) throw err }) } 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 }) - return willRetry - } - }, func, (err, data) => err ? rej(err) : res(data)) + retry( + { + times: 5, + + errorFilter: err => { + const willRetry = (err.name === 'SequelizeDatabaseError') + logger.debug('Maybe retrying the transaction function.', { willRetry, err }) + return willRetry + } + }, + 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 }