diff options
Diffstat (limited to 'server/helpers/database-utils.ts')
-rw-r--r-- | server/helpers/database-utils.ts | 34 |
1 files changed, 12 insertions, 22 deletions
diff --git a/server/helpers/database-utils.ts b/server/helpers/database-utils.ts index b5dc70c17..ec35295df 100644 --- a/server/helpers/database-utils.ts +++ b/server/helpers/database-utils.ts | |||
@@ -1,12 +1,12 @@ | |||
1 | import * as retry from 'async/retry' | 1 | import * as retry from 'async/retry' |
2 | import * as Bluebird from 'bluebird' | 2 | import * as Bluebird from 'bluebird' |
3 | import { QueryTypes, Transaction } from 'sequelize' | 3 | import { Transaction } from 'sequelize' |
4 | import { Model } from 'sequelize-typescript' | 4 | import { Model } from 'sequelize-typescript' |
5 | import { sequelizeTypescript } from '@server/initializers/database' | 5 | import { sequelizeTypescript } from '@server/initializers/database' |
6 | import { logger } from './logger' | 6 | import { logger } from './logger' |
7 | 7 | ||
8 | function retryTransactionWrapper <T, A, B, C, D> ( | 8 | function retryTransactionWrapper <T, A, B, C, D> ( |
9 | functionToRetry: (arg1: A, arg2: B, arg3: C, arg4: D) => Promise<T> | Bluebird<T>, | 9 | functionToRetry: (arg1: A, arg2: B, arg3: C, arg4: D) => Promise<T>, |
10 | arg1: A, | 10 | arg1: A, |
11 | arg2: B, | 11 | arg2: B, |
12 | arg3: C, | 12 | arg3: C, |
@@ -14,20 +14,20 @@ function retryTransactionWrapper <T, A, B, C, D> ( | |||
14 | ): Promise<T> | 14 | ): Promise<T> |
15 | 15 | ||
16 | function retryTransactionWrapper <T, A, B, C> ( | 16 | function retryTransactionWrapper <T, A, B, C> ( |
17 | functionToRetry: (arg1: A, arg2: B, arg3: C) => Promise<T> | Bluebird<T>, | 17 | functionToRetry: (arg1: A, arg2: B, arg3: C) => Promise<T>, |
18 | arg1: A, | 18 | arg1: A, |
19 | arg2: B, | 19 | arg2: B, |
20 | arg3: C | 20 | arg3: C |
21 | ): Promise<T> | 21 | ): Promise<T> |
22 | 22 | ||
23 | function retryTransactionWrapper <T, A, B> ( | 23 | function retryTransactionWrapper <T, A, B> ( |
24 | functionToRetry: (arg1: A, arg2: B) => Promise<T> | Bluebird<T>, | 24 | functionToRetry: (arg1: A, arg2: B) => Promise<T>, |
25 | arg1: A, | 25 | arg1: A, |
26 | arg2: B | 26 | arg2: B |
27 | ): Promise<T> | 27 | ): Promise<T> |
28 | 28 | ||
29 | function retryTransactionWrapper <T, A> ( | 29 | function retryTransactionWrapper <T, A> ( |
30 | functionToRetry: (arg1: A) => Promise<T> | Bluebird<T>, | 30 | functionToRetry: (arg1: A) => Promise<T>, |
31 | arg1: A | 31 | arg1: A |
32 | ): Promise<T> | 32 | ): Promise<T> |
33 | 33 | ||
@@ -36,7 +36,7 @@ function retryTransactionWrapper <T> ( | |||
36 | ): Promise<T> | 36 | ): Promise<T> |
37 | 37 | ||
38 | function retryTransactionWrapper <T> ( | 38 | function retryTransactionWrapper <T> ( |
39 | functionToRetry: (...args: any[]) => Promise<T> | Bluebird<T>, | 39 | functionToRetry: (...args: any[]) => Promise<T>, |
40 | ...args: any[] | 40 | ...args: any[] |
41 | ): Promise<T> { | 41 | ): Promise<T> { |
42 | return transactionRetryer<T>(callback => { | 42 | return transactionRetryer<T>(callback => { |
@@ -84,25 +84,15 @@ function resetSequelizeInstance (instance: Model<any>, savedFields: object) { | |||
84 | }) | 84 | }) |
85 | } | 85 | } |
86 | 86 | ||
87 | function deleteNonExistingModels <T extends { hasSameUniqueKeysThan (other: T): boolean } & Pick<Model, 'destroy'>> ( | 87 | function filterNonExistingModels <T extends { hasSameUniqueKeysThan (other: T): boolean }> ( |
88 | fromDatabase: T[], | 88 | fromDatabase: T[], |
89 | newModels: T[], | 89 | newModels: T[] |
90 | t: Transaction | ||
91 | ) { | 90 | ) { |
92 | return fromDatabase.filter(f => !newModels.find(newModel => newModel.hasSameUniqueKeysThan(f))) | 91 | return fromDatabase.filter(f => !newModels.find(newModel => newModel.hasSameUniqueKeysThan(f))) |
93 | .map(f => f.destroy({ transaction: t })) | ||
94 | } | 92 | } |
95 | 93 | ||
96 | // Sequelize always skip the update if we only update updatedAt field | 94 | function deleteAllModels <T extends Pick<Model, 'destroy'>> (models: T[], transaction: Transaction) { |
97 | function setAsUpdated (table: string, id: number, transaction?: Transaction) { | 95 | return Promise.all(models.map(f => f.destroy({ transaction }))) |
98 | return sequelizeTypescript.query( | ||
99 | `UPDATE "${table}" SET "updatedAt" = :updatedAt WHERE id = :id`, | ||
100 | { | ||
101 | replacements: { table, id, updatedAt: new Date() }, | ||
102 | type: QueryTypes.UPDATE, | ||
103 | transaction | ||
104 | } | ||
105 | ) | ||
106 | } | 96 | } |
107 | 97 | ||
108 | // --------------------------------------------------------------------------- | 98 | // --------------------------------------------------------------------------- |
@@ -127,7 +117,7 @@ export { | |||
127 | transactionRetryer, | 117 | transactionRetryer, |
128 | updateInstanceWithAnother, | 118 | updateInstanceWithAnother, |
129 | afterCommitIfTransaction, | 119 | afterCommitIfTransaction, |
130 | deleteNonExistingModels, | 120 | filterNonExistingModels, |
131 | setAsUpdated, | 121 | deleteAllModels, |
132 | runInReadCommittedTransaction | 122 | runInReadCommittedTransaction |
133 | } | 123 | } |