@takaro/db 0.0.15 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/dist/TakaroModel.d.ts +1 -0
  2. package/dist/TakaroModel.d.ts.map +1 -0
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/encryption.d.ts +1 -0
  6. package/dist/encryption.d.ts.map +1 -0
  7. package/dist/errorTypeGuards.d.ts +1 -0
  8. package/dist/errorTypeGuards.d.ts.map +1 -0
  9. package/dist/knex.d.ts +1 -0
  10. package/dist/knex.d.ts.map +1 -0
  11. package/dist/main.d.ts +1 -0
  12. package/dist/main.d.ts.map +1 -0
  13. package/dist/migrations/index.d.ts +1 -0
  14. package/dist/migrations/index.d.ts.map +1 -0
  15. package/dist/migrations/sql/20220827191938_init.d.ts +1 -0
  16. package/dist/migrations/sql/20220827191938_init.d.ts.map +1 -0
  17. package/dist/migrations/sql/20221019173729_settings.d.ts +1 -0
  18. package/dist/migrations/sql/20221019173729_settings.d.ts.map +1 -0
  19. package/dist/migrations/sql/20221029103554_refactor_function_assignments.d.ts +1 -0
  20. package/dist/migrations/sql/20221029103554_refactor_function_assignments.d.ts.map +1 -0
  21. package/dist/migrations/sql/20221102190532_commands.d.ts +1 -0
  22. package/dist/migrations/sql/20221102190532_commands.d.ts.map +1 -0
  23. package/dist/migrations/sql/20221203135001-builtin_modules.d.ts +1 -0
  24. package/dist/migrations/sql/20221203135001-builtin_modules.d.ts.map +1 -0
  25. package/dist/migrations/sql/20230308183400-persistent-variables.d.ts +1 -0
  26. package/dist/migrations/sql/20230308183400-persistent-variables.d.ts.map +1 -0
  27. package/dist/migrations/sql/20230314183400-auth-ory.d.ts +1 -0
  28. package/dist/migrations/sql/20230314183400-auth-ory.d.ts.map +1 -0
  29. package/dist/migrations/sql/20230325156123_command-arguments.d.ts +1 -0
  30. package/dist/migrations/sql/20230325156123_command-arguments.d.ts.map +1 -0
  31. package/dist/migrations/sql/20230407132022-module-descriptions.d.ts +1 -0
  32. package/dist/migrations/sql/20230407132022-module-descriptions.d.ts.map +1 -0
  33. package/dist/migrations/sql/20230407143733-module-json-schema-config.d.ts +1 -0
  34. package/dist/migrations/sql/20230407143733-module-json-schema-config.d.ts.map +1 -0
  35. package/dist/migrations/sql/20230407173055-hook-regex-optional.d.ts +1 -0
  36. package/dist/migrations/sql/20230407173055-hook-regex-optional.d.ts.map +1 -0
  37. package/dist/migrations/sql/20230415154935-cronjob-configs.d.ts +1 -0
  38. package/dist/migrations/sql/20230415154935-cronjob-configs.d.ts.map +1 -0
  39. package/dist/migrations/sql/20230503132906-variables-extra-meta.d.ts +1 -0
  40. package/dist/migrations/sql/20230503132906-variables-extra-meta.d.ts.map +1 -0
  41. package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.d.ts +1 -0
  42. package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.d.ts.map +1 -0
  43. package/dist/migrations/sql/20230617081049-discordId-for-users.d.ts +1 -0
  44. package/dist/migrations/sql/20230617081049-discordId-for-users.d.ts.map +1 -0
  45. package/dist/migrations/sql/20230618053611-discord-funtionality.d.ts +1 -0
  46. package/dist/migrations/sql/20230618053611-discord-funtionality.d.ts.map +1 -0
  47. package/dist/migrations/sql/20230622192402-discord-hooks.d.ts +1 -0
  48. package/dist/migrations/sql/20230622192402-discord-hooks.d.ts.map +1 -0
  49. package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.d.ts +1 -0
  50. package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.d.ts.map +1 -0
  51. package/dist/migrations/sql/20230710174340-events.d.ts +1 -0
  52. package/dist/migrations/sql/20230710174340-events.d.ts.map +1 -0
  53. package/dist/migrations/sql/20230712061220-roles-permissions-extension.d.ts +1 -0
  54. package/dist/migrations/sql/20230712061220-roles-permissions-extension.d.ts.map +1 -0
  55. package/dist/migrations/sql/20230713184927-variables-modulescoped.d.ts +1 -0
  56. package/dist/migrations/sql/20230713184927-variables-modulescoped.d.ts.map +1 -0
  57. package/dist/migrations/sql/20230714045136-domain-index.d.ts +1 -0
  58. package/dist/migrations/sql/20230714045136-domain-index.d.ts.map +1 -0
  59. package/dist/migrations/sql/20230714045727-events-index.d.ts +1 -0
  60. package/dist/migrations/sql/20230714045727-events-index.d.ts.map +1 -0
  61. package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.d.ts +1 -0
  62. package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.d.ts.map +1 -0
  63. package/dist/migrations/sql/20230724062109-roles-constraints.d.ts +1 -0
  64. package/dist/migrations/sql/20230724062109-roles-constraints.d.ts.map +1 -0
  65. package/dist/migrations/sql/20230811095701-userId-on-events.d.ts +1 -0
  66. package/dist/migrations/sql/20230811095701-userId-on-events.d.ts.map +1 -0
  67. package/dist/migrations/sql/20230921123717-count-for-permissions.d.ts +1 -0
  68. package/dist/migrations/sql/20230921123717-count-for-permissions.d.ts.map +1 -0
  69. package/dist/migrations/sql/20231111102812-details-system-permissions.d.ts +1 -0
  70. package/dist/migrations/sql/20231111102812-details-system-permissions.d.ts.map +1 -0
  71. package/dist/migrations/sql/20231114151343-system-roles.d.ts +1 -0
  72. package/dist/migrations/sql/20231114151343-system-roles.d.ts.map +1 -0
  73. package/dist/migrations/sql/20231118082301-add-new-permissions.d.ts +1 -0
  74. package/dist/migrations/sql/20231118082301-add-new-permissions.d.ts.map +1 -0
  75. package/dist/migrations/sql/20231119115037-timedRoles.d.ts +1 -0
  76. package/dist/migrations/sql/20231119115037-timedRoles.d.ts.map +1 -0
  77. package/dist/migrations/sql/20231123150854-economy-base.d.ts +1 -0
  78. package/dist/migrations/sql/20231123150854-economy-base.d.ts.map +1 -0
  79. package/dist/migrations/sql/20231123171611-economy-settings.d.ts +1 -0
  80. package/dist/migrations/sql/20231123171611-economy-settings.d.ts.map +1 -0
  81. package/dist/migrations/sql/20231124140441-json-module-assignments.d.ts +1 -0
  82. package/dist/migrations/sql/20231124140441-json-module-assignments.d.ts.map +1 -0
  83. package/dist/migrations/sql/20231208114507-settings-refactor.d.ts +1 -0
  84. package/dist/migrations/sql/20231208114507-settings-refactor.d.ts.map +1 -0
  85. package/dist/migrations/sql/20231208171234-game-items.d.ts +1 -0
  86. package/dist/migrations/sql/20231208171234-game-items.d.ts.map +1 -0
  87. package/dist/migrations/sql/20231216100720-player-inventory.d.ts +1 -0
  88. package/dist/migrations/sql/20231216100720-player-inventory.d.ts.map +1 -0
  89. package/dist/migrations/sql/20231222180438-steam-data.d.ts +1 -0
  90. package/dist/migrations/sql/20231222180438-steam-data.d.ts.map +1 -0
  91. package/dist/migrations/sql/20231223132631-pog-online.d.ts +1 -0
  92. package/dist/migrations/sql/20231223132631-pog-online.d.ts.map +1 -0
  93. package/dist/migrations/sql/20231223212031-unique-index-item-def.d.ts +1 -0
  94. package/dist/migrations/sql/20231223212031-unique-index-item-def.d.ts.map +1 -0
  95. package/dist/migrations/sql/20231224135126-gameserver-online-status.d.ts +1 -0
  96. package/dist/migrations/sql/20231224135126-gameserver-online-status.d.ts.map +1 -0
  97. package/dist/migrations/sql/20231224155226-unique-pog.d.ts +1 -0
  98. package/dist/migrations/sql/20231224155226-unique-pog.d.ts.map +1 -0
  99. package/dist/migrations/sql/20231225140650-extra-ip-info.d.ts +1 -0
  100. package/dist/migrations/sql/20231225140650-extra-ip-info.d.ts.map +1 -0
  101. package/dist/migrations/sql/20231227144315-unique-constraints-player.d.ts +1 -0
  102. package/dist/migrations/sql/20231227144315-unique-constraints-player.d.ts.map +1 -0
  103. package/dist/migrations/sql/20231229144707-more-player-constraints.d.ts +1 -0
  104. package/dist/migrations/sql/20231229144707-more-player-constraints.d.ts.map +1 -0
  105. package/dist/migrations/sql/20240101162751-add-settings-constraint.d.ts +1 -0
  106. package/dist/migrations/sql/20240101162751-add-settings-constraint.d.ts.map +1 -0
  107. package/dist/migrations/sql/20240105130846-remove-some-module-perms.d.ts +1 -0
  108. package/dist/migrations/sql/20240105130846-remove-some-module-perms.d.ts.map +1 -0
  109. package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.d.ts +1 -0
  110. package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.d.ts.map +1 -0
  111. package/dist/migrations/sql/20240119152426-remove-hook-check.d.ts +1 -0
  112. package/dist/migrations/sql/20240119152426-remove-hook-check.d.ts.map +1 -0
  113. package/dist/migrations/sql/20240121142329-move-ip-history.d.ts +1 -0
  114. package/dist/migrations/sql/20240121142329-move-ip-history.d.ts.map +1 -0
  115. package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.d.ts +1 -0
  116. package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.d.ts.map +1 -0
  117. package/dist/migrations/sql/20240216120143-domain-state.d.ts +1 -0
  118. package/dist/migrations/sql/20240216120143-domain-state.d.ts.map +1 -0
  119. package/dist/migrations/sql/20240229141340-looser-fks-events.d.ts +1 -0
  120. package/dist/migrations/sql/20240229141340-looser-fks-events.d.ts.map +1 -0
  121. package/dist/migrations/sql/20240301063505-module-functions.d.ts +1 -0
  122. package/dist/migrations/sql/20240301063505-module-functions.d.ts.map +1 -0
  123. package/dist/migrations/sql/20240613175009-lastseen-users-pog.d.ts +1 -0
  124. package/dist/migrations/sql/20240613175009-lastseen-users-pog.d.ts.map +1 -0
  125. package/dist/migrations/sql/20240614143517-shop.d.ts +1 -0
  126. package/dist/migrations/sql/20240614143517-shop.d.ts.map +1 -0
  127. package/dist/migrations/sql/20240615145045-user-player-link.d.ts +1 -0
  128. package/dist/migrations/sql/20240615145045-user-player-link.d.ts.map +1 -0
  129. package/dist/migrations/sql/20240622132552-fix-ip-history-fk.d.ts +1 -0
  130. package/dist/migrations/sql/20240622132552-fix-ip-history-fk.d.ts.map +1 -0
  131. package/dist/migrations/sql/20240626200803-player-inventory-idx.d.ts +1 -0
  132. package/dist/migrations/sql/20240626200803-player-inventory-idx.d.ts.map +1 -0
  133. package/dist/migrations/sql/20240628174914-shop-orders.d.ts +1 -0
  134. package/dist/migrations/sql/20240628174914-shop-orders.d.ts.map +1 -0
  135. package/dist/migrations/sql/20240705140358-teleports-public-refactor.d.ts +1 -0
  136. package/dist/migrations/sql/20240705140358-teleports-public-refactor.d.ts.map +1 -0
  137. package/dist/migrations/sql/20240710181429-events-name-idx.d.ts +1 -0
  138. package/dist/migrations/sql/20240710181429-events-name-idx.d.ts.map +1 -0
  139. package/dist/migrations/sql/20240711181423-shop-orders-multi-listing.d.ts +1 -0
  140. package/dist/migrations/sql/20240711181423-shop-orders-multi-listing.d.ts.map +1 -0
  141. package/dist/migrations/sql/20240718121004-delete-read-gameservers-perm.d.ts +1 -0
  142. package/dist/migrations/sql/20240718121004-delete-read-gameservers-perm.d.ts.map +1 -0
  143. package/dist/migrations/sql/20240718150807-listing-deleted-and-draft-status.d.ts +1 -0
  144. package/dist/migrations/sql/20240718150807-listing-deleted-and-draft-status.d.ts.map +1 -0
  145. package/dist/migrations/sql/20240720135010-acting-user-and-module.d.ts +1 -0
  146. package/dist/migrations/sql/20240720135010-acting-user-and-module.d.ts.map +1 -0
  147. package/dist/migrations/sql/20240811061243-domain-rate-limit-setting.d.ts +1 -0
  148. package/dist/migrations/sql/20240811061243-domain-rate-limit-setting.d.ts.map +1 -0
  149. package/dist/migrations/sql/20240814133931-domain-ext-ref.d.ts +1 -0
  150. package/dist/migrations/sql/20240814133931-domain-ext-ref.d.ts.map +1 -0
  151. package/dist/migrations/sql/20240816171220-player-steam-level.d.ts +1 -0
  152. package/dist/migrations/sql/20240816171220-player-steam-level.d.ts.map +1 -0
  153. package/dist/migrations/sql/20240830081157-variable-expiry.d.ts +1 -0
  154. package/dist/migrations/sql/20240830081157-variable-expiry.d.ts.map +1 -0
  155. package/dist/migrations/sql/20240906125101-gameserver-enable.d.ts +1 -0
  156. package/dist/migrations/sql/20240906125101-gameserver-enable.d.ts.map +1 -0
  157. package/dist/migrations/sql/20240908185212-domain-name-not-unique.d.ts +1 -0
  158. package/dist/migrations/sql/20240908185212-domain-name-not-unique.d.ts.map +1 -0
  159. package/dist/migrations/sql/20240922110414-player-playtime.d.ts +1 -0
  160. package/dist/migrations/sql/20240922110414-player-playtime.d.ts.map +1 -0
  161. package/dist/migrations/sql/20240922133738-add-bans.d.ts +1 -0
  162. package/dist/migrations/sql/20240922133738-add-bans.d.ts.map +1 -0
  163. package/dist/migrations/sql/20240929090313-global-playtime.d.ts +1 -0
  164. package/dist/migrations/sql/20240929090313-global-playtime.d.ts.map +1 -0
  165. package/dist/migrations/sql/20240929143849-player-name-null.d.ts +1 -0
  166. package/dist/migrations/sql/20240929143849-player-name-null.d.ts.map +1 -0
  167. package/dist/migrations/sql/20241012183754-shop-orders-belong-to-player.d.ts +1 -0
  168. package/dist/migrations/sql/20241012183754-shop-orders-belong-to-player.d.ts.map +1 -0
  169. package/dist/migrations/sql/20241013173159-add-indexen-for-moduleId.d.ts +1 -0
  170. package/dist/migrations/sql/20241013173159-add-indexen-for-moduleId.d.ts.map +1 -0
  171. package/dist/migrations/sql/20241020133133-make-listing-name-required.d.ts +1 -0
  172. package/dist/migrations/sql/20241020133133-make-listing-name-required.d.ts.map +1 -0
  173. package/dist/migrations/sql/20241024164331-events-fk-fix.d.ts +1 -0
  174. package/dist/migrations/sql/20241024164331-events-fk-fix.d.ts.map +1 -0
  175. package/dist/migrations/sql/20241030130613-index-for-roleId.d.ts +1 -0
  176. package/dist/migrations/sql/20241030130613-index-for-roleId.d.ts.map +1 -0
  177. package/dist/migrations/sql/20241205201123-gameserver-deletedAt.d.ts +4 -0
  178. package/dist/migrations/sql/20241205201123-gameserver-deletedAt.d.ts.map +1 -0
  179. package/dist/migrations/sql/20241205201123-gameserver-deletedAt.js +11 -0
  180. package/dist/migrations/sql/20241205201123-gameserver-deletedAt.js.map +1 -0
  181. package/dist/migrations/sql/20241330200212-module-versions.d.ts +4 -0
  182. package/dist/migrations/sql/20241330200212-module-versions.d.ts.map +1 -0
  183. package/dist/migrations/sql/20241330200212-module-versions.js +329 -0
  184. package/dist/migrations/sql/20241330200212-module-versions.js.map +1 -0
  185. package/dist/migrations/sql/20250128200529-version-fixes.d.ts +4 -0
  186. package/dist/migrations/sql/20250128200529-version-fixes.d.ts.map +1 -0
  187. package/dist/migrations/sql/20250128200529-version-fixes.js +11 -0
  188. package/dist/migrations/sql/20250128200529-version-fixes.js.map +1 -0
  189. package/dist/migrations/sql/20250131183251-domain-settings.d.ts +4 -0
  190. package/dist/migrations/sql/20250131183251-domain-settings.d.ts.map +1 -0
  191. package/dist/migrations/sql/20250131183251-domain-settings.js +45 -0
  192. package/dist/migrations/sql/20250131183251-domain-settings.js.map +1 -0
  193. package/dist/migrations/sql/20250221130042-variable-length.d.ts +17 -0
  194. package/dist/migrations/sql/20250221130042-variable-length.d.ts.map +1 -0
  195. package/dist/migrations/sql/20250221130042-variable-length.js +30 -0
  196. package/dist/migrations/sql/20250221130042-variable-length.js.map +1 -0
  197. package/dist/migrations/sql/20250221193144-versions-perf-improvements.d.ts +10 -0
  198. package/dist/migrations/sql/20250221193144-versions-perf-improvements.d.ts.map +1 -0
  199. package/dist/migrations/sql/20250221193144-versions-perf-improvements.js +61 -0
  200. package/dist/migrations/sql/20250221193144-versions-perf-improvements.js.map +1 -0
  201. package/dist/migrations/sql/20250223143705-fix-ban-constraint.d.ts +4 -0
  202. package/dist/migrations/sql/20250223143705-fix-ban-constraint.d.ts.map +1 -0
  203. package/dist/migrations/sql/20250223143705-fix-ban-constraint.js +37 -0
  204. package/dist/migrations/sql/20250223143705-fix-ban-constraint.js.map +1 -0
  205. package/dist/migrations/sql/20250305210650-more-module-metadata.d.ts +4 -0
  206. package/dist/migrations/sql/20250305210650-more-module-metadata.d.ts.map +1 -0
  207. package/dist/migrations/sql/20250305210650-more-module-metadata.js +37 -0
  208. package/dist/migrations/sql/20250305210650-more-module-metadata.js.map +1 -0
  209. package/dist/migrations/sql/20250307162855-default-systemconfig.d.ts +4 -0
  210. package/dist/migrations/sql/20250307162855-default-systemconfig.d.ts.map +1 -0
  211. package/dist/migrations/sql/20250307162855-default-systemconfig.js +11 -0
  212. package/dist/migrations/sql/20250307162855-default-systemconfig.js.map +1 -0
  213. package/dist/migrations/sql/20250312184104-unique-external-reference.d.ts +4 -0
  214. package/dist/migrations/sql/20250312184104-unique-external-reference.d.ts.map +1 -0
  215. package/dist/migrations/sql/20250312184104-unique-external-reference.js +11 -0
  216. package/dist/migrations/sql/20250312184104-unique-external-reference.js.map +1 -0
  217. package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.d.ts +4 -0
  218. package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.d.ts.map +1 -0
  219. package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.js +15 -0
  220. package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.js.map +1 -0
  221. package/dist/migrations/sql/20250315191707-fix-constraint-module-items.d.ts +8 -0
  222. package/dist/migrations/sql/20250315191707-fix-constraint-module-items.d.ts.map +1 -0
  223. package/dist/migrations/sql/20250315191707-fix-constraint-module-items.js +17 -0
  224. package/dist/migrations/sql/20250315191707-fix-constraint-module-items.js.map +1 -0
  225. package/dist/migrations/util/alterEnum.d.ts +1 -0
  226. package/dist/migrations/util/alterEnum.d.ts.map +1 -0
  227. package/dist/queryBuilder.d.ts +1 -0
  228. package/dist/queryBuilder.d.ts.map +1 -0
  229. package/dist/redis.d.ts +1 -0
  230. package/dist/redis.d.ts.map +1 -0
  231. package/package.json +2 -13
  232. package/src/__tests__/encryption.integration.test.ts +1 -0
  233. package/src/__tests__/queryBuilder.integration.test.ts +1 -0
  234. package/src/migrations/sql/20241205201123-gameserver-deletedAt.ts +13 -0
  235. package/src/migrations/sql/20241330200212-module-versions.ts +384 -0
  236. package/src/migrations/sql/20250128200529-version-fixes.ts +13 -0
  237. package/src/migrations/sql/20250131183251-domain-settings.ts +55 -0
  238. package/src/migrations/sql/20250221130042-variable-length.ts +35 -0
  239. package/src/migrations/sql/20250221193144-versions-perf-improvements.ts +79 -0
  240. package/src/migrations/sql/20250223143705-fix-ban-constraint.ts +43 -0
  241. package/src/migrations/sql/20250305210650-more-module-metadata.ts +49 -0
  242. package/src/migrations/sql/20250307162855-default-systemconfig.ts +13 -0
  243. package/src/migrations/sql/20250312184104-unique-external-reference.ts +13 -0
  244. package/src/migrations/sql/20250314185501-root-users-not-dashboard-user.ts +17 -0
  245. package/src/migrations/sql/20250315191707-fix-constraint-module-items.ts +26 -0
  246. package/tsconfig.json +1 -1
@@ -0,0 +1,384 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ // Create a new table for module versions
5
+ await knex.schema.createTable('moduleVersions', (table) => {
6
+ table.timestamps(true, true, true);
7
+ table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
8
+ table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
9
+ table.index('domain');
10
+ table.uuid('moduleId').notNullable().references('modules.id').onDelete('CASCADE');
11
+ table.string('tag').notNullable().defaultTo('0.0.1');
12
+ table.unique(['moduleId', 'tag']);
13
+
14
+ table.text('description').nullable();
15
+ table.text('configSchema').nullable();
16
+ table.text('uiSchema').nullable();
17
+ });
18
+
19
+ // Copy over all existing modules
20
+ const modules = await knex('modules').select('id', 'domain', 'description', 'configSchema', 'uiSchema');
21
+ console.log(`Migrating ${modules.length} modules to moduleVersions`);
22
+ for (const mod of modules) {
23
+ await knex('moduleVersions').insert({
24
+ domain: mod.domain,
25
+ moduleId: mod.id,
26
+ description: mod.description,
27
+ configSchema: mod.configSchema,
28
+ uiSchema: mod.uiSchema,
29
+ tag: 'latest',
30
+ });
31
+ }
32
+
33
+ // Delete the old columns
34
+ await knex.schema.table('modules', (table) => {
35
+ table.dropColumn('description');
36
+ table.dropColumn('configSchema');
37
+ table.dropColumn('uiSchema');
38
+ });
39
+
40
+ // Rename table moduleAssignments to moduleInstallations
41
+ await knex.schema.renameTable('moduleAssignments', 'moduleInstallations');
42
+
43
+ // Prepare versionId column in moduleInstallations
44
+ await knex.schema.table('moduleInstallations', (table) => {
45
+ table.uuid('versionId');
46
+ table.dropUnique(['gameserverId', 'moduleId', 'domain'], 'moduleassignments_gameserverid_moduleid_domain_unique');
47
+ });
48
+
49
+ // For each module installation, find the latest version and set it as the versionId
50
+ // There's a lot of installs, so we'll do this in batches
51
+ const batchSize = 100;
52
+ let offset = 0;
53
+ let installs;
54
+ do {
55
+ installs = await knex('moduleInstallations')
56
+ .select('id', 'moduleId')
57
+ .limit(batchSize)
58
+ .offset(offset)
59
+ .orderBy('createdAt');
60
+ for (const install of installs) {
61
+ const latestVersion = await knex('moduleVersions')
62
+ .select('id')
63
+ .where('moduleId', install.moduleId)
64
+ .orderBy('createdAt', 'desc')
65
+ .first();
66
+ await knex('moduleInstallations').where('id', install.id).update({ versionId: latestVersion.id });
67
+ }
68
+ offset += batchSize;
69
+ } while (installs.length === batchSize);
70
+
71
+ await knex('moduleInstallations').whereNull('versionId').delete();
72
+
73
+ // Set versionId as not nullable and add foreign key constraint
74
+ await knex.schema.alterTable('moduleInstallations', (table) => {
75
+ table.uuid('versionId').notNullable().alter();
76
+ table.foreign('versionId').references('moduleVersions.id').onDelete('CASCADE');
77
+ });
78
+
79
+ // Now, we also need to move the commands,hooks and cronjobs to the moduleVersions table
80
+ // Currently, they have an FK to modules, but we need to replace them with moduleVersions
81
+ // Same logic here, let's just link all of them to the latest version of the module (which is the only one that should exist)
82
+
83
+ // First, let's remove the old FKs
84
+ // And add a new column for the versionId
85
+ await knex.schema.alterTable('commands', (table) => {
86
+ table.dropForeign('moduleId');
87
+ table.uuid('versionId');
88
+ });
89
+
90
+ await knex.schema.alterTable('hooks', (table) => {
91
+ table.dropForeign('moduleId');
92
+ table.uuid('versionId');
93
+ });
94
+
95
+ await knex.schema.alterTable('cronJobs', (table) => {
96
+ table.dropForeign('moduleId');
97
+ table.uuid('versionId');
98
+ });
99
+
100
+ await knex.schema.alterTable('permission', (table) => {
101
+ table.dropForeign('moduleId', 'modulepermission_moduleid_foreign');
102
+ table.uuid('moduleVersionId');
103
+ });
104
+
105
+ await knex.schema.alterTable('functions', (table) => {
106
+ table.dropForeign('moduleId');
107
+ table.uuid('versionId');
108
+ });
109
+
110
+ offset = 0;
111
+ let commands;
112
+ do {
113
+ commands = await knex('commands').select('id', 'moduleId').limit(batchSize).offset(offset).orderBy('createdAt');
114
+ for (const command of commands) {
115
+ const latestVersion = await knex('moduleVersions')
116
+ .select('id')
117
+ .where('moduleId', command.moduleId)
118
+ .orderBy('createdAt', 'desc')
119
+ .first();
120
+ await knex('commands').where('id', command.id).update({ versionId: latestVersion.id });
121
+ }
122
+ offset += batchSize;
123
+ } while (commands.length === batchSize);
124
+
125
+ offset = 0;
126
+ let hooks;
127
+ do {
128
+ hooks = await knex('hooks').select('id', 'moduleId').limit(batchSize).offset(offset).orderBy('createdAt');
129
+ for (const hook of hooks) {
130
+ const latestVersion = await knex('moduleVersions')
131
+ .select('id')
132
+ .where('moduleId', hook.moduleId)
133
+ .orderBy('createdAt', 'desc')
134
+ .first();
135
+ await knex('hooks').where('id', hook.id).update({ versionId: latestVersion.id });
136
+ }
137
+ offset += batchSize;
138
+ } while (hooks.length === batchSize);
139
+
140
+ offset = 0;
141
+ let cronjobs;
142
+ do {
143
+ cronjobs = await knex('cronJobs').select('id', 'moduleId').limit(batchSize).offset(offset).orderBy('createdAt');
144
+ for (const cronjob of cronjobs) {
145
+ const latestVersion = await knex('moduleVersions')
146
+ .select('id')
147
+ .where('moduleId', cronjob.moduleId)
148
+ .orderBy('createdAt', 'desc')
149
+ .first();
150
+ await knex('cronJobs').where('id', cronjob.id).update({ versionId: latestVersion.id });
151
+ }
152
+ offset += batchSize;
153
+ } while (cronjobs.length === batchSize);
154
+
155
+ offset = 0;
156
+ let permissions;
157
+ do {
158
+ permissions = await knex('permission')
159
+ .select('id', 'moduleId')
160
+ .limit(batchSize)
161
+ .offset(offset)
162
+ .orderBy('createdAt');
163
+ for (const permission of permissions) {
164
+ if (!permission.moduleId) {
165
+ // Not a module scoped permission, so skip
166
+ continue;
167
+ }
168
+ const latestVersion = await knex('moduleVersions')
169
+ .select('id')
170
+ .where('moduleId', permission.moduleId)
171
+ .orderBy('createdAt', 'desc')
172
+ .first();
173
+ await knex('permission').where('id', permission.id).update({ moduleVersionId: latestVersion.id });
174
+ }
175
+ offset += batchSize;
176
+ } while (permissions.length === batchSize);
177
+
178
+ offset = 0;
179
+ let functions;
180
+ do {
181
+ functions = await knex('functions').select('id', 'moduleId').limit(batchSize).offset(offset).orderBy('createdAt');
182
+ for (const func of functions) {
183
+ if (!func.moduleId) {
184
+ // Not module scoped, so skip
185
+ continue;
186
+ }
187
+ const latestVersion = await knex('moduleVersions')
188
+ .select('id')
189
+ .where('moduleId', func.moduleId)
190
+ .orderBy('createdAt', 'desc')
191
+ .first();
192
+ await knex('functions').where('id', func.id).update({ versionId: latestVersion.id });
193
+ }
194
+ offset += batchSize;
195
+ } while (functions.length === batchSize);
196
+
197
+ // Finally, let's drop old columns and ensure new FK is in place
198
+ const orphanedCommands = await knex('commands').delete().whereNull('versionId');
199
+ console.log(`Deleted ${orphanedCommands} orphaned commands`);
200
+ const orphanedHooks = await knex('hooks').delete().whereNull('versionId');
201
+ console.log(`Deleted ${orphanedHooks} orphaned hooks`);
202
+ const orphanedCronjobs = await knex('cronJobs').delete().whereNull('versionId');
203
+ console.log(`Deleted ${orphanedCronjobs} orphaned cronjobs`);
204
+
205
+ await knex.schema.alterTable('commands', (table) => {
206
+ table.dropColumn('moduleId');
207
+ table.uuid('versionId').notNullable().alter();
208
+ table.foreign('versionId').references('moduleVersions.id').onDelete('CASCADE');
209
+ });
210
+
211
+ await knex.schema.alterTable('hooks', (table) => {
212
+ table.dropColumn('moduleId');
213
+ table.uuid('versionId').notNullable().alter();
214
+ table.foreign('versionId').references('moduleVersions.id').onDelete('CASCADE');
215
+ });
216
+
217
+ await knex.schema.alterTable('cronJobs', (table) => {
218
+ table.dropColumn('moduleId');
219
+ table.uuid('versionId').notNullable().alter();
220
+ table.foreign('versionId').references('moduleVersions.id').onDelete('CASCADE');
221
+ });
222
+
223
+ await knex.schema.alterTable('permission', (table) => {
224
+ table.dropColumn('moduleId');
225
+ table.uuid('moduleVersionId').nullable().alter();
226
+ table.foreign('moduleVersionId').references('moduleVersions.id').onDelete('CASCADE');
227
+ });
228
+
229
+ await knex.schema.alterTable('functions', (table) => {
230
+ table.dropColumn('moduleId');
231
+ table.uuid('versionId').nullable().alter();
232
+ table.foreign('versionId').references('moduleVersions.id').onDelete('CASCADE');
233
+ });
234
+
235
+ await knex.schema.alterTable('moduleInstallations', (table) => {
236
+ table.unique(['moduleId', 'gameserverId', 'domain'], { indexName: 'unique_module_per_gameserver' });
237
+ table.index(['moduleId', 'gameserverId', 'domain'], 'idx_moduleinstallations_module_gameserver');
238
+ });
239
+
240
+ // Hook name must be unique inside a version
241
+ await knex.schema.alterTable('hooks', (table) => {
242
+ table.unique(['name', 'versionId']);
243
+ });
244
+ }
245
+
246
+ export async function down(knex: Knex): Promise<void> {
247
+ await knex.schema.alterTable('hooks', (table) => {
248
+ table.dropUnique(['name', 'versionId']);
249
+ });
250
+
251
+ await knex.schema.alterTable('moduleInstallations', (table) => {
252
+ table.dropUnique(['moduleId', 'gameserverId', 'domain'], 'unique_module_per_gameserver');
253
+ table.dropIndex(['moduleId', 'gameserverId', 'domain'], 'idx_moduleinstallations_module_gameserver');
254
+ });
255
+
256
+ // Remove the FKs from commands, hooks and cronjobs
257
+ await knex.schema.alterTable('commands', (table) => {
258
+ table.dropForeign('versionId');
259
+ });
260
+
261
+ await knex.schema.alterTable('hooks', (table) => {
262
+ table.dropForeign('versionId');
263
+ });
264
+
265
+ await knex.schema.alterTable('cronJobs', (table) => {
266
+ table.dropForeign('versionId');
267
+ });
268
+
269
+ await knex.schema.alterTable('permission', (table) => {
270
+ table.dropForeign('moduleVersionId');
271
+ });
272
+
273
+ await knex.schema.alterTable('functions', (table) => {
274
+ table.dropForeign('versionId');
275
+ });
276
+
277
+ // Drop the new columns
278
+ await knex.schema.alterTable('moduleInstallations', (table) => {
279
+ table.dropForeign('versionId');
280
+ table.dropColumn('versionId');
281
+ table.unique(['gameserverId', 'moduleId', 'domain'], {
282
+ indexName: 'moduleassignments_gameserverid_moduleid_domain_unique',
283
+ });
284
+ });
285
+
286
+ // Rename table moduleInstallations to moduleAssignments
287
+ await knex.schema.renameTable('moduleInstallations', 'moduleAssignments');
288
+
289
+ // Add back the old columns
290
+ await knex.schema.table('modules', (table) => {
291
+ table.text('description').nullable();
292
+ table.text('configSchema').nullable();
293
+ table.text('uiSchema').nullable();
294
+ });
295
+
296
+ // Add the old column back
297
+ await knex.schema.alterTable('commands', (table) => {
298
+ table.uuid('moduleId');
299
+ });
300
+
301
+ await knex.schema.alterTable('hooks', (table) => {
302
+ table.uuid('moduleId');
303
+ });
304
+
305
+ await knex.schema.alterTable('cronJobs', (table) => {
306
+ table.uuid('moduleId');
307
+ });
308
+
309
+ await knex.schema.alterTable('permission', (table) => {
310
+ table.uuid('moduleId').nullable();
311
+ });
312
+
313
+ await knex.schema.alterTable('functions', (table) => {
314
+ table.uuid('moduleId').nullable();
315
+ });
316
+
317
+ // Copy over the latest version of each module
318
+ const versions = await knex('moduleVersions')
319
+ .select('id', 'moduleId', 'createdAt', 'description', 'configSchema', 'uiSchema')
320
+ .distinct('moduleId')
321
+ .orderBy('createdAt', 'desc');
322
+ for (const version of versions) {
323
+ await knex('modules').where('id', version.moduleId).update({
324
+ description: version.description,
325
+ configSchema: version.configSchema,
326
+ uiSchema: version.uiSchema,
327
+ });
328
+
329
+ // Copy over the commands, hooks, cronjobs and permissions
330
+ const commands = await knex('commands').select('id').where('versionId', version.id);
331
+ for (const command of commands) {
332
+ await knex('commands').where('id', command.id).update({ moduleId: version.moduleId });
333
+ }
334
+
335
+ const hooks = await knex('hooks').select('id').where('versionId', version.id);
336
+ for (const hook of hooks) {
337
+ await knex('hooks').where('id', hook.id).update({ moduleId: version.moduleId });
338
+ }
339
+
340
+ const cronjobs = await knex('cronJobs').select('id').where('versionId', version.id);
341
+ for (const cronjob of cronjobs) {
342
+ await knex('cronJobs').where('id', cronjob.id).update({ moduleId: version.moduleId });
343
+ }
344
+
345
+ const permissions = await knex('permission').select('id').where('moduleVersionId', version.id);
346
+ for (const permission of permissions) {
347
+ await knex('permission').where('id', permission.id).update({ moduleId: version.moduleId });
348
+ }
349
+
350
+ const functions = await knex('functions').select('id').where('versionId', version.id);
351
+ for (const func of functions) {
352
+ await knex('functions').where('id', func.id).update({ moduleId: version.moduleId });
353
+ }
354
+ }
355
+
356
+ // Enable the old FKs
357
+ await knex.schema.alterTable('commands', (table) => {
358
+ table.foreign('moduleId').references('modules.id').onDelete('CASCADE');
359
+ table.dropColumn('versionId');
360
+ });
361
+
362
+ await knex.schema.alterTable('hooks', (table) => {
363
+ table.foreign('moduleId').references('modules.id').onDelete('CASCADE');
364
+ table.dropColumn('versionId');
365
+ });
366
+
367
+ await knex.schema.alterTable('cronJobs', (table) => {
368
+ table.foreign('moduleId').references('modules.id').onDelete('CASCADE');
369
+ table.dropColumn('versionId');
370
+ });
371
+
372
+ await knex.schema.alterTable('permission', (table) => {
373
+ table.foreign('moduleId', 'modulepermission_moduleid_foreign').references('modules.id').onDelete('CASCADE');
374
+ table.dropColumn('moduleVersionId');
375
+ });
376
+
377
+ await knex.schema.alterTable('functions', (table) => {
378
+ table.foreign('moduleId').references('modules.id').onDelete('CASCADE');
379
+ table.dropColumn('versionId');
380
+ });
381
+
382
+ // Drop the moduleVersions table
383
+ await knex.schema.dropTable('moduleVersions');
384
+ }
@@ -0,0 +1,13 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.schema.alterTable('moduleVersions', (table) => {
5
+ table.text('description').notNullable().defaultTo('No description').alter();
6
+ });
7
+ }
8
+
9
+ export async function down(knex: Knex): Promise<void> {
10
+ await knex.schema.alterTable('moduleVersions', (table) => {
11
+ table.text('description').nullable().alter();
12
+ });
13
+ }
@@ -0,0 +1,55 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.schema.alterTable('domains', (table) => {
5
+ table.integer('maxGameservers').defaultTo(1);
6
+ table.integer('maxUsers').defaultTo(1);
7
+ table.integer('eventRetentionDays').defaultTo(7);
8
+ table.integer('maxVariables').defaultTo(10000);
9
+ table.integer('maxModules').defaultTo(1000);
10
+ table.integer('maxFunctionsInModule').defaultTo(50);
11
+ });
12
+
13
+ await knex.schema.alterTable('users', (table) => {
14
+ table.boolean('isDashboardUser').defaultTo(false);
15
+ });
16
+
17
+ /**
18
+ * We need to find all the 'root' users and make them dashboard users. Root users have name === 'root'
19
+ * Also, we need to find any users with the "ROOT"" permission and make them dashboard users
20
+ */
21
+ await knex('users').where('name', 'root').update({ isDashboardUser: true });
22
+
23
+ // Then update users with ROOT permission
24
+ const usersWithRootPermission = await knex('users as u')
25
+ .distinct('u.id')
26
+ .join('roleOnUser as ru', 'u.id', 'ru.userId')
27
+ .join('permissionOnRole as pr', 'ru.roleId', 'pr.roleId')
28
+ .join('permission as p', 'pr.permissionId', 'p.id')
29
+ .where('p.permission', 'ROOT')
30
+ .select('u.id');
31
+
32
+ if (usersWithRootPermission.length > 0) {
33
+ await knex('users')
34
+ .whereIn(
35
+ 'id',
36
+ usersWithRootPermission.map((user) => user.id),
37
+ )
38
+ .update({ isDashboardUser: true });
39
+ }
40
+ }
41
+
42
+ export async function down(knex: Knex): Promise<void> {
43
+ await knex.schema.alterTable('domains', (table) => {
44
+ table.dropColumn('maxGameservers');
45
+ table.dropColumn('maxUsers');
46
+ table.dropColumn('eventRetentionDays');
47
+ table.dropColumn('maxVariables');
48
+ table.dropColumn('maxModules');
49
+ table.dropColumn('maxFunctionsInModule');
50
+ });
51
+
52
+ await knex.schema.alterTable('users', (table) => {
53
+ table.dropColumn('isDashboardUser');
54
+ });
55
+ }
@@ -0,0 +1,35 @@
1
+ import { Knex } from 'knex';
2
+
3
+ /**
4
+ * Alters the variables.value column from varchat to text
5
+ * Reason being is that users frequently want to store strings longer than 255 characters
6
+ * And length of this doesn't really matter for us...
7
+ * We still add a constraint to ensure that there's an upper bound
8
+ * Otherwise, users could upload 1TB of data to a single variable and crash postgres :)
9
+ */
10
+
11
+ export async function up(knex: Knex): Promise<void> {
12
+ await knex.schema.alterTable('variables', (table) => {
13
+ // Alter column type to text
14
+ table.text('value').alter();
15
+ });
16
+
17
+ // Add CHECK constraint to prevent extremely large values (128KB)
18
+ await knex.raw('ALTER TABLE variables ADD CONSTRAINT value_length_check CHECK (length(value) <= 131072)');
19
+ }
20
+
21
+ /**
22
+ * Reverts the variables.value column back to varchar(255)
23
+ * Removes the CHECK constraint
24
+ *
25
+ * @param knex Knex instance
26
+ */
27
+ export async function down(knex: Knex): Promise<void> {
28
+ // Remove CHECK constraint first
29
+ await knex.raw('ALTER TABLE variables DROP CONSTRAINT value_length_check');
30
+
31
+ await knex.schema.alterTable('variables', (table) => {
32
+ // Revert column type to varchar(255)
33
+ table.string('value', 255).alter();
34
+ });
35
+ }
@@ -0,0 +1,79 @@
1
+ import { Knex } from 'knex';
2
+
3
+ /**
4
+ * Adds performance optimization indices for module version querying
5
+ */
6
+ export async function up(knex: Knex): Promise<void> {
7
+ // ModuleVersions composite index
8
+ await knex.schema.raw(
9
+ 'CREATE INDEX IF NOT EXISTS idx_moduleversions_moduleid_tag ON "moduleVersions" ("moduleId", tag)',
10
+ );
11
+
12
+ // Add indices on versionId foreign keys
13
+ await knex.schema.alterTable('functions', (table) => {
14
+ table.index(['versionId'], 'idx_functions_versionid');
15
+ });
16
+
17
+ await knex.schema.alterTable('commands', (table) => {
18
+ table.index(['versionId'], 'idx_commands_versionid');
19
+ });
20
+
21
+ await knex.schema.alterTable('hooks', (table) => {
22
+ table.index(['versionId'], 'idx_hooks_versionid');
23
+ });
24
+
25
+ await knex.schema.alterTable('cronJobs', (table) => {
26
+ table.index(['versionId'], 'idx_cronjobs_versionid');
27
+ });
28
+
29
+ // Add indices on functionId foreign keys
30
+ await knex.schema.alterTable('hooks', (table) => {
31
+ table.index(['functionId'], 'idx_hooks_functionid');
32
+ });
33
+
34
+ await knex.schema.alterTable('cronJobs', (table) => {
35
+ table.index(['functionId'], 'idx_cronjobs_functionid');
36
+ });
37
+
38
+ await knex.schema.alterTable('commands', (table) => {
39
+ table.index(['functionId'], 'idx_commands_functionid');
40
+ });
41
+ }
42
+
43
+ /**
44
+ * Removes performance optimization indices
45
+ */
46
+ export async function down(knex: Knex): Promise<void> {
47
+ // Drop ModuleVersions composite index
48
+ await knex.schema.raw('DROP INDEX IF EXISTS idx_moduleversions_moduleid_tag');
49
+
50
+ // Drop versionId indices
51
+ await knex.schema.alterTable('functions', (table) => {
52
+ table.dropIndex(['versionId'], 'idx_functions_versionid');
53
+ });
54
+
55
+ await knex.schema.alterTable('commands', (table) => {
56
+ table.dropIndex(['versionId'], 'idx_commands_versionid');
57
+ });
58
+
59
+ await knex.schema.alterTable('hooks', (table) => {
60
+ table.dropIndex(['versionId'], 'idx_hooks_versionid');
61
+ });
62
+
63
+ await knex.schema.alterTable('cronJobs', (table) => {
64
+ table.dropIndex(['versionId'], 'idx_cronjobs_versionid');
65
+ });
66
+
67
+ // Drop functionId indices
68
+ await knex.schema.alterTable('hooks', (table) => {
69
+ table.dropIndex(['functionId'], 'idx_hooks_functionid');
70
+ });
71
+
72
+ await knex.schema.alterTable('cronJobs', (table) => {
73
+ table.dropIndex(['functionId'], 'idx_cronjobs_functionid');
74
+ });
75
+
76
+ await knex.schema.alterTable('commands', (table) => {
77
+ table.dropIndex(['functionId'], 'idx_commands_functionid');
78
+ });
79
+ }
@@ -0,0 +1,43 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ // First drop the existing foreign key constraint
5
+ await knex.schema.table('bans', (table) => {
6
+ table.dropForeign(['gameServerId']);
7
+ });
8
+
9
+ // Make gameServerId nullable and recreate foreign key
10
+ await knex.schema.alterTable('bans', (table) => {
11
+ table.uuid('gameServerId').nullable().alter();
12
+ table.foreign('gameServerId').references('id').inTable('gameservers').onDelete('CASCADE');
13
+ });
14
+
15
+ // Add the check constraint
16
+ await knex.raw(`
17
+ ALTER TABLE bans
18
+ ADD CONSTRAINT bans_global_gameserver_check
19
+ CHECK (
20
+ ("isGlobal" = true AND "gameServerId" IS NULL) OR
21
+ ("isGlobal" = false AND "gameServerId" IS NOT NULL)
22
+ )
23
+ `);
24
+ }
25
+
26
+ export async function down(knex: Knex): Promise<void> {
27
+ // Remove the check constraint
28
+ await knex.raw(`
29
+ ALTER TABLE bans
30
+ DROP CONSTRAINT bans_global_gameserver_check
31
+ `);
32
+
33
+ // Drop the foreign key
34
+ await knex.schema.table('bans', (table) => {
35
+ table.dropForeign(['gameServerId']);
36
+ });
37
+
38
+ // Make gameServerId required again and recreate original foreign key
39
+ await knex.schema.alterTable('bans', (table) => {
40
+ table.uuid('gameServerId').notNullable().alter();
41
+ table.foreign('gameServerId').references('id').inTable('gameservers').onDelete('CASCADE');
42
+ });
43
+ }
@@ -0,0 +1,49 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.schema.alterTable('hooks', (table) => {
5
+ table.text('description').nullable();
6
+ });
7
+
8
+ await knex.schema.alterTable('commands', (table) => {
9
+ table.text('description').nullable();
10
+ });
11
+
12
+ await knex.schema.alterTable('cronJobs', (table) => {
13
+ table.text('description').nullable();
14
+ });
15
+
16
+ await knex.schema.alterTable('functions', (table) => {
17
+ table.text('description').nullable();
18
+ });
19
+
20
+ await knex.raw('ALTER TABLE hooks ADD CONSTRAINT description_length_check CHECK (length(description) <= 131072)');
21
+ await knex.raw('ALTER TABLE commands ADD CONSTRAINT description_length_check CHECK (length(description) <= 131072)');
22
+ await knex.raw(
23
+ 'ALTER TABLE "cronJobs" ADD CONSTRAINT description_length_check CHECK (length(description) <= 131072)',
24
+ );
25
+ await knex.raw('ALTER TABLE functions ADD CONSTRAINT description_length_check CHECK (length(description) <= 131072)');
26
+ }
27
+
28
+ export async function down(knex: Knex): Promise<void> {
29
+ await knex.raw('ALTER TABLE hooks DROP CONSTRAINT description_length_check');
30
+ await knex.raw('ALTER TABLE commands DROP CONSTRAINT description_length_check');
31
+ await knex.raw('ALTER TABLE "cronJobs" DROP CONSTRAINT description_length_check');
32
+ await knex.raw('ALTER TABLE functions DROP CONSTRAINT description_length_check');
33
+
34
+ await knex.schema.alterTable('hooks', (table) => {
35
+ table.dropColumn('description');
36
+ });
37
+
38
+ await knex.schema.alterTable('commands', (table) => {
39
+ table.dropColumn('description');
40
+ });
41
+
42
+ await knex.schema.alterTable('cronJobs', (table) => {
43
+ table.dropColumn('description');
44
+ });
45
+
46
+ await knex.schema.alterTable('functions', (table) => {
47
+ table.dropColumn('description');
48
+ });
49
+ }
@@ -0,0 +1,13 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.schema.alterTable('moduleVersions', (table) => {
5
+ table.jsonb('defaultSystemConfig').nullable();
6
+ });
7
+ }
8
+
9
+ export async function down(knex: Knex): Promise<void> {
10
+ await knex.schema.alterTable('moduleVersions', (table) => {
11
+ table.dropColumn('defaultSystemConfig');
12
+ });
13
+ }