@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.
Files changed (263) hide show
  1. package/README.md +1 -0
  2. package/dist/TakaroModel.d.ts +15 -0
  3. package/dist/TakaroModel.js +23 -0
  4. package/dist/TakaroModel.js.map +1 -0
  5. package/dist/config.d.ts +98 -0
  6. package/dist/config.js +81 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/encryption.d.ts +4 -0
  9. package/dist/encryption.js +24 -0
  10. package/dist/encryption.js.map +1 -0
  11. package/dist/errorTypeGuards.d.ts +2 -0
  12. package/dist/errorTypeGuards.js +11 -0
  13. package/dist/errorTypeGuards.js.map +1 -0
  14. package/dist/knex.d.ts +16 -0
  15. package/dist/knex.js +46 -0
  16. package/dist/knex.js.map +1 -0
  17. package/dist/main.d.ts +8 -0
  18. package/dist/main.js +9 -0
  19. package/dist/main.js.map +1 -0
  20. package/dist/migrations/index.d.ts +2 -0
  21. package/dist/migrations/index.js +59 -0
  22. package/dist/migrations/index.js.map +1 -0
  23. package/dist/migrations/sql/20220827191938_init.d.ts +3 -0
  24. package/dist/migrations/sql/20220827191938_init.js +155 -0
  25. package/dist/migrations/sql/20220827191938_init.js.map +1 -0
  26. package/dist/migrations/sql/20221019173729_settings.d.ts +3 -0
  27. package/dist/migrations/sql/20221019173729_settings.js +61 -0
  28. package/dist/migrations/sql/20221019173729_settings.js.map +1 -0
  29. package/dist/migrations/sql/20221029103554_refactor_function_assignments.d.ts +3 -0
  30. package/dist/migrations/sql/20221029103554_refactor_function_assignments.js +33 -0
  31. package/dist/migrations/sql/20221029103554_refactor_function_assignments.js.map +1 -0
  32. package/dist/migrations/sql/20221102190532_commands.d.ts +3 -0
  33. package/dist/migrations/sql/20221102190532_commands.js +58 -0
  34. package/dist/migrations/sql/20221102190532_commands.js.map +1 -0
  35. package/dist/migrations/sql/20221203135001-builtin_modules.d.ts +3 -0
  36. package/dist/migrations/sql/20221203135001-builtin_modules.js +44 -0
  37. package/dist/migrations/sql/20221203135001-builtin_modules.js.map +1 -0
  38. package/dist/migrations/sql/20230308183400-persistent-variables.d.ts +3 -0
  39. package/dist/migrations/sql/20230308183400-persistent-variables.js +63 -0
  40. package/dist/migrations/sql/20230308183400-persistent-variables.js.map +1 -0
  41. package/dist/migrations/sql/20230314183400-auth-ory.d.ts +3 -0
  42. package/dist/migrations/sql/20230314183400-auth-ory.js +23 -0
  43. package/dist/migrations/sql/20230314183400-auth-ory.js.map +1 -0
  44. package/dist/migrations/sql/20230325156123_command-arguments.d.ts +3 -0
  45. package/dist/migrations/sql/20230325156123_command-arguments.js +19 -0
  46. package/dist/migrations/sql/20230325156123_command-arguments.js.map +1 -0
  47. package/dist/migrations/sql/20230407132022-module-descriptions.d.ts +3 -0
  48. package/dist/migrations/sql/20230407132022-module-descriptions.js +11 -0
  49. package/dist/migrations/sql/20230407132022-module-descriptions.js.map +1 -0
  50. package/dist/migrations/sql/20230407143733-module-json-schema-config.d.ts +3 -0
  51. package/dist/migrations/sql/20230407143733-module-json-schema-config.js +14 -0
  52. package/dist/migrations/sql/20230407143733-module-json-schema-config.js.map +1 -0
  53. package/dist/migrations/sql/20230407173055-hook-regex-optional.d.ts +3 -0
  54. package/dist/migrations/sql/20230407173055-hook-regex-optional.js +11 -0
  55. package/dist/migrations/sql/20230407173055-hook-regex-optional.js.map +1 -0
  56. package/dist/migrations/sql/20230415154935-cronjob-configs.d.ts +3 -0
  57. package/dist/migrations/sql/20230415154935-cronjob-configs.js +16 -0
  58. package/dist/migrations/sql/20230415154935-cronjob-configs.js.map +1 -0
  59. package/dist/migrations/sql/20230503132906-variables-extra-meta.d.ts +3 -0
  60. package/dist/migrations/sql/20230503132906-variables-extra-meta.js +26 -0
  61. package/dist/migrations/sql/20230503132906-variables-extra-meta.js.map +1 -0
  62. package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.d.ts +3 -0
  63. package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.js +8 -0
  64. package/dist/migrations/sql/20230604130951-fix-hook-eventtypes.js.map +1 -0
  65. package/dist/migrations/sql/20230617081049-discordId-for-users.d.ts +3 -0
  66. package/dist/migrations/sql/20230617081049-discordId-for-users.js +14 -0
  67. package/dist/migrations/sql/20230617081049-discordId-for-users.js.map +1 -0
  68. package/dist/migrations/sql/20230618053611-discord-funtionality.d.ts +3 -0
  69. package/dist/migrations/sql/20230618053611-discord-funtionality.js +26 -0
  70. package/dist/migrations/sql/20230618053611-discord-funtionality.js.map +1 -0
  71. package/dist/migrations/sql/20230622192402-discord-hooks.d.ts +3 -0
  72. package/dist/migrations/sql/20230622192402-discord-hooks.js +14 -0
  73. package/dist/migrations/sql/20230622192402-discord-hooks.js.map +1 -0
  74. package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.d.ts +3 -0
  75. package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.js +19 -0
  76. package/dist/migrations/sql/20230707081218-playerOnGameServerExtension.js.map +1 -0
  77. package/dist/migrations/sql/20230710174340-events.d.ts +3 -0
  78. package/dist/migrations/sql/20230710174340-events.js +16 -0
  79. package/dist/migrations/sql/20230710174340-events.js.map +1 -0
  80. package/dist/migrations/sql/20230712061220-roles-permissions-extension.d.ts +3 -0
  81. package/dist/migrations/sql/20230712061220-roles-permissions-extension.js +43 -0
  82. package/dist/migrations/sql/20230712061220-roles-permissions-extension.js.map +1 -0
  83. package/dist/migrations/sql/20230713184927-variables-modulescoped.d.ts +3 -0
  84. package/dist/migrations/sql/20230713184927-variables-modulescoped.js +27 -0
  85. package/dist/migrations/sql/20230713184927-variables-modulescoped.js.map +1 -0
  86. package/dist/migrations/sql/20230714045136-domain-index.d.ts +3 -0
  87. package/dist/migrations/sql/20230714045136-domain-index.js +37 -0
  88. package/dist/migrations/sql/20230714045136-domain-index.js.map +1 -0
  89. package/dist/migrations/sql/20230714045727-events-index.d.ts +3 -0
  90. package/dist/migrations/sql/20230714045727-events-index.js +17 -0
  91. package/dist/migrations/sql/20230714045727-events-index.js.map +1 -0
  92. package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.d.ts +3 -0
  93. package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.js +32 -0
  94. package/dist/migrations/sql/20230715102519-module-permissions-extra-fields.js.map +1 -0
  95. package/dist/migrations/sql/20230724062109-roles-constraints.d.ts +3 -0
  96. package/dist/migrations/sql/20230724062109-roles-constraints.js +14 -0
  97. package/dist/migrations/sql/20230724062109-roles-constraints.js.map +1 -0
  98. package/dist/migrations/sql/20230811095701-userId-on-events.d.ts +3 -0
  99. package/dist/migrations/sql/20230811095701-userId-on-events.js +12 -0
  100. package/dist/migrations/sql/20230811095701-userId-on-events.js.map +1 -0
  101. package/dist/migrations/sql/20230921123717-count-for-permissions.d.ts +3 -0
  102. package/dist/migrations/sql/20230921123717-count-for-permissions.js +84 -0
  103. package/dist/migrations/sql/20230921123717-count-for-permissions.js.map +1 -0
  104. package/dist/migrations/sql/20231111102812-details-system-permissions.d.ts +36 -0
  105. package/dist/migrations/sql/20231111102812-details-system-permissions.js +179 -0
  106. package/dist/migrations/sql/20231111102812-details-system-permissions.js.map +1 -0
  107. package/dist/migrations/sql/20231114151343-system-roles.d.ts +3 -0
  108. package/dist/migrations/sql/20231114151343-system-roles.js +41 -0
  109. package/dist/migrations/sql/20231114151343-system-roles.js.map +1 -0
  110. package/dist/migrations/sql/20231118082301-add-new-permissions.d.ts +36 -0
  111. package/dist/migrations/sql/20231118082301-add-new-permissions.js +186 -0
  112. package/dist/migrations/sql/20231118082301-add-new-permissions.js.map +1 -0
  113. package/dist/migrations/sql/20231119115037-timedRoles.d.ts +3 -0
  114. package/dist/migrations/sql/20231119115037-timedRoles.js +19 -0
  115. package/dist/migrations/sql/20231119115037-timedRoles.js.map +1 -0
  116. package/dist/migrations/sql/20231123150854-economy-base.d.ts +3 -0
  117. package/dist/migrations/sql/20231123150854-economy-base.js +13 -0
  118. package/dist/migrations/sql/20231123150854-economy-base.js.map +1 -0
  119. package/dist/migrations/sql/20231123171611-economy-settings.d.ts +3 -0
  120. package/dist/migrations/sql/20231123171611-economy-settings.js +13 -0
  121. package/dist/migrations/sql/20231123171611-economy-settings.js.map +1 -0
  122. package/dist/migrations/sql/20231124140441-json-module-assignments.d.ts +3 -0
  123. package/dist/migrations/sql/20231124140441-json-module-assignments.js +25 -0
  124. package/dist/migrations/sql/20231124140441-json-module-assignments.js.map +1 -0
  125. package/dist/migrations/sql/20231208114507-settings-refactor.d.ts +3 -0
  126. package/dist/migrations/sql/20231208114507-settings-refactor.js +95 -0
  127. package/dist/migrations/sql/20231208114507-settings-refactor.js.map +1 -0
  128. package/dist/migrations/sql/20231208171234-game-items.d.ts +3 -0
  129. package/dist/migrations/sql/20231208171234-game-items.js +18 -0
  130. package/dist/migrations/sql/20231208171234-game-items.js.map +1 -0
  131. package/dist/migrations/sql/20231216100720-player-inventory.d.ts +3 -0
  132. package/dist/migrations/sql/20231216100720-player-inventory.js +14 -0
  133. package/dist/migrations/sql/20231216100720-player-inventory.js.map +1 -0
  134. package/dist/migrations/sql/20231222180438-steam-data.d.ts +3 -0
  135. package/dist/migrations/sql/20231222180438-steam-data.js +25 -0
  136. package/dist/migrations/sql/20231222180438-steam-data.js.map +1 -0
  137. package/dist/migrations/sql/20231223132631-pog-online.d.ts +3 -0
  138. package/dist/migrations/sql/20231223132631-pog-online.js +11 -0
  139. package/dist/migrations/sql/20231223132631-pog-online.js.map +1 -0
  140. package/dist/migrations/sql/20231223212031-unique-index-item-def.d.ts +3 -0
  141. package/dist/migrations/sql/20231223212031-unique-index-item-def.js +24 -0
  142. package/dist/migrations/sql/20231223212031-unique-index-item-def.js.map +1 -0
  143. package/dist/migrations/sql/20231224135126-gameserver-online-status.d.ts +3 -0
  144. package/dist/migrations/sql/20231224135126-gameserver-online-status.js +11 -0
  145. package/dist/migrations/sql/20231224135126-gameserver-online-status.js.map +1 -0
  146. package/dist/migrations/sql/20231224155226-unique-pog.d.ts +3 -0
  147. package/dist/migrations/sql/20231224155226-unique-pog.js +24 -0
  148. package/dist/migrations/sql/20231224155226-unique-pog.js.map +1 -0
  149. package/dist/migrations/sql/20231225140650-extra-ip-info.d.ts +3 -0
  150. package/dist/migrations/sql/20231225140650-extra-ip-info.js +23 -0
  151. package/dist/migrations/sql/20231225140650-extra-ip-info.js.map +1 -0
  152. package/dist/migrations/sql/20231227144315-unique-constraints-player.d.ts +3 -0
  153. package/dist/migrations/sql/20231227144315-unique-constraints-player.js +67 -0
  154. package/dist/migrations/sql/20231227144315-unique-constraints-player.js.map +1 -0
  155. package/dist/migrations/sql/20231229144707-more-player-constraints.d.ts +3 -0
  156. package/dist/migrations/sql/20231229144707-more-player-constraints.js +17 -0
  157. package/dist/migrations/sql/20231229144707-more-player-constraints.js.map +1 -0
  158. package/dist/migrations/sql/20240101162751-add-settings-constraint.d.ts +3 -0
  159. package/dist/migrations/sql/20240101162751-add-settings-constraint.js +34 -0
  160. package/dist/migrations/sql/20240101162751-add-settings-constraint.js.map +1 -0
  161. package/dist/migrations/sql/20240105130846-remove-some-module-perms.d.ts +3 -0
  162. package/dist/migrations/sql/20240105130846-remove-some-module-perms.js +80 -0
  163. package/dist/migrations/sql/20240105130846-remove-some-module-perms.js.map +1 -0
  164. package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.d.ts +3 -0
  165. package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.js +11 -0
  166. package/dist/migrations/sql/20240116141936-add-ui-schema-to-module.js.map +1 -0
  167. package/dist/migrations/sql/20240119152426-remove-hook-check.d.ts +3 -0
  168. package/dist/migrations/sql/20240119152426-remove-hook-check.js +14 -0
  169. package/dist/migrations/sql/20240119152426-remove-hook-check.js.map +1 -0
  170. package/dist/migrations/sql/20240121142329-move-ip-history.d.ts +3 -0
  171. package/dist/migrations/sql/20240121142329-move-ip-history.js +44 -0
  172. package/dist/migrations/sql/20240121142329-move-ip-history.js.map +1 -0
  173. package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.d.ts +3 -0
  174. package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.js +13 -0
  175. package/dist/migrations/sql/20240202101208-rename-economy-to-economyUtils.js.map +1 -0
  176. package/dist/migrations/sql/20240216120143-domain-state.d.ts +3 -0
  177. package/dist/migrations/sql/20240216120143-domain-state.js +11 -0
  178. package/dist/migrations/sql/20240216120143-domain-state.js.map +1 -0
  179. package/dist/migrations/sql/20240229141340-looser-fks-events.d.ts +3 -0
  180. package/dist/migrations/sql/20240229141340-looser-fks-events.js +18 -0
  181. package/dist/migrations/sql/20240229141340-looser-fks-events.js.map +1 -0
  182. package/dist/migrations/sql/20240301063505-module-functions.d.ts +3 -0
  183. package/dist/migrations/sql/20240301063505-module-functions.js +14 -0
  184. package/dist/migrations/sql/20240301063505-module-functions.js.map +1 -0
  185. package/dist/migrations/util/alterEnum.d.ts +1 -0
  186. package/dist/migrations/util/alterEnum.js +9 -0
  187. package/dist/migrations/util/alterEnum.js.map +1 -0
  188. package/dist/queryBuilder.d.ts +28 -0
  189. package/dist/queryBuilder.js +132 -0
  190. package/dist/queryBuilder.js.map +1 -0
  191. package/dist/redis.d.ts +20 -0
  192. package/dist/redis.js +49 -0
  193. package/dist/redis.js.map +1 -0
  194. package/package.json +29 -0
  195. package/src/TakaroModel.ts +32 -0
  196. package/src/__tests__/encryption.integration.test.ts +56 -0
  197. package/src/__tests__/queryBuilder.integration.test.ts +202 -0
  198. package/src/config.ts +101 -0
  199. package/src/encryption.ts +27 -0
  200. package/src/errorTypeGuards.ts +11 -0
  201. package/src/knex.ts +54 -0
  202. package/src/main.ts +15 -0
  203. package/src/migrations/index.ts +70 -0
  204. package/src/migrations/sql/20220827191938_init.ts +183 -0
  205. package/src/migrations/sql/20221019173729_settings.ts +70 -0
  206. package/src/migrations/sql/20221029103554_refactor_function_assignments.ts +41 -0
  207. package/src/migrations/sql/20221102190532_commands.ts +66 -0
  208. package/src/migrations/sql/20221203135001-builtin_modules.ts +56 -0
  209. package/src/migrations/sql/20230308183400-persistent-variables.ts +74 -0
  210. package/src/migrations/sql/20230314183400-auth-ory.ts +27 -0
  211. package/src/migrations/sql/20230325156123_command-arguments.ts +24 -0
  212. package/src/migrations/sql/20230407132022-module-descriptions.ts +13 -0
  213. package/src/migrations/sql/20230407143733-module-json-schema-config.ts +16 -0
  214. package/src/migrations/sql/20230407173055-hook-regex-optional.ts +13 -0
  215. package/src/migrations/sql/20230415154935-cronjob-configs.ts +18 -0
  216. package/src/migrations/sql/20230503132906-variables-extra-meta.ts +31 -0
  217. package/src/migrations/sql/20230604130951-fix-hook-eventtypes.ts +12 -0
  218. package/src/migrations/sql/20230617081049-discordId-for-users.ts +16 -0
  219. package/src/migrations/sql/20230618053611-discord-funtionality.ts +34 -0
  220. package/src/migrations/sql/20230622192402-discord-hooks.ts +20 -0
  221. package/src/migrations/sql/20230707081218-playerOnGameServerExtension.ts +21 -0
  222. package/src/migrations/sql/20230710174340-events.ts +21 -0
  223. package/src/migrations/sql/20230712061220-roles-permissions-extension.ts +50 -0
  224. package/src/migrations/sql/20230713184927-variables-modulescoped.ts +32 -0
  225. package/src/migrations/sql/20230714045136-domain-index.ts +40 -0
  226. package/src/migrations/sql/20230714045727-events-index.ts +19 -0
  227. package/src/migrations/sql/20230715102519-module-permissions-extra-fields.ts +38 -0
  228. package/src/migrations/sql/20230724062109-roles-constraints.ts +16 -0
  229. package/src/migrations/sql/20230811095701-userId-on-events.ts +14 -0
  230. package/src/migrations/sql/20230921123717-count-for-permissions.ts +101 -0
  231. package/src/migrations/sql/20231111102812-details-system-permissions.ts +192 -0
  232. package/src/migrations/sql/20231114151343-system-roles.ts +46 -0
  233. package/src/migrations/sql/20231118082301-add-new-permissions.ts +200 -0
  234. package/src/migrations/sql/20231119115037-timedRoles.ts +23 -0
  235. package/src/migrations/sql/20231123150854-economy-base.ts +15 -0
  236. package/src/migrations/sql/20231123171611-economy-settings.ts +15 -0
  237. package/src/migrations/sql/20231124140441-json-module-assignments.ts +29 -0
  238. package/src/migrations/sql/20231208114507-settings-refactor.ts +114 -0
  239. package/src/migrations/sql/20231208171234-game-items.ts +20 -0
  240. package/src/migrations/sql/20231216100720-player-inventory.ts +16 -0
  241. package/src/migrations/sql/20231222180438-steam-data.ts +27 -0
  242. package/src/migrations/sql/20231223132631-pog-online.ts +13 -0
  243. package/src/migrations/sql/20231223212031-unique-index-item-def.ts +27 -0
  244. package/src/migrations/sql/20231224135126-gameserver-online-status.ts +13 -0
  245. package/src/migrations/sql/20231224155226-unique-pog.ts +27 -0
  246. package/src/migrations/sql/20231225140650-extra-ip-info.ts +27 -0
  247. package/src/migrations/sql/20231227144315-unique-constraints-player.ts +74 -0
  248. package/src/migrations/sql/20231229144707-more-player-constraints.ts +20 -0
  249. package/src/migrations/sql/20240101162751-add-settings-constraint.ts +39 -0
  250. package/src/migrations/sql/20240105130846-remove-some-module-perms.ts +104 -0
  251. package/src/migrations/sql/20240116141936-add-ui-schema-to-module.ts +13 -0
  252. package/src/migrations/sql/20240119152426-remove-hook-check.ts +18 -0
  253. package/src/migrations/sql/20240121142329-move-ip-history.ts +53 -0
  254. package/src/migrations/sql/20240202101208-rename-economy-to-economyUtils.ts +15 -0
  255. package/src/migrations/sql/20240216120143-domain-state.ts +13 -0
  256. package/src/migrations/sql/20240229141340-looser-fks-events.ts +20 -0
  257. package/src/migrations/sql/20240301063505-module-functions.ts +17 -0
  258. package/src/migrations/util/alterEnum.ts +10 -0
  259. package/src/queryBuilder.ts +133 -0
  260. package/src/redis.ts +58 -0
  261. package/tsconfig.build.json +9 -0
  262. package/tsconfig.json +8 -0
  263. 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
+ }