Skip to content

Commit 1ef606e

Browse files
authored
Merge pull request #29 from peartherapeutics/master
Use existing transaction if provided instead of creating a new one
2 parents 7697abc + b5ac645 commit 1ef606e

File tree

1 file changed

+96
-49
lines changed

1 file changed

+96
-49
lines changed

src/index.js

Lines changed: 96 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -24,62 +24,109 @@ export default (args) => {
2424
enumName = `enum_${tableName}_${columnName}`
2525
} = args;
2626

27-
const newEnumName = `${enumName}_new`;
28-
29-
return queryInterface.sequelize.transaction(sequelizeOptions, (t) => {
30-
const newSequelizeOptions = {
31-
...(sequelizeOptions || {}),
32-
transaction: t
33-
};
34-
35-
// Create a copy of the type
36-
return createEnum({
27+
if (sequelizeOptions.transaction) {
28+
return replaceEnum({
29+
tableName,
30+
columnName,
31+
defaultValue,
32+
newValues,
3733
queryInterface,
38-
name: newEnumName,
39-
values: newValues,
40-
sequelizeOptions: newSequelizeOptions
41-
})
42-
// Drop default value (ALTER COLUMN cannot cast default values)
43-
.then(() => defaultValue && unsetDefaultValueFromEnum({
44-
queryInterface,
45-
tableName,
46-
columnName,
47-
sequelizeOptions: newSequelizeOptions
48-
}))
49-
// Change column type to the new ENUM TYPE
50-
.then(() => setColumnTypeToEnum({
51-
tableName,
52-
columnName,
53-
enumName: newEnumName,
54-
queryInterface,
55-
sequelizeOptions: newSequelizeOptions
56-
}))
57-
// Drop old ENUM
58-
.then(() => dropEnum(
59-
{
60-
name: enumName,
61-
sequelizeOptions: newSequelizeOptions,
62-
queryInterface
63-
}
64-
))
65-
// Rename new ENUM name
66-
.then(() => renameEnum({
67-
oldEnumName: newEnumName,
68-
newEnumName: enumName,
69-
queryInterface,
70-
sequelizeOptions: newSequelizeOptions
71-
}))
72-
.then(() => defaultValue && setColumnDefault({
34+
newSequelizeOptions: sequelizeOptions,
35+
enumName
36+
});
37+
} else {
38+
return queryInterface.sequelize.transaction(sequelizeOptions, (t) => {
39+
const newSequelizeOptions = {
40+
...(sequelizeOptions || {}),
41+
transaction: t
42+
};
43+
return replaceEnum({
7344
tableName,
7445
columnName,
7546
defaultValue,
76-
defaultValueType: enumName,
47+
newValues,
7748
queryInterface,
78-
sequelizeOptions: newSequelizeOptions
79-
}));
80-
});
49+
newSequelizeOptions,
50+
enumName
51+
});
52+
});
53+
}
8154
};
8255

56+
/**
57+
* Implementation of enum replacement.
58+
*
59+
* @param {Object} args
60+
* @param {String} args.tableName
61+
* @param {String} args.columnName
62+
* @param {String} args.defaultValue
63+
* @param {Array} args.newValues
64+
* @param {Object} args.queryInterface
65+
* @param {Object} args.newSequelizeOptions
66+
* @param {String} args.enumName
67+
*
68+
* @return {Promise}
69+
*/
70+
function replaceEnum(args) {
71+
const {
72+
tableName,
73+
columnName,
74+
defaultValue,
75+
newValues,
76+
queryInterface,
77+
newSequelizeOptions,
78+
enumName
79+
} = args;
80+
81+
const newEnumName = `${enumName}_new`;
82+
83+
// Create a copy of the type
84+
return createEnum({
85+
queryInterface,
86+
name: newEnumName,
87+
values: newValues,
88+
sequelizeOptions: newSequelizeOptions
89+
})
90+
// Drop default value (ALTER COLUMN cannot cast default values)
91+
.then(() => defaultValue && unsetDefaultValueFromEnum({
92+
queryInterface,
93+
tableName,
94+
columnName,
95+
sequelizeOptions: newSequelizeOptions
96+
}))
97+
// Change column type to the new ENUM TYPE
98+
.then(() => setColumnTypeToEnum({
99+
tableName,
100+
columnName,
101+
enumName: newEnumName,
102+
queryInterface,
103+
sequelizeOptions: newSequelizeOptions
104+
}))
105+
// Drop old ENUM
106+
.then(() => dropEnum(
107+
{
108+
name: enumName,
109+
sequelizeOptions: newSequelizeOptions,
110+
queryInterface
111+
}
112+
))
113+
// Rename new ENUM name
114+
.then(() => renameEnum({
115+
oldEnumName: newEnumName,
116+
newEnumName: enumName,
117+
queryInterface,
118+
sequelizeOptions: newSequelizeOptions
119+
}))
120+
.then(() => defaultValue && setColumnDefault({
121+
tableName,
122+
columnName,
123+
defaultValue,
124+
defaultValueType: enumName,
125+
queryInterface,
126+
sequelizeOptions: newSequelizeOptions
127+
}));
128+
}
129+
83130
/**
84131
* Create a new ENUM.
85132
*

0 commit comments

Comments
 (0)