@takaro/db 0.0.1
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/README.md +1 -0
- package/dist/TakaroModel.d.ts +15 -0
- package/dist/TakaroModel.js +23 -0
- package/dist/TakaroModel.js.map +1 -0
- package/dist/config.d.ts +98 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/encryption.d.ts +4 -0
- package/dist/encryption.js +24 -0
- package/dist/encryption.js.map +1 -0
- package/dist/errorTypeGuards.d.ts +2 -0
- package/dist/errorTypeGuards.js +11 -0
- package/dist/errorTypeGuards.js.map +1 -0
- package/dist/knex.d.ts +16 -0
- package/dist/knex.js +46 -0
- package/dist/knex.js.map +1 -0
- package/dist/main.d.ts +8 -0
- package/dist/main.js +9 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -0
- package/dist/migrations/index.js +59 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/sql/20220827191938_init.d.ts +3 -0
- package/dist/migrations/sql/20220827191938_init.js +155 -0
- package/dist/migrations/sql/20220827191938_init.js.map +1 -0
- package/dist/migrations/sql/20221019173729_settings.d.ts +3 -0
- package/dist/migrations/sql/20221019173729_settings.js +61 -0
- package/dist/migrations/sql/20221019173729_settings.js.map +1 -0
- package/dist/migrations/sql/20221029103554_refactor_function_assignments.d.ts +3 -0
- package/dist/migrations/sql/20221029103554_refactor_function_assignments.js +33 -0
- package/dist/migrations/sql/20221029103554_refactor_function_assignments.js.map +1 -0
- package/dist/migrations/sql/20221102190532_commands.d.ts +3 -0
- package/dist/migrations/sql/20221102190532_commands.js +58 -0
- package/dist/migrations/sql/20221102190532_commands.js.map +1 -0
- package/dist/migrations/sql/20221203135001-builtin_modules.d.ts +3 -0
- package/dist/migrations/sql/20221203135001-builtin_modules.js +44 -0
- package/dist/migrations/sql/20221203135001-builtin_modules.js.map +1 -0
- package/dist/migrations/sql/20230308183400-persistent-variables.d.ts +3 -0
- package/dist/migrations/sql/20230308183400-persistent-variables.js +63 -0
- package/dist/migrations/sql/20230308183400-persistent-variables.js.map +1 -0
- package/dist/migrations/sql/20230314183400-auth-ory.d.ts +3 -0
- package/dist/migrations/sql/20230314183400-auth-ory.js +23 -0
- package/dist/migrations/sql/20230314183400-auth-ory.js.map +1 -0
- package/dist/migrations/sql/20230325156123_command-arguments.d.ts +3 -0
- package/dist/migrations/sql/20230325156123_command-arguments.js +19 -0
- package/dist/migrations/sql/20230325156123_command-arguments.js.map +1 -0
- package/dist/migrations/sql/20230407132022-module-descriptions.d.ts +3 -0
- package/dist/migrations/sql/20230407132022-module-descriptions.js +11 -0
- package/dist/migrations/sql/20230407132022-module-descriptions.js.map +1 -0
- package/dist/migrations/sql/20230407143733-module-json-schema-config.d.ts +3 -0
- package/dist/migrations/sql/20230407143733-module-json-schema-config.js +14 -0
- package/dist/migrations/sql/20230407143733-module-json-schema-config.js.map +1 -0
- package/dist/migrations/sql/20230407173055-hook-regex-optional.d.ts +3 -0
- package/dist/migrations/sql/20230407173055-hook-regex-optional.js +11 -0
- package/dist/migrations/sql/20230407173055-hook-regex-optional.js.map +1 -0
- package/dist/migrations/sql/20230415154935-cronjob-configs.d.ts +3 -0
- package/dist/migrations/sql/20230415154935-cronjob-configs.js +16 -0
- package/dist/migrations/sql/20230415154935-cronjob-configs.js.map +1 -0
- package/dist/migrations/sql/20230503132906-variables-extra-meta.d.ts +3 -0
- package/dist/migrations/sql/20230503132906-variables-extra-meta.js +26 -0
- package/dist/migrations/sql/20230503132906-variables-extra-meta.js.map +1 -0
- package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.d.ts +3 -0
- package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.js +8 -0
- package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.js.map +1 -0
- package/dist/migrations/sql/20230617081049-discordId-for-users.d.ts +3 -0
- package/dist/migrations/sql/20230617081049-discordId-for-users.js +14 -0
- package/dist/migrations/sql/20230617081049-discordId-for-users.js.map +1 -0
- package/dist/migrations/sql/20230618053611-discord-funtionality.d.ts +3 -0
- package/dist/migrations/sql/20230618053611-discord-funtionality.js +26 -0
- package/dist/migrations/sql/20230618053611-discord-funtionality.js.map +1 -0
- package/dist/migrations/sql/20230622192402-discord-hooks.d.ts +3 -0
- package/dist/migrations/sql/20230622192402-discord-hooks.js +14 -0
- package/dist/migrations/sql/20230622192402-discord-hooks.js.map +1 -0
- package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.d.ts +3 -0
- package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.js +19 -0
- package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.js.map +1 -0
- package/dist/migrations/sql/20230710174340-events.d.ts +3 -0
- package/dist/migrations/sql/20230710174340-events.js +16 -0
- package/dist/migrations/sql/20230710174340-events.js.map +1 -0
- package/dist/migrations/sql/20230712061220-roles-permissions-extension.d.ts +3 -0
- package/dist/migrations/sql/20230712061220-roles-permissions-extension.js +43 -0
- package/dist/migrations/sql/20230712061220-roles-permissions-extension.js.map +1 -0
- package/dist/migrations/sql/20230713184927-variables-modulescoped.d.ts +3 -0
- package/dist/migrations/sql/20230713184927-variables-modulescoped.js +27 -0
- package/dist/migrations/sql/20230713184927-variables-modulescoped.js.map +1 -0
- package/dist/migrations/sql/20230714045136-domain-index.d.ts +3 -0
- package/dist/migrations/sql/20230714045136-domain-index.js +37 -0
- package/dist/migrations/sql/20230714045136-domain-index.js.map +1 -0
- package/dist/migrations/sql/20230714045727-events-index.d.ts +3 -0
- package/dist/migrations/sql/20230714045727-events-index.js +17 -0
- package/dist/migrations/sql/20230714045727-events-index.js.map +1 -0
- package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.d.ts +3 -0
- package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.js +32 -0
- package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.js.map +1 -0
- package/dist/migrations/sql/20230724062109-roles-constraints.d.ts +3 -0
- package/dist/migrations/sql/20230724062109-roles-constraints.js +14 -0
- package/dist/migrations/sql/20230724062109-roles-constraints.js.map +1 -0
- package/dist/migrations/sql/20230811095701-userId-on-events.d.ts +3 -0
- package/dist/migrations/sql/20230811095701-userId-on-events.js +12 -0
- package/dist/migrations/sql/20230811095701-userId-on-events.js.map +1 -0
- package/dist/migrations/sql/20230921123717-count-for-permissions.d.ts +3 -0
- package/dist/migrations/sql/20230921123717-count-for-permissions.js +84 -0
- package/dist/migrations/sql/20230921123717-count-for-permissions.js.map +1 -0
- package/dist/migrations/sql/20231111102812-details-system-permissions.d.ts +36 -0
- package/dist/migrations/sql/20231111102812-details-system-permissions.js +179 -0
- package/dist/migrations/sql/20231111102812-details-system-permissions.js.map +1 -0
- package/dist/migrations/sql/20231114151343-system-roles.d.ts +3 -0
- package/dist/migrations/sql/20231114151343-system-roles.js +41 -0
- package/dist/migrations/sql/20231114151343-system-roles.js.map +1 -0
- package/dist/migrations/sql/20231118082301-add-new-permissions.d.ts +36 -0
- package/dist/migrations/sql/20231118082301-add-new-permissions.js +186 -0
- package/dist/migrations/sql/20231118082301-add-new-permissions.js.map +1 -0
- package/dist/migrations/sql/20231119115037-timedRoles.d.ts +3 -0
- package/dist/migrations/sql/20231119115037-timedRoles.js +19 -0
- package/dist/migrations/sql/20231119115037-timedRoles.js.map +1 -0
- package/dist/migrations/sql/20231123150854-economy-base.d.ts +3 -0
- package/dist/migrations/sql/20231123150854-economy-base.js +13 -0
- package/dist/migrations/sql/20231123150854-economy-base.js.map +1 -0
- package/dist/migrations/sql/20231123171611-economy-settings.d.ts +3 -0
- package/dist/migrations/sql/20231123171611-economy-settings.js +13 -0
- package/dist/migrations/sql/20231123171611-economy-settings.js.map +1 -0
- package/dist/migrations/sql/20231124140441-json-module-assignments.d.ts +3 -0
- package/dist/migrations/sql/20231124140441-json-module-assignments.js +25 -0
- package/dist/migrations/sql/20231124140441-json-module-assignments.js.map +1 -0
- package/dist/migrations/sql/20231208114507-settings-refactor.d.ts +3 -0
- package/dist/migrations/sql/20231208114507-settings-refactor.js +95 -0
- package/dist/migrations/sql/20231208114507-settings-refactor.js.map +1 -0
- package/dist/migrations/sql/20231208171234-game-items.d.ts +3 -0
- package/dist/migrations/sql/20231208171234-game-items.js +18 -0
- package/dist/migrations/sql/20231208171234-game-items.js.map +1 -0
- package/dist/migrations/sql/20231216100720-player-inventory.d.ts +3 -0
- package/dist/migrations/sql/20231216100720-player-inventory.js +14 -0
- package/dist/migrations/sql/20231216100720-player-inventory.js.map +1 -0
- package/dist/migrations/sql/20231222180438-steam-data.d.ts +3 -0
- package/dist/migrations/sql/20231222180438-steam-data.js +25 -0
- package/dist/migrations/sql/20231222180438-steam-data.js.map +1 -0
- package/dist/migrations/sql/20231223132631-pog-online.d.ts +3 -0
- package/dist/migrations/sql/20231223132631-pog-online.js +11 -0
- package/dist/migrations/sql/20231223132631-pog-online.js.map +1 -0
- package/dist/migrations/sql/20231223212031-unique-index-item-def.d.ts +3 -0
- package/dist/migrations/sql/20231223212031-unique-index-item-def.js +24 -0
- package/dist/migrations/sql/20231223212031-unique-index-item-def.js.map +1 -0
- package/dist/migrations/sql/20231224135126-gameserver-online-status.d.ts +3 -0
- package/dist/migrations/sql/20231224135126-gameserver-online-status.js +11 -0
- package/dist/migrations/sql/20231224135126-gameserver-online-status.js.map +1 -0
- package/dist/migrations/sql/20231224155226-unique-pog.d.ts +3 -0
- package/dist/migrations/sql/20231224155226-unique-pog.js +24 -0
- package/dist/migrations/sql/20231224155226-unique-pog.js.map +1 -0
- package/dist/migrations/sql/20231225140650-extra-ip-info.d.ts +3 -0
- package/dist/migrations/sql/20231225140650-extra-ip-info.js +23 -0
- package/dist/migrations/sql/20231225140650-extra-ip-info.js.map +1 -0
- package/dist/migrations/sql/20231227144315-unique-constraints-player.d.ts +3 -0
- package/dist/migrations/sql/20231227144315-unique-constraints-player.js +67 -0
- package/dist/migrations/sql/20231227144315-unique-constraints-player.js.map +1 -0
- package/dist/migrations/sql/20231229144707-more-player-constraints.d.ts +3 -0
- package/dist/migrations/sql/20231229144707-more-player-constraints.js +17 -0
- package/dist/migrations/sql/20231229144707-more-player-constraints.js.map +1 -0
- package/dist/migrations/sql/20240101162751-add-settings-constraint.d.ts +3 -0
- package/dist/migrations/sql/20240101162751-add-settings-constraint.js +34 -0
- package/dist/migrations/sql/20240101162751-add-settings-constraint.js.map +1 -0
- package/dist/migrations/sql/20240105130846-remove-some-module-perms.d.ts +3 -0
- package/dist/migrations/sql/20240105130846-remove-some-module-perms.js +80 -0
- package/dist/migrations/sql/20240105130846-remove-some-module-perms.js.map +1 -0
- package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.d.ts +3 -0
- package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.js +11 -0
- package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.js.map +1 -0
- package/dist/migrations/sql/20240119152426-remove-hook-check.d.ts +3 -0
- package/dist/migrations/sql/20240119152426-remove-hook-check.js +14 -0
- package/dist/migrations/sql/20240119152426-remove-hook-check.js.map +1 -0
- package/dist/migrations/sql/20240121142329-move-ip-history.d.ts +3 -0
- package/dist/migrations/sql/20240121142329-move-ip-history.js +44 -0
- package/dist/migrations/sql/20240121142329-move-ip-history.js.map +1 -0
- package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.d.ts +3 -0
- package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.js +13 -0
- package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.js.map +1 -0
- package/dist/migrations/sql/20240216120143-domain-state.d.ts +3 -0
- package/dist/migrations/sql/20240216120143-domain-state.js +11 -0
- package/dist/migrations/sql/20240216120143-domain-state.js.map +1 -0
- package/dist/migrations/sql/20240229141340-looser-fks-events.d.ts +3 -0
- package/dist/migrations/sql/20240229141340-looser-fks-events.js +18 -0
- package/dist/migrations/sql/20240229141340-looser-fks-events.js.map +1 -0
- package/dist/migrations/sql/20240301063505-module-functions.d.ts +3 -0
- package/dist/migrations/sql/20240301063505-module-functions.js +14 -0
- package/dist/migrations/sql/20240301063505-module-functions.js.map +1 -0
- package/dist/migrations/util/alterEnum.d.ts +1 -0
- package/dist/migrations/util/alterEnum.js +9 -0
- package/dist/migrations/util/alterEnum.js.map +1 -0
- package/dist/queryBuilder.d.ts +28 -0
- package/dist/queryBuilder.js +132 -0
- package/dist/queryBuilder.js.map +1 -0
- package/dist/redis.d.ts +20 -0
- package/dist/redis.js +49 -0
- package/dist/redis.js.map +1 -0
- package/package.json +29 -0
- package/src/TakaroModel.ts +32 -0
- package/src/__tests__/encryption.integration.test.ts +56 -0
- package/src/__tests__/queryBuilder.integration.test.ts +202 -0
- package/src/config.ts +101 -0
- package/src/encryption.ts +27 -0
- package/src/errorTypeGuards.ts +11 -0
- package/src/knex.ts +54 -0
- package/src/main.ts +15 -0
- package/src/migrations/index.ts +70 -0
- package/src/migrations/sql/20220827191938_init.ts +183 -0
- package/src/migrations/sql/20221019173729_settings.ts +70 -0
- package/src/migrations/sql/20221029103554_refactor_function_assignments.ts +41 -0
- package/src/migrations/sql/20221102190532_commands.ts +66 -0
- package/src/migrations/sql/20221203135001-builtin_modules.ts +56 -0
- package/src/migrations/sql/20230308183400-persistent-variables.ts +74 -0
- package/src/migrations/sql/20230314183400-auth-ory.ts +27 -0
- package/src/migrations/sql/20230325156123_command-arguments.ts +24 -0
- package/src/migrations/sql/20230407132022-module-descriptions.ts +13 -0
- package/src/migrations/sql/20230407143733-module-json-schema-config.ts +16 -0
- package/src/migrations/sql/20230407173055-hook-regex-optional.ts +13 -0
- package/src/migrations/sql/20230415154935-cronjob-configs.ts +18 -0
- package/src/migrations/sql/20230503132906-variables-extra-meta.ts +31 -0
- package/src/migrations/sql/20230604130951-fix-hook-eventtypes.ts +12 -0
- package/src/migrations/sql/20230617081049-discordId-for-users.ts +16 -0
- package/src/migrations/sql/20230618053611-discord-funtionality.ts +34 -0
- package/src/migrations/sql/20230622192402-discord-hooks.ts +20 -0
- package/src/migrations/sql/20230707081218-playerOnGameServerExtension.ts +21 -0
- package/src/migrations/sql/20230710174340-events.ts +21 -0
- package/src/migrations/sql/20230712061220-roles-permissions-extension.ts +50 -0
- package/src/migrations/sql/20230713184927-variables-modulescoped.ts +32 -0
- package/src/migrations/sql/20230714045136-domain-index.ts +40 -0
- package/src/migrations/sql/20230714045727-events-index.ts +19 -0
- package/src/migrations/sql/20230715102519-module-permissions-extra-fields.ts +38 -0
- package/src/migrations/sql/20230724062109-roles-constraints.ts +16 -0
- package/src/migrations/sql/20230811095701-userId-on-events.ts +14 -0
- package/src/migrations/sql/20230921123717-count-for-permissions.ts +101 -0
- package/src/migrations/sql/20231111102812-details-system-permissions.ts +192 -0
- package/src/migrations/sql/20231114151343-system-roles.ts +46 -0
- package/src/migrations/sql/20231118082301-add-new-permissions.ts +200 -0
- package/src/migrations/sql/20231119115037-timedRoles.ts +23 -0
- package/src/migrations/sql/20231123150854-economy-base.ts +15 -0
- package/src/migrations/sql/20231123171611-economy-settings.ts +15 -0
- package/src/migrations/sql/20231124140441-json-module-assignments.ts +29 -0
- package/src/migrations/sql/20231208114507-settings-refactor.ts +114 -0
- package/src/migrations/sql/20231208171234-game-items.ts +20 -0
- package/src/migrations/sql/20231216100720-player-inventory.ts +16 -0
- package/src/migrations/sql/20231222180438-steam-data.ts +27 -0
- package/src/migrations/sql/20231223132631-pog-online.ts +13 -0
- package/src/migrations/sql/20231223212031-unique-index-item-def.ts +27 -0
- package/src/migrations/sql/20231224135126-gameserver-online-status.ts +13 -0
- package/src/migrations/sql/20231224155226-unique-pog.ts +27 -0
- package/src/migrations/sql/20231225140650-extra-ip-info.ts +27 -0
- package/src/migrations/sql/20231227144315-unique-constraints-player.ts +74 -0
- package/src/migrations/sql/20231229144707-more-player-constraints.ts +20 -0
- package/src/migrations/sql/20240101162751-add-settings-constraint.ts +39 -0
- package/src/migrations/sql/20240105130846-remove-some-module-perms.ts +104 -0
- package/src/migrations/sql/20240116141936-add-ui-schema-to-module.ts +13 -0
- package/src/migrations/sql/20240119152426-remove-hook-check.ts +18 -0
- package/src/migrations/sql/20240121142329-move-ip-history.ts +53 -0
- package/src/migrations/sql/20240202101208-rename-economy-to-economyUtils.ts +15 -0
- package/src/migrations/sql/20240216120143-domain-state.ts +13 -0
- package/src/migrations/sql/20240229141340-looser-fks-events.ts +20 -0
- package/src/migrations/sql/20240301063505-module-functions.ts +17 -0
- package/src/migrations/util/alterEnum.ts +10 -0
- package/src/queryBuilder.ts +133 -0
- package/src/redis.ts +58 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +8 -0
- package/typedoc.json +3 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('players', (table) => {
|
|
5
|
+
table.string('steamAvatar').nullable();
|
|
6
|
+
table.timestamp('steamLastFetch').nullable();
|
|
7
|
+
table.timestamp('steamAccountCreated').nullable();
|
|
8
|
+
table.boolean('steamCommunityBanned').nullable();
|
|
9
|
+
table.string('steamEconomyBan').nullable();
|
|
10
|
+
table.boolean('steamVacBanned').nullable();
|
|
11
|
+
table.string('steamsDaysSinceLastBan').nullable();
|
|
12
|
+
table.string('steamNumberOfVACBans').nullable();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function down(knex: Knex): Promise<void> {
|
|
17
|
+
await knex.schema.alterTable('players', (table) => {
|
|
18
|
+
table.dropColumn('steamAvatar');
|
|
19
|
+
table.dropColumn('steamLastFetch');
|
|
20
|
+
table.dropColumn('steamAccountCreated');
|
|
21
|
+
table.dropColumn('steamCommunityBanned');
|
|
22
|
+
table.dropColumn('steamEconomyBan');
|
|
23
|
+
table.dropColumn('steamVacBanned');
|
|
24
|
+
table.dropColumn('steamsDaysSinceLastBan');
|
|
25
|
+
table.dropColumn('steamNumberOfVACBans');
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('playerOnGameServer', (table) => {
|
|
5
|
+
table.boolean('online').defaultTo(false);
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function down(knex: Knex): Promise<void> {
|
|
10
|
+
await knex.schema.alterTable('playerOnGameServer', (table) => {
|
|
11
|
+
table.dropColumn('online');
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Delete duplicates while keeping the first occurrence
|
|
5
|
+
await knex.raw(`
|
|
6
|
+
DELETE FROM items
|
|
7
|
+
WHERE id IN (
|
|
8
|
+
SELECT id
|
|
9
|
+
FROM (
|
|
10
|
+
SELECT id,
|
|
11
|
+
ROW_NUMBER() OVER (PARTITION BY code, "gameserverId", domain ORDER BY id) as rnk
|
|
12
|
+
FROM items
|
|
13
|
+
) t
|
|
14
|
+
WHERE t.rnk > 1
|
|
15
|
+
)
|
|
16
|
+
`);
|
|
17
|
+
|
|
18
|
+
await knex.schema.alterTable('items', (table) => {
|
|
19
|
+
table.unique(['code', 'gameserverId', 'domain']);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function down(knex: Knex): Promise<void> {
|
|
24
|
+
await knex.schema.alterTable('items', (table) => {
|
|
25
|
+
table.dropUnique(['code', 'gameserverId', 'domain']);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('gameservers', (table) => {
|
|
5
|
+
table.boolean('reachable').defaultTo(true);
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function down(knex: Knex): Promise<void> {
|
|
10
|
+
await knex.schema.alterTable('gameservers', (table) => {
|
|
11
|
+
table.dropColumn('reachable');
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Delete duplicate rows first
|
|
5
|
+
await knex.raw(`
|
|
6
|
+
DELETE FROM "playerOnGameServer"
|
|
7
|
+
WHERE id IN (
|
|
8
|
+
SELECT id
|
|
9
|
+
FROM (
|
|
10
|
+
SELECT id,
|
|
11
|
+
ROW_NUMBER() OVER (PARTITION BY "gameId", "gameServerId" ORDER BY id) as rnk
|
|
12
|
+
FROM "playerOnGameServer"
|
|
13
|
+
) t
|
|
14
|
+
WHERE t.rnk > 1
|
|
15
|
+
)
|
|
16
|
+
`);
|
|
17
|
+
|
|
18
|
+
await knex.schema.alterTable('playerOnGameServer', (table) => {
|
|
19
|
+
table.unique(['gameId', 'gameServerId']);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function down(knex: Knex): Promise<void> {
|
|
24
|
+
await knex.schema.alterTable('playerOnGameServer', (table) => {
|
|
25
|
+
table.dropUnique(['gameId', 'gameServerId']);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('playerOnGameServer', (table) => {
|
|
5
|
+
table.dropColumn('ip');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
await knex.schema.createTable('playerOnGameServerIp', (table) => {
|
|
9
|
+
table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
|
|
10
|
+
table.timestamps(true, true, true);
|
|
11
|
+
table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
|
|
12
|
+
table.uuid('pogId').references('playerOnGameServer.id').onDelete('CASCADE').notNullable();
|
|
13
|
+
table.specificType('ip', 'inet').notNullable();
|
|
14
|
+
table.string('country');
|
|
15
|
+
table.string('city');
|
|
16
|
+
table.string('longitude');
|
|
17
|
+
table.string('latitude');
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export async function down(knex: Knex): Promise<void> {
|
|
22
|
+
await knex.schema.dropTable('playerOnGameServerIp');
|
|
23
|
+
|
|
24
|
+
await knex.schema.alterTable('playerOnGameServer', (table) => {
|
|
25
|
+
table.specificType('ip', 'inet').nullable();
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Delete any duplicate rows first
|
|
5
|
+
// Retain the record where createdAt is the oldest
|
|
6
|
+
await knex.raw(`
|
|
7
|
+
DELETE FROM "players"
|
|
8
|
+
WHERE id IN (
|
|
9
|
+
SELECT id
|
|
10
|
+
FROM (
|
|
11
|
+
SELECT id,
|
|
12
|
+
ROW_NUMBER() OVER (PARTITION BY domain, "steamId" ORDER BY "createdAt") as rnk
|
|
13
|
+
FROM "players"
|
|
14
|
+
WHERE "steamId" IS NOT NULL
|
|
15
|
+
) t
|
|
16
|
+
WHERE t.rnk > 1
|
|
17
|
+
)
|
|
18
|
+
`);
|
|
19
|
+
|
|
20
|
+
// Also for epicOnlineServicesId
|
|
21
|
+
await knex.raw(`
|
|
22
|
+
DELETE FROM "players"
|
|
23
|
+
WHERE id IN (
|
|
24
|
+
SELECT id
|
|
25
|
+
FROM (
|
|
26
|
+
SELECT id,
|
|
27
|
+
ROW_NUMBER() OVER (PARTITION BY domain, "epicOnlineServicesId" ORDER BY "createdAt") as rnk
|
|
28
|
+
FROM "players"
|
|
29
|
+
WHERE "epicOnlineServicesId" IS NOT NULL
|
|
30
|
+
) t
|
|
31
|
+
WHERE t.rnk > 1
|
|
32
|
+
)
|
|
33
|
+
`);
|
|
34
|
+
|
|
35
|
+
// And xbox
|
|
36
|
+
await knex.raw(`
|
|
37
|
+
DELETE FROM "players"
|
|
38
|
+
WHERE id IN (
|
|
39
|
+
SELECT id
|
|
40
|
+
FROM (
|
|
41
|
+
SELECT id,
|
|
42
|
+
ROW_NUMBER() OVER (PARTITION BY domain, "xboxLiveId" ORDER BY "createdAt") as rnk
|
|
43
|
+
FROM "players"
|
|
44
|
+
WHERE "xboxLiveId" IS NOT NULL
|
|
45
|
+
) t
|
|
46
|
+
WHERE t.rnk > 1
|
|
47
|
+
)
|
|
48
|
+
`);
|
|
49
|
+
|
|
50
|
+
await knex.schema.alterTable('players', (table) => {
|
|
51
|
+
table.unique(['domain', 'steamId']);
|
|
52
|
+
table.unique(['domain', 'epicOnlineServicesId']);
|
|
53
|
+
table.unique(['domain', 'xboxLiveId']);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
await knex.raw(`
|
|
57
|
+
ALTER TABLE players
|
|
58
|
+
ADD CONSTRAINT players_domain_steam_xbox_eos_unique
|
|
59
|
+
UNIQUE NULLS NOT DISTINCT (domain, "steamId", "xboxLiveId", "epicOnlineServicesId");
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function down(knex: Knex): Promise<void> {
|
|
64
|
+
await knex.schema.alterTable('players', (table) => {
|
|
65
|
+
table.dropUnique(['domain', 'steamId']);
|
|
66
|
+
table.dropUnique(['domain', 'epicOnlineServicesId']);
|
|
67
|
+
table.dropUnique(['domain', 'xboxLiveId']);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await knex.raw(`
|
|
71
|
+
ALTER TABLE players
|
|
72
|
+
DROP CONSTRAINT players_domain_steam_xbox_eos_unique;
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Find all players that have epicOnlineServicesId starting with EOS_ and delete them
|
|
5
|
+
await knex.raw(`
|
|
6
|
+
DELETE FROM "players"
|
|
7
|
+
WHERE "epicOnlineServicesId" LIKE 'EOS_%'
|
|
8
|
+
`);
|
|
9
|
+
|
|
10
|
+
await knex.schema.alterTable('players', (table) => {
|
|
11
|
+
// epicOnlineServicesId is always 32 chars
|
|
12
|
+
table.string('epicOnlineServicesId', 32).alter();
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export async function down(knex: Knex): Promise<void> {
|
|
17
|
+
await knex.schema.alterTable('players', (table) => {
|
|
18
|
+
table.string('epicOnlineServicesId', 255).alter();
|
|
19
|
+
});
|
|
20
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Delete any settings where duplicate key, same domain and null gameServerId
|
|
5
|
+
await knex.raw(`
|
|
6
|
+
DELETE FROM settings
|
|
7
|
+
WHERE id IN (
|
|
8
|
+
SELECT id
|
|
9
|
+
FROM (
|
|
10
|
+
SELECT id, ROW_NUMBER() OVER (partition BY key, domain ORDER BY id) AS rnum
|
|
11
|
+
FROM settings
|
|
12
|
+
WHERE "gameServerId" IS NULL
|
|
13
|
+
) t
|
|
14
|
+
WHERE t.rnum > 1
|
|
15
|
+
);
|
|
16
|
+
`);
|
|
17
|
+
|
|
18
|
+
// Drop the old constraint
|
|
19
|
+
await knex.schema.alterTable('settings', (table) => {
|
|
20
|
+
table.dropUnique(['key', 'domain', 'gameServerId'], 'new_settings_domain_key_gameserverid_unique');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
await knex.raw(`
|
|
24
|
+
ALTER TABLE settings
|
|
25
|
+
ADD CONSTRAINT settings_key_domain_unique
|
|
26
|
+
UNIQUE NULLS NOT DISTINCT (key, domain, "gameServerId");
|
|
27
|
+
`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function down(knex: Knex): Promise<void> {
|
|
31
|
+
await knex.raw(`
|
|
32
|
+
ALTER TABLE settings
|
|
33
|
+
DROP CONSTRAINT settings_key_domain_unique;
|
|
34
|
+
`);
|
|
35
|
+
|
|
36
|
+
await knex.schema.alterTable('settings', (table) => {
|
|
37
|
+
table.unique(['key', 'domain', 'gameServerId'], 'new_settings_domain_key_gameserverid_unique');
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// All perms to-be-deleted
|
|
5
|
+
const readPermissions = ['READ_FUNCTIONS', 'READ_CRONJOBS', 'READ_HOOKS', 'READ_COMMANDS'];
|
|
6
|
+
|
|
7
|
+
const managePermissions = ['MANAGE_FUNCTIONS', 'MANAGE_CRONJOBS', 'MANAGE_HOOKS', 'MANAGE_COMMANDS'];
|
|
8
|
+
|
|
9
|
+
// First, find all permissions that are to be deleted
|
|
10
|
+
const readPerms = await knex('permission').whereIn('permission', readPermissions).select('id');
|
|
11
|
+
|
|
12
|
+
const managePerms = await knex('permission').whereIn('permission', managePermissions).select('id');
|
|
13
|
+
|
|
14
|
+
// Then, find the READ_MODULES and MANAGE_MODULES permissions
|
|
15
|
+
const readModulePerm = await knex('permission').where('permission', 'READ_MODULES').select('id').first();
|
|
16
|
+
|
|
17
|
+
const manageModulePerm = await knex('permission').where('permission', 'MANAGE_MODULES').select('id').first();
|
|
18
|
+
|
|
19
|
+
// Then, find all permissionOnRole entries that reference those permissions
|
|
20
|
+
const readPermissionOnRole = await knex('permissionOnRole')
|
|
21
|
+
.whereIn(
|
|
22
|
+
'permissionId',
|
|
23
|
+
readPerms.map((p) => p.id)
|
|
24
|
+
)
|
|
25
|
+
.select('id');
|
|
26
|
+
|
|
27
|
+
const managePermissionOnRole = await knex('permissionOnRole')
|
|
28
|
+
.whereIn(
|
|
29
|
+
'permissionId',
|
|
30
|
+
managePerms.map((p) => p.id)
|
|
31
|
+
)
|
|
32
|
+
.select('id');
|
|
33
|
+
|
|
34
|
+
// Then, update the permissionOnRole entries to reference the new permissions
|
|
35
|
+
await knex('permissionOnRole')
|
|
36
|
+
.whereIn(
|
|
37
|
+
'id',
|
|
38
|
+
readPermissionOnRole.map((p) => p.id)
|
|
39
|
+
)
|
|
40
|
+
.update({
|
|
41
|
+
permissionId: readModulePerm.id,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
await knex('permissionOnRole')
|
|
45
|
+
.whereIn(
|
|
46
|
+
'id',
|
|
47
|
+
managePermissionOnRole.map((p) => p.id)
|
|
48
|
+
)
|
|
49
|
+
.update({
|
|
50
|
+
permissionId: manageModulePerm.id,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Then, delete the old perms
|
|
54
|
+
await knex('permission')
|
|
55
|
+
.whereIn('permission', [...readPermissions, ...managePermissions])
|
|
56
|
+
.del();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function down(knex: Knex): Promise<void> {
|
|
60
|
+
// Cant actually undo this, we deleted the data (:
|
|
61
|
+
// Just put back the old perms
|
|
62
|
+
await knex('permission').insert([
|
|
63
|
+
{
|
|
64
|
+
permission: 'READ_FUNCTIONS',
|
|
65
|
+
description: 'Read functions',
|
|
66
|
+
friendlyName: 'Read Functions',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
permission: 'READ_CRONJOBS',
|
|
70
|
+
description: 'Read cronjobs',
|
|
71
|
+
friendlyName: 'Read Cronjobs',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
permission: 'READ_HOOKS',
|
|
75
|
+
description: 'Read hooks',
|
|
76
|
+
friendlyName: 'Read Hooks',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
permission: 'READ_COMMANDS',
|
|
80
|
+
description: 'Read commands',
|
|
81
|
+
friendlyName: 'Read Commands',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
permission: 'MANAGE_FUNCTIONS',
|
|
85
|
+
description: 'Manage functions',
|
|
86
|
+
friendlyName: 'Manage Functions',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
permission: 'MANAGE_CRONJOBS',
|
|
90
|
+
description: 'Manage cronjobs',
|
|
91
|
+
friendlyName: 'Manage Cronjobs',
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
permission: 'MANAGE_HOOKS',
|
|
95
|
+
description: 'Manage hooks',
|
|
96
|
+
friendlyName: 'Manage Hooks',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
permission: 'MANAGE_COMMANDS',
|
|
100
|
+
description: 'Manage commands',
|
|
101
|
+
friendlyName: 'Manage Commands',
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('modules', (table) => {
|
|
5
|
+
table.text('uiSchema').defaultTo('{}').notNullable();
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function down(knex: Knex): Promise<void> {
|
|
10
|
+
await knex.schema.alterTable('modules', (table) => {
|
|
11
|
+
table.dropColumn('uiSchema');
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
import { formatAlterTableEnumSql } from '../util/alterEnum.js';
|
|
3
|
+
|
|
4
|
+
export async function up(knex: Knex): Promise<void> {
|
|
5
|
+
await knex.raw('ALTER TABLE hooks DROP CONSTRAINT "hooks_eventType_check";');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export async function down(knex: Knex): Promise<void> {
|
|
9
|
+
await knex.raw(
|
|
10
|
+
formatAlterTableEnumSql('hooks', 'eventType', [
|
|
11
|
+
'log',
|
|
12
|
+
'player-connected',
|
|
13
|
+
'player-disconnected',
|
|
14
|
+
'chat-message',
|
|
15
|
+
'discord-message',
|
|
16
|
+
])
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.createTable('playerIpHistory', (table) => {
|
|
5
|
+
table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
|
|
6
|
+
table.timestamps(true, true, true);
|
|
7
|
+
table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
|
|
8
|
+
table.uuid('playerId').references('players.id').onDelete('CASCADE').notNullable();
|
|
9
|
+
table.uuid('gameServerId').references('gameservers.id').onDelete('SET NULL').nullable();
|
|
10
|
+
table.specificType('ip', 'inet').notNullable();
|
|
11
|
+
table.string('country');
|
|
12
|
+
table.string('city');
|
|
13
|
+
table.string('longitude');
|
|
14
|
+
table.string('latitude');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Transfer all the old IP history to new table
|
|
18
|
+
|
|
19
|
+
const oldIpHistory = await knex('playerOnGameServerIp').select('*');
|
|
20
|
+
|
|
21
|
+
const newRecords = await Promise.all(
|
|
22
|
+
oldIpHistory.map(async (ipHistory) => {
|
|
23
|
+
const pog = await knex('playerOnGameServer').select('*').where('id', ipHistory.pogId).first();
|
|
24
|
+
delete ipHistory.pogId;
|
|
25
|
+
return {
|
|
26
|
+
...ipHistory,
|
|
27
|
+
playerId: pog.playerId,
|
|
28
|
+
gameServerId: pog.gameServerId,
|
|
29
|
+
};
|
|
30
|
+
})
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (newRecords.length) {
|
|
34
|
+
await knex('playerIpHistory').insert(newRecords);
|
|
35
|
+
}
|
|
36
|
+
await knex.schema.dropTable('playerOnGameServerIp');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function down(knex: Knex): Promise<void> {
|
|
40
|
+
await knex.schema.dropTable('playerIpHistory');
|
|
41
|
+
|
|
42
|
+
await knex.schema.createTable('playerOnGameServerIp', (table) => {
|
|
43
|
+
table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
|
|
44
|
+
table.timestamps(true, true, true);
|
|
45
|
+
table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
|
|
46
|
+
table.uuid('pogId').references('playerOnGameServer.id').onDelete('CASCADE').notNullable();
|
|
47
|
+
table.specificType('ip', 'inet').notNullable();
|
|
48
|
+
table.string('country');
|
|
49
|
+
table.string('city');
|
|
50
|
+
table.string('longitude');
|
|
51
|
+
table.string('latitude');
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex('modules').where('builtin', '=', 'economy').update({
|
|
5
|
+
builtin: 'economyUtils',
|
|
6
|
+
name: 'economyUtils',
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export async function down(knex: Knex): Promise<void> {
|
|
11
|
+
await knex('modules').where('builtin', '=', 'economyUtils').update({
|
|
12
|
+
builtin: 'economy',
|
|
13
|
+
name: 'economy',
|
|
14
|
+
});
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('domains', (table) => {
|
|
5
|
+
table.enum('state', ['ACTIVE', 'DISABLED', 'MAINTENANCE']).notNullable().defaultTo('ACTIVE');
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export async function down(knex: Knex): Promise<void> {
|
|
10
|
+
await knex.schema.alterTable('domains', (table) => {
|
|
11
|
+
table.dropColumn('state');
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// When player, module, gameserver or userId is deleted, keep the event
|
|
5
|
+
await knex.schema.alterTable('events', (table) => {
|
|
6
|
+
table.dropForeign(['playerId']);
|
|
7
|
+
table.dropForeign(['moduleId']);
|
|
8
|
+
table.dropForeign(['gameserverId']);
|
|
9
|
+
table.dropForeign(['userId']);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function down(knex: Knex): Promise<void> {
|
|
14
|
+
await knex.schema.alterTable('events', (table) => {
|
|
15
|
+
table.foreign('playerId').references('id').inTable('players').onDelete('CASCADE');
|
|
16
|
+
table.foreign('moduleId').references('id').inTable('modules').onDelete('CASCADE');
|
|
17
|
+
table.foreign('gameserverId').references('id').inTable('gameservers').onDelete('CASCADE');
|
|
18
|
+
table.foreign('userId').references('id').inTable('users').onDelete('CASCADE');
|
|
19
|
+
});
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
await knex.schema.alterTable('functions', (table) => {
|
|
5
|
+
table.string('name').nullable();
|
|
6
|
+
table.uuid('moduleId').nullable();
|
|
7
|
+
table.foreign('moduleId').references('id').inTable('modules');
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function down(knex: Knex): Promise<void> {
|
|
12
|
+
await knex.schema.dropTable('module_functions');
|
|
13
|
+
|
|
14
|
+
await knex.schema.alterTable('functions', (table) => {
|
|
15
|
+
table.dropColumn('name');
|
|
16
|
+
});
|
|
17
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/* eslint-disable quotes */
|
|
2
|
+
export function formatAlterTableEnumSql(tableName: string, columnName: string, enums: string[]) {
|
|
3
|
+
const constraintName = `${tableName}_${columnName}_check`;
|
|
4
|
+
return [
|
|
5
|
+
`ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${constraintName}";`,
|
|
6
|
+
`ALTER TABLE "${tableName}" ADD CONSTRAINT "${constraintName}" CHECK ("${columnName}" = ANY (ARRAY['${enums.join(
|
|
7
|
+
"'::text, '"
|
|
8
|
+
)}'::text]));`,
|
|
9
|
+
].join('\n');
|
|
10
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { IsDateString, IsEnum, IsNumber, IsOptional, IsString } from 'class-validator';
|
|
2
|
+
import { QueryBuilder as ObjectionQueryBuilder, Model as ObjectionModel, Page, AnyQueryBuilder } from 'objection';
|
|
3
|
+
|
|
4
|
+
export class ITakaroQuery<T> {
|
|
5
|
+
@IsOptional()
|
|
6
|
+
filters?: {
|
|
7
|
+
[key in keyof T]?: unknown[] | unknown;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
@IsOptional()
|
|
11
|
+
search?: {
|
|
12
|
+
[key in keyof T]?: unknown[] | unknown;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
@IsOptional()
|
|
16
|
+
@IsNumber()
|
|
17
|
+
page?: number;
|
|
18
|
+
|
|
19
|
+
@IsOptional()
|
|
20
|
+
@IsNumber()
|
|
21
|
+
limit?: number;
|
|
22
|
+
|
|
23
|
+
@IsOptional()
|
|
24
|
+
@IsString()
|
|
25
|
+
sortBy?: Extract<keyof T, string>;
|
|
26
|
+
|
|
27
|
+
@IsOptional()
|
|
28
|
+
@IsString()
|
|
29
|
+
@IsEnum(['asc', 'desc'])
|
|
30
|
+
sortDirection?: SortDirection;
|
|
31
|
+
|
|
32
|
+
@IsOptional()
|
|
33
|
+
@IsDateString()
|
|
34
|
+
startDate?: string;
|
|
35
|
+
|
|
36
|
+
@IsOptional()
|
|
37
|
+
@IsDateString()
|
|
38
|
+
endDate?: string;
|
|
39
|
+
|
|
40
|
+
@IsOptional()
|
|
41
|
+
@IsString({ each: true })
|
|
42
|
+
extend?: string[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export enum SortDirection {
|
|
46
|
+
asc = 'asc',
|
|
47
|
+
desc = 'desc',
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class QueryBuilder<Model extends ObjectionModel, OutputDTO> {
|
|
51
|
+
constructor(private readonly query: ITakaroQuery<OutputDTO> = new ITakaroQuery()) {}
|
|
52
|
+
|
|
53
|
+
build(query: ObjectionQueryBuilder<Model, Model[]>): ObjectionQueryBuilder<Model, Page<Model>> {
|
|
54
|
+
const tableName = query.modelClass().tableName;
|
|
55
|
+
|
|
56
|
+
const pagination = this.pagination();
|
|
57
|
+
const sorting = this.sorting();
|
|
58
|
+
|
|
59
|
+
let qry = query.page(pagination.page, pagination.limit).orderBy(sorting.sortBy, sorting.sortDirection);
|
|
60
|
+
|
|
61
|
+
if (this.query.startDate) {
|
|
62
|
+
qry = qry.where(`${tableName}.createdAt`, '>=', this.query.startDate);
|
|
63
|
+
}
|
|
64
|
+
if (this.query.endDate) {
|
|
65
|
+
qry = qry.where(`${tableName}.createdAt`, '<=', this.query.endDate);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
qry = this.filters(tableName, qry);
|
|
69
|
+
|
|
70
|
+
if (this.query.search) {
|
|
71
|
+
qry.where((builder) => {
|
|
72
|
+
for (const search in this.query.search) {
|
|
73
|
+
if (Object.prototype.hasOwnProperty.call(this.query.search, search)) {
|
|
74
|
+
const searchVal = this.query.search[search];
|
|
75
|
+
if (Array.isArray(searchVal)) {
|
|
76
|
+
searchVal.forEach((val) => {
|
|
77
|
+
if (val) {
|
|
78
|
+
builder.orWhere(`${tableName}.${search}`, 'ilike', `%${val}%`);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
for (const extend of this.query.extend ?? []) {
|
|
88
|
+
qry.withGraphFetched(extend);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return qry;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private filters(
|
|
95
|
+
tableName: string,
|
|
96
|
+
query: ObjectionQueryBuilder<Model, Page<Model>>
|
|
97
|
+
): ObjectionQueryBuilder<Model, Page<Model>> {
|
|
98
|
+
for (const filter in this.query.filters) {
|
|
99
|
+
if (Object.prototype.hasOwnProperty.call(this.query.filters, filter)) {
|
|
100
|
+
const searchVal = this.query.filters[filter];
|
|
101
|
+
|
|
102
|
+
if (searchVal && Array.isArray(searchVal)) {
|
|
103
|
+
const filtered = searchVal.filter(Boolean);
|
|
104
|
+
if (filtered.length) {
|
|
105
|
+
query.whereIn(`${tableName}.${filter}`, searchVal.filter(Boolean) as unknown as AnyQueryBuilder);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return query;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private sorting(): { sortBy: string; sortDirection: SortDirection } {
|
|
115
|
+
if (!this.query.sortBy) {
|
|
116
|
+
return {
|
|
117
|
+
sortBy: 'id',
|
|
118
|
+
sortDirection: SortDirection.asc,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
sortBy: this.query.sortBy,
|
|
123
|
+
sortDirection: this.query.sortDirection ?? SortDirection.asc,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private pagination() {
|
|
128
|
+
return {
|
|
129
|
+
page: this.query.page ?? 0,
|
|
130
|
+
limit: this.query.limit ?? 100,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|