@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.
- package/dist/TakaroModel.d.ts +1 -0
- package/dist/TakaroModel.d.ts.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/encryption.d.ts +1 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/errorTypeGuards.d.ts +1 -0
- package/dist/errorTypeGuards.d.ts.map +1 -0
- package/dist/knex.d.ts +1 -0
- package/dist/knex.d.ts.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/sql/20220827191938_init.d.ts +1 -0
- package/dist/migrations/sql/20220827191938_init.d.ts.map +1 -0
- package/dist/migrations/sql/20221019173729_settings.d.ts +1 -0
- package/dist/migrations/sql/20221019173729_settings.d.ts.map +1 -0
- package/dist/migrations/sql/20221029103554_refactor_function_assignments.d.ts +1 -0
- package/dist/migrations/sql/20221029103554_refactor_function_assignments.d.ts.map +1 -0
- package/dist/migrations/sql/20221102190532_commands.d.ts +1 -0
- package/dist/migrations/sql/20221102190532_commands.d.ts.map +1 -0
- package/dist/migrations/sql/20221203135001-builtin_modules.d.ts +1 -0
- package/dist/migrations/sql/20221203135001-builtin_modules.d.ts.map +1 -0
- package/dist/migrations/sql/20230308183400-persistent-variables.d.ts +1 -0
- package/dist/migrations/sql/20230308183400-persistent-variables.d.ts.map +1 -0
- package/dist/migrations/sql/20230314183400-auth-ory.d.ts +1 -0
- package/dist/migrations/sql/20230314183400-auth-ory.d.ts.map +1 -0
- package/dist/migrations/sql/20230325156123_command-arguments.d.ts +1 -0
- package/dist/migrations/sql/20230325156123_command-arguments.d.ts.map +1 -0
- package/dist/migrations/sql/20230407132022-module-descriptions.d.ts +1 -0
- package/dist/migrations/sql/20230407132022-module-descriptions.d.ts.map +1 -0
- package/dist/migrations/sql/20230407143733-module-json-schema-config.d.ts +1 -0
- package/dist/migrations/sql/20230407143733-module-json-schema-config.d.ts.map +1 -0
- package/dist/migrations/sql/20230407173055-hook-regex-optional.d.ts +1 -0
- package/dist/migrations/sql/20230407173055-hook-regex-optional.d.ts.map +1 -0
- package/dist/migrations/sql/20230415154935-cronjob-configs.d.ts +1 -0
- package/dist/migrations/sql/20230415154935-cronjob-configs.d.ts.map +1 -0
- package/dist/migrations/sql/20230503132906-variables-extra-meta.d.ts +1 -0
- package/dist/migrations/sql/20230503132906-variables-extra-meta.d.ts.map +1 -0
- package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.d.ts +1 -0
- package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.d.ts.map +1 -0
- package/dist/migrations/sql/20230617081049-discordId-for-users.d.ts +1 -0
- package/dist/migrations/sql/20230617081049-discordId-for-users.d.ts.map +1 -0
- package/dist/migrations/sql/20230618053611-discord-funtionality.d.ts +1 -0
- package/dist/migrations/sql/20230618053611-discord-funtionality.d.ts.map +1 -0
- package/dist/migrations/sql/20230622192402-discord-hooks.d.ts +1 -0
- package/dist/migrations/sql/20230622192402-discord-hooks.d.ts.map +1 -0
- package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.d.ts +1 -0
- package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.d.ts.map +1 -0
- package/dist/migrations/sql/20230710174340-events.d.ts +1 -0
- package/dist/migrations/sql/20230710174340-events.d.ts.map +1 -0
- package/dist/migrations/sql/20230712061220-roles-permissions-extension.d.ts +1 -0
- package/dist/migrations/sql/20230712061220-roles-permissions-extension.d.ts.map +1 -0
- package/dist/migrations/sql/20230713184927-variables-modulescoped.d.ts +1 -0
- package/dist/migrations/sql/20230713184927-variables-modulescoped.d.ts.map +1 -0
- package/dist/migrations/sql/20230714045136-domain-index.d.ts +1 -0
- package/dist/migrations/sql/20230714045136-domain-index.d.ts.map +1 -0
- package/dist/migrations/sql/20230714045727-events-index.d.ts +1 -0
- package/dist/migrations/sql/20230714045727-events-index.d.ts.map +1 -0
- package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.d.ts +1 -0
- package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.d.ts.map +1 -0
- package/dist/migrations/sql/20230724062109-roles-constraints.d.ts +1 -0
- package/dist/migrations/sql/20230724062109-roles-constraints.d.ts.map +1 -0
- package/dist/migrations/sql/20230811095701-userId-on-events.d.ts +1 -0
- package/dist/migrations/sql/20230811095701-userId-on-events.d.ts.map +1 -0
- package/dist/migrations/sql/20230921123717-count-for-permissions.d.ts +1 -0
- package/dist/migrations/sql/20230921123717-count-for-permissions.d.ts.map +1 -0
- package/dist/migrations/sql/20231111102812-details-system-permissions.d.ts +1 -0
- package/dist/migrations/sql/20231111102812-details-system-permissions.d.ts.map +1 -0
- package/dist/migrations/sql/20231114151343-system-roles.d.ts +1 -0
- package/dist/migrations/sql/20231114151343-system-roles.d.ts.map +1 -0
- package/dist/migrations/sql/20231118082301-add-new-permissions.d.ts +1 -0
- package/dist/migrations/sql/20231118082301-add-new-permissions.d.ts.map +1 -0
- package/dist/migrations/sql/20231119115037-timedRoles.d.ts +1 -0
- package/dist/migrations/sql/20231119115037-timedRoles.d.ts.map +1 -0
- package/dist/migrations/sql/20231123150854-economy-base.d.ts +1 -0
- package/dist/migrations/sql/20231123150854-economy-base.d.ts.map +1 -0
- package/dist/migrations/sql/20231123171611-economy-settings.d.ts +1 -0
- package/dist/migrations/sql/20231123171611-economy-settings.d.ts.map +1 -0
- package/dist/migrations/sql/20231124140441-json-module-assignments.d.ts +1 -0
- package/dist/migrations/sql/20231124140441-json-module-assignments.d.ts.map +1 -0
- package/dist/migrations/sql/20231208114507-settings-refactor.d.ts +1 -0
- package/dist/migrations/sql/20231208114507-settings-refactor.d.ts.map +1 -0
- package/dist/migrations/sql/20231208171234-game-items.d.ts +1 -0
- package/dist/migrations/sql/20231208171234-game-items.d.ts.map +1 -0
- package/dist/migrations/sql/20231216100720-player-inventory.d.ts +1 -0
- package/dist/migrations/sql/20231216100720-player-inventory.d.ts.map +1 -0
- package/dist/migrations/sql/20231222180438-steam-data.d.ts +1 -0
- package/dist/migrations/sql/20231222180438-steam-data.d.ts.map +1 -0
- package/dist/migrations/sql/20231223132631-pog-online.d.ts +1 -0
- package/dist/migrations/sql/20231223132631-pog-online.d.ts.map +1 -0
- package/dist/migrations/sql/20231223212031-unique-index-item-def.d.ts +1 -0
- package/dist/migrations/sql/20231223212031-unique-index-item-def.d.ts.map +1 -0
- package/dist/migrations/sql/20231224135126-gameserver-online-status.d.ts +1 -0
- package/dist/migrations/sql/20231224135126-gameserver-online-status.d.ts.map +1 -0
- package/dist/migrations/sql/20231224155226-unique-pog.d.ts +1 -0
- package/dist/migrations/sql/20231224155226-unique-pog.d.ts.map +1 -0
- package/dist/migrations/sql/20231225140650-extra-ip-info.d.ts +1 -0
- package/dist/migrations/sql/20231225140650-extra-ip-info.d.ts.map +1 -0
- package/dist/migrations/sql/20231227144315-unique-constraints-player.d.ts +1 -0
- package/dist/migrations/sql/20231227144315-unique-constraints-player.d.ts.map +1 -0
- package/dist/migrations/sql/20231229144707-more-player-constraints.d.ts +1 -0
- package/dist/migrations/sql/20231229144707-more-player-constraints.d.ts.map +1 -0
- package/dist/migrations/sql/20240101162751-add-settings-constraint.d.ts +1 -0
- package/dist/migrations/sql/20240101162751-add-settings-constraint.d.ts.map +1 -0
- package/dist/migrations/sql/20240105130846-remove-some-module-perms.d.ts +1 -0
- package/dist/migrations/sql/20240105130846-remove-some-module-perms.d.ts.map +1 -0
- package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.d.ts +1 -0
- package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.d.ts.map +1 -0
- package/dist/migrations/sql/20240119152426-remove-hook-check.d.ts +1 -0
- package/dist/migrations/sql/20240119152426-remove-hook-check.d.ts.map +1 -0
- package/dist/migrations/sql/20240121142329-move-ip-history.d.ts +1 -0
- package/dist/migrations/sql/20240121142329-move-ip-history.d.ts.map +1 -0
- package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.d.ts +1 -0
- package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.d.ts.map +1 -0
- package/dist/migrations/sql/20240216120143-domain-state.d.ts +1 -0
- package/dist/migrations/sql/20240216120143-domain-state.d.ts.map +1 -0
- package/dist/migrations/sql/20240229141340-looser-fks-events.d.ts +1 -0
- package/dist/migrations/sql/20240229141340-looser-fks-events.d.ts.map +1 -0
- package/dist/migrations/sql/20240301063505-module-functions.d.ts +1 -0
- package/dist/migrations/sql/20240301063505-module-functions.d.ts.map +1 -0
- package/dist/migrations/sql/20240613175009-lastseen-users-pog.d.ts +1 -0
- package/dist/migrations/sql/20240613175009-lastseen-users-pog.d.ts.map +1 -0
- package/dist/migrations/sql/20240614143517-shop.d.ts +1 -0
- package/dist/migrations/sql/20240614143517-shop.d.ts.map +1 -0
- package/dist/migrations/sql/20240615145045-user-player-link.d.ts +1 -0
- package/dist/migrations/sql/20240615145045-user-player-link.d.ts.map +1 -0
- package/dist/migrations/sql/20240622132552-fix-ip-history-fk.d.ts +1 -0
- package/dist/migrations/sql/20240622132552-fix-ip-history-fk.d.ts.map +1 -0
- package/dist/migrations/sql/20240626200803-player-inventory-idx.d.ts +1 -0
- package/dist/migrations/sql/20240626200803-player-inventory-idx.d.ts.map +1 -0
- package/dist/migrations/sql/20240628174914-shop-orders.d.ts +1 -0
- package/dist/migrations/sql/20240628174914-shop-orders.d.ts.map +1 -0
- package/dist/migrations/sql/20240705140358-teleports-public-refactor.d.ts +1 -0
- package/dist/migrations/sql/20240705140358-teleports-public-refactor.d.ts.map +1 -0
- package/dist/migrations/sql/20240710181429-events-name-idx.d.ts +1 -0
- package/dist/migrations/sql/20240710181429-events-name-idx.d.ts.map +1 -0
- package/dist/migrations/sql/20240711181423-shop-orders-multi-listing.d.ts +1 -0
- package/dist/migrations/sql/20240711181423-shop-orders-multi-listing.d.ts.map +1 -0
- package/dist/migrations/sql/20240718121004-delete-read-gameservers-perm.d.ts +1 -0
- package/dist/migrations/sql/20240718121004-delete-read-gameservers-perm.d.ts.map +1 -0
- package/dist/migrations/sql/20240718150807-listing-deleted-and-draft-status.d.ts +1 -0
- package/dist/migrations/sql/20240718150807-listing-deleted-and-draft-status.d.ts.map +1 -0
- package/dist/migrations/sql/20240720135010-acting-user-and-module.d.ts +1 -0
- package/dist/migrations/sql/20240720135010-acting-user-and-module.d.ts.map +1 -0
- package/dist/migrations/sql/20240811061243-domain-rate-limit-setting.d.ts +1 -0
- package/dist/migrations/sql/20240811061243-domain-rate-limit-setting.d.ts.map +1 -0
- package/dist/migrations/sql/20240814133931-domain-ext-ref.d.ts +1 -0
- package/dist/migrations/sql/20240814133931-domain-ext-ref.d.ts.map +1 -0
- package/dist/migrations/sql/20240816171220-player-steam-level.d.ts +1 -0
- package/dist/migrations/sql/20240816171220-player-steam-level.d.ts.map +1 -0
- package/dist/migrations/sql/20240830081157-variable-expiry.d.ts +1 -0
- package/dist/migrations/sql/20240830081157-variable-expiry.d.ts.map +1 -0
- package/dist/migrations/sql/20240906125101-gameserver-enable.d.ts +1 -0
- package/dist/migrations/sql/20240906125101-gameserver-enable.d.ts.map +1 -0
- package/dist/migrations/sql/20240908185212-domain-name-not-unique.d.ts +1 -0
- package/dist/migrations/sql/20240908185212-domain-name-not-unique.d.ts.map +1 -0
- package/dist/migrations/sql/20240922110414-player-playtime.d.ts +1 -0
- package/dist/migrations/sql/20240922110414-player-playtime.d.ts.map +1 -0
- package/dist/migrations/sql/20240922133738-add-bans.d.ts +1 -0
- package/dist/migrations/sql/20240922133738-add-bans.d.ts.map +1 -0
- package/dist/migrations/sql/20240929090313-global-playtime.d.ts +1 -0
- package/dist/migrations/sql/20240929090313-global-playtime.d.ts.map +1 -0
- package/dist/migrations/sql/20240929143849-player-name-null.d.ts +1 -0
- package/dist/migrations/sql/20240929143849-player-name-null.d.ts.map +1 -0
- package/dist/migrations/sql/20241012183754-shop-orders-belong-to-player.d.ts +1 -0
- package/dist/migrations/sql/20241012183754-shop-orders-belong-to-player.d.ts.map +1 -0
- package/dist/migrations/sql/20241013173159-add-indexen-for-moduleId.d.ts +1 -0
- package/dist/migrations/sql/20241013173159-add-indexen-for-moduleId.d.ts.map +1 -0
- package/dist/migrations/sql/20241020133133-make-listing-name-required.d.ts +1 -0
- package/dist/migrations/sql/20241020133133-make-listing-name-required.d.ts.map +1 -0
- package/dist/migrations/sql/20241024164331-events-fk-fix.d.ts +1 -0
- package/dist/migrations/sql/20241024164331-events-fk-fix.d.ts.map +1 -0
- package/dist/migrations/sql/20241030130613-index-for-roleId.d.ts +1 -0
- package/dist/migrations/sql/20241030130613-index-for-roleId.d.ts.map +1 -0
- package/dist/migrations/sql/20241205201123-gameserver-deletedAt.d.ts +4 -0
- package/dist/migrations/sql/20241205201123-gameserver-deletedAt.d.ts.map +1 -0
- package/dist/migrations/sql/20241205201123-gameserver-deletedAt.js +11 -0
- package/dist/migrations/sql/20241205201123-gameserver-deletedAt.js.map +1 -0
- package/dist/migrations/sql/20241330200212-module-versions.d.ts +4 -0
- package/dist/migrations/sql/20241330200212-module-versions.d.ts.map +1 -0
- package/dist/migrations/sql/20241330200212-module-versions.js +329 -0
- package/dist/migrations/sql/20241330200212-module-versions.js.map +1 -0
- package/dist/migrations/sql/20250128200529-version-fixes.d.ts +4 -0
- package/dist/migrations/sql/20250128200529-version-fixes.d.ts.map +1 -0
- package/dist/migrations/sql/20250128200529-version-fixes.js +11 -0
- package/dist/migrations/sql/20250128200529-version-fixes.js.map +1 -0
- package/dist/migrations/sql/20250131183251-domain-settings.d.ts +4 -0
- package/dist/migrations/sql/20250131183251-domain-settings.d.ts.map +1 -0
- package/dist/migrations/sql/20250131183251-domain-settings.js +45 -0
- package/dist/migrations/sql/20250131183251-domain-settings.js.map +1 -0
- package/dist/migrations/sql/20250221130042-variable-length.d.ts +17 -0
- package/dist/migrations/sql/20250221130042-variable-length.d.ts.map +1 -0
- package/dist/migrations/sql/20250221130042-variable-length.js +30 -0
- package/dist/migrations/sql/20250221130042-variable-length.js.map +1 -0
- package/dist/migrations/sql/20250221193144-versions-perf-improvements.d.ts +10 -0
- package/dist/migrations/sql/20250221193144-versions-perf-improvements.d.ts.map +1 -0
- package/dist/migrations/sql/20250221193144-versions-perf-improvements.js +61 -0
- package/dist/migrations/sql/20250221193144-versions-perf-improvements.js.map +1 -0
- package/dist/migrations/sql/20250223143705-fix-ban-constraint.d.ts +4 -0
- package/dist/migrations/sql/20250223143705-fix-ban-constraint.d.ts.map +1 -0
- package/dist/migrations/sql/20250223143705-fix-ban-constraint.js +37 -0
- package/dist/migrations/sql/20250223143705-fix-ban-constraint.js.map +1 -0
- package/dist/migrations/sql/20250305210650-more-module-metadata.d.ts +4 -0
- package/dist/migrations/sql/20250305210650-more-module-metadata.d.ts.map +1 -0
- package/dist/migrations/sql/20250305210650-more-module-metadata.js +37 -0
- package/dist/migrations/sql/20250305210650-more-module-metadata.js.map +1 -0
- package/dist/migrations/sql/20250307162855-default-systemconfig.d.ts +4 -0
- package/dist/migrations/sql/20250307162855-default-systemconfig.d.ts.map +1 -0
- package/dist/migrations/sql/20250307162855-default-systemconfig.js +11 -0
- package/dist/migrations/sql/20250307162855-default-systemconfig.js.map +1 -0
- package/dist/migrations/sql/20250312184104-unique-external-reference.d.ts +4 -0
- package/dist/migrations/sql/20250312184104-unique-external-reference.d.ts.map +1 -0
- package/dist/migrations/sql/20250312184104-unique-external-reference.js +11 -0
- package/dist/migrations/sql/20250312184104-unique-external-reference.js.map +1 -0
- package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.d.ts +4 -0
- package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.d.ts.map +1 -0
- package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.js +15 -0
- package/dist/migrations/sql/20250314185501-root-users-not-dashboard-user.js.map +1 -0
- package/dist/migrations/sql/20250315191707-fix-constraint-module-items.d.ts +8 -0
- package/dist/migrations/sql/20250315191707-fix-constraint-module-items.d.ts.map +1 -0
- package/dist/migrations/sql/20250315191707-fix-constraint-module-items.js +17 -0
- package/dist/migrations/sql/20250315191707-fix-constraint-module-items.js.map +1 -0
- package/dist/migrations/util/alterEnum.d.ts +1 -0
- package/dist/migrations/util/alterEnum.d.ts.map +1 -0
- package/dist/queryBuilder.d.ts +1 -0
- package/dist/queryBuilder.d.ts.map +1 -0
- package/dist/redis.d.ts +1 -0
- package/dist/redis.d.ts.map +1 -0
- package/package.json +2 -13
- package/src/__tests__/encryption.integration.test.ts +1 -0
- package/src/__tests__/queryBuilder.integration.test.ts +1 -0
- package/src/migrations/sql/20241205201123-gameserver-deletedAt.ts +13 -0
- package/src/migrations/sql/20241330200212-module-versions.ts +384 -0
- package/src/migrations/sql/20250128200529-version-fixes.ts +13 -0
- package/src/migrations/sql/20250131183251-domain-settings.ts +55 -0
- package/src/migrations/sql/20250221130042-variable-length.ts +35 -0
- package/src/migrations/sql/20250221193144-versions-perf-improvements.ts +79 -0
- package/src/migrations/sql/20250223143705-fix-ban-constraint.ts +43 -0
- package/src/migrations/sql/20250305210650-more-module-metadata.ts +49 -0
- package/src/migrations/sql/20250307162855-default-systemconfig.ts +13 -0
- package/src/migrations/sql/20250312184104-unique-external-reference.ts +13 -0
- package/src/migrations/sql/20250314185501-root-users-not-dashboard-user.ts +17 -0
- package/src/migrations/sql/20250315191707-fix-constraint-module-items.ts +26 -0
- 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
|
+
}
|