@takaro/db 0.0.30 → 0.1.0

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 (47) hide show
  1. package/dist/encryption.d.ts.map +1 -1
  2. package/dist/encryption.js +0 -1
  3. package/dist/encryption.js.map +1 -1
  4. package/dist/main.d.ts +1 -1
  5. package/dist/main.d.ts.map +1 -1
  6. package/dist/main.js.map +1 -1
  7. package/dist/migrations/sql/20250112102308-generic-gameserver.d.ts +4 -0
  8. package/dist/migrations/sql/20250112102308-generic-gameserver.d.ts.map +1 -0
  9. package/dist/migrations/sql/20250112102308-generic-gameserver.js +47 -0
  10. package/dist/migrations/sql/20250112102308-generic-gameserver.js.map +1 -0
  11. package/dist/migrations/sql/20250606060546-inventory-tracking.d.ts +4 -0
  12. package/dist/migrations/sql/20250606060546-inventory-tracking.d.ts.map +1 -0
  13. package/dist/migrations/sql/20250606060546-inventory-tracking.js +82 -0
  14. package/dist/migrations/sql/20250606060546-inventory-tracking.js.map +1 -0
  15. package/dist/migrations/sql/20250613110835-add-platform-id-to-players.d.ts +4 -0
  16. package/dist/migrations/sql/20250613110835-add-platform-id-to-players.d.ts.map +1 -0
  17. package/dist/migrations/sql/20250613110835-add-platform-id-to-players.js +43 -0
  18. package/dist/migrations/sql/20250613110835-add-platform-id-to-players.js.map +1 -0
  19. package/dist/migrations/sql/20250613203142-add-dimension-to-position.d.ts +4 -0
  20. package/dist/migrations/sql/20250613203142-add-dimension-to-position.d.ts.map +1 -0
  21. package/dist/migrations/sql/20250613203142-add-dimension-to-position.js +21 -0
  22. package/dist/migrations/sql/20250613203142-add-dimension-to-position.js.map +1 -0
  23. package/dist/migrations/sql/20250614113157-entities.d.ts +4 -0
  24. package/dist/migrations/sql/20250614113157-entities.d.ts.map +1 -0
  25. package/dist/migrations/sql/20250614113157-entities.js +36 -0
  26. package/dist/migrations/sql/20250614113157-entities.js.map +1 -0
  27. package/dist/migrations/util/alterEnum.d.ts.map +1 -1
  28. package/dist/migrations/util/alterEnum.js +0 -1
  29. package/dist/migrations/util/alterEnum.js.map +1 -1
  30. package/dist/queryBuilder.d.ts.map +1 -1
  31. package/dist/queryBuilder.js +1 -3
  32. package/dist/queryBuilder.js.map +1 -1
  33. package/dist/redis.d.ts +1 -1
  34. package/dist/redis.d.ts.map +1 -1
  35. package/dist/redis.js +6 -5
  36. package/dist/redis.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/encryption.ts +0 -1
  39. package/src/main.ts +1 -1
  40. package/src/migrations/sql/20250112102308-generic-gameserver.ts +55 -0
  41. package/src/migrations/sql/20250606060546-inventory-tracking.ts +96 -0
  42. package/src/migrations/sql/20250613110835-add-platform-id-to-players.ts +51 -0
  43. package/src/migrations/sql/20250613203142-add-dimension-to-position.ts +25 -0
  44. package/src/migrations/sql/20250614113157-entities.ts +40 -0
  45. package/src/migrations/util/alterEnum.ts +0 -1
  46. package/src/queryBuilder.ts +0 -1
  47. package/src/redis.ts +7 -6
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5D;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5D;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKzD;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjF"}
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5D;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5D;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzD;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjF"}
@@ -12,7 +12,6 @@ export async function decrypt(value) {
12
12
  }
13
13
  export async function hash(value) {
14
14
  const knex = await getKnex();
15
- // eslint-disable-next-line quotes
16
15
  const res = await knex.raw("SELECT crypt(?, gen_salt('bf')) as value", [value]);
17
16
  return res.rows[0].value;
18
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAAa;IACtC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,kCAAkC;IAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,0CAA0C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY;IAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzG,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAAa;IACtC,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,0CAA0C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY;IAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5B,CAAC"}
package/dist/main.d.ts CHANGED
@@ -4,6 +4,6 @@ export { getKnex, disconnectKnex } from './knex.js';
4
4
  export { migrate, migrateUndo } from './migrations/index.js';
5
5
  export * from './encryption.js';
6
6
  export { configSchema, IDbConfig } from './config.js';
7
- export { Redis } from './redis.js';
7
+ export { Redis, RedisClient } from './redis.js';
8
8
  export * from './errorTypeGuards.js';
9
9
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE7D,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE7D,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhD,cAAc,sBAAsB,CAAC"}
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE7D,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE7D,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,KAAK,EAAe,MAAM,YAAY,CAAC;AAEhD,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
4
+ //# sourceMappingURL=20250112102308-generic-gameserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250112102308-generic-gameserver.d.ts","sourceRoot":"","sources":["../../../src/migrations/sql/20250112102308-generic-gameserver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAoClD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAapD"}
@@ -0,0 +1,47 @@
1
+ import { formatAlterTableEnumSql } from '../util/alterEnum.js';
2
+ export async function up(knex) {
3
+ await knex.raw(`
4
+ CREATE OR REPLACE FUNCTION generate_registration_token()
5
+ RETURNS text
6
+ LANGUAGE sql
7
+ AS $$
8
+ SELECT encode(
9
+ decode(
10
+ replace(
11
+ array_to_string(
12
+ ARRAY[
13
+ gen_random_uuid()::text,
14
+ gen_random_uuid()::text
15
+ ],
16
+ ''
17
+ ),
18
+ '-',
19
+ ''
20
+ ),
21
+ 'hex'
22
+ ),
23
+ 'base64'
24
+ );
25
+ $$;
26
+ `);
27
+ // Then run the migrations
28
+ await knex.raw(formatAlterTableEnumSql('gameservers', 'type', ['MOCK', 'RUST', 'SEVENDAYSTODIE', 'GENERIC']));
29
+ await knex.schema.alterTable('domains', (table) => {
30
+ table.string('serverRegistrationToken', 128).notNullable().defaultTo(knex.raw('generate_registration_token()'));
31
+ });
32
+ await knex.schema.alterTable('gameservers', (table) => {
33
+ table.string('identityToken').nullable();
34
+ });
35
+ }
36
+ export async function down(knex) {
37
+ await knex.raw(formatAlterTableEnumSql('gameservers', 'type', ['MOCK', 'RUST', 'SEVENDAYSTODIE']));
38
+ await knex.schema.alterTable('domains', (table) => {
39
+ table.dropColumn('serverRegistrationToken');
40
+ });
41
+ await knex.schema.alterTable('gameservers', (table) => {
42
+ table.dropColumn('identityToken');
43
+ });
44
+ // Drop the function
45
+ await knex.raw('DROP FUNCTION IF EXISTS generate_registration_token();');
46
+ }
47
+ //# sourceMappingURL=20250112102308-generic-gameserver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250112102308-generic-gameserver.js","sourceRoot":"","sources":["../../../src/migrations/sql/20250112102308-generic-gameserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,MAAM,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;GAuBd,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAE9G,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,KAAK,CAAC,MAAM,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAClH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QACpD,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAEnG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;QACpD,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,IAAI,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
4
+ //# sourceMappingURL=20250606060546-inventory-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250606060546-inventory-tracking.d.ts","sourceRoot":"","sources":["../../../src/migrations/sql/20250606060546-inventory-tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ElD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpD"}
@@ -0,0 +1,82 @@
1
+ export async function up(knex) {
2
+ await knex.raw(`
3
+ CREATE TABLE "playerInventoryHistory" (
4
+ id UUID DEFAULT gen_random_uuid() NOT NULL,
5
+ "createdAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
6
+ "updatedAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
7
+ domain VARCHAR(255) NOT NULL,
8
+ "playerId" UUID NOT NULL,
9
+ "itemId" UUID NOT NULL,
10
+ quantity INTEGER NOT NULL,
11
+ CONSTRAINT "playerInventoryHistory_pkey" PRIMARY KEY ("createdAt", "playerId", "itemId"),
12
+ CONSTRAINT "playerInventoryHistory_domain_foreign" FOREIGN KEY (domain) REFERENCES domains(id) ON DELETE CASCADE,
13
+ CONSTRAINT "playerInventoryHistory_playerId_foreign" FOREIGN KEY ("playerId") REFERENCES "playerOnGameServer"(id) ON DELETE CASCADE,
14
+ CONSTRAINT "playerInventoryHistory_itemId_foreign" FOREIGN KEY ("itemId") REFERENCES items(id) ON DELETE CASCADE,
15
+ CONSTRAINT "playerInventoryHistory_quantity_check" CHECK (quantity >= 0)
16
+ ) PARTITION BY RANGE ("createdAt")
17
+ `);
18
+ await knex.raw(`
19
+ CREATE OR REPLACE FUNCTION ensure_player_inventory_history_partition(date_param VARCHAR DEFAULT NULL)
20
+ RETURNS VOID AS $$
21
+ DECLARE
22
+ current_day_start DATE;
23
+ next_day_start DATE;
24
+ partition_name TEXT;
25
+ partition_exists BOOLEAN;
26
+ target_date DATE;
27
+ BEGIN
28
+ IF date_param IS NOT NULL THEN
29
+ target_date := DATE(date_param::TIMESTAMP);
30
+ ELSE
31
+ target_date := CURRENT_DATE;
32
+ END IF;
33
+
34
+ current_day_start := DATE_TRUNC('day', target_date);
35
+ next_day_start := current_day_start + INTERVAL '1 day';
36
+
37
+ partition_name := 'playerInventoryHistory_' || TO_CHAR(current_day_start, 'YYYY_MM_DD');
38
+
39
+ SELECT EXISTS (
40
+ SELECT 1 FROM pg_class c
41
+ JOIN pg_namespace n ON n.oid = c.relnamespace
42
+ WHERE c.relname = partition_name
43
+ AND n.nspname = 'public'
44
+ ) INTO partition_exists;
45
+
46
+ IF NOT partition_exists THEN
47
+ EXECUTE format(
48
+ 'CREATE TABLE %I PARTITION OF "playerInventoryHistory"
49
+ FOR VALUES FROM (%L) TO (%L)',
50
+ partition_name,
51
+ current_day_start,
52
+ next_day_start
53
+ );
54
+
55
+ RAISE NOTICE 'Created partition: % for date: %',
56
+ partition_name, current_day_start;
57
+ END IF;
58
+ END;
59
+ $$ LANGUAGE plpgsql;
60
+ `);
61
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_domain_createdAt_idx" ON "playerInventoryHistory" (domain, "createdAt")`);
62
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_playerId_idx" ON "playerInventoryHistory" ("playerId")`);
63
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_itemId_idx" ON "playerInventoryHistory" ("itemId")`);
64
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_playerId_createdAt_idx" ON "playerInventoryHistory" ("playerId", "createdAt" DESC)`);
65
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_itemId_createdAt_idx" ON "playerInventoryHistory" ("itemId", "createdAt" DESC)`);
66
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_domain_itemId_createdAt_idx" ON "playerInventoryHistory" (domain, "itemId", "createdAt" DESC)`);
67
+ // Delete the old playerInventory table
68
+ await knex.raw('DROP TABLE IF EXISTS "playerInventory" CASCADE');
69
+ }
70
+ export async function down(knex) {
71
+ await knex.schema.createTable('playerInventory', (table) => {
72
+ table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
73
+ table.timestamps(true, true, true);
74
+ table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
75
+ table.uuid('playerId').references('playerOnGameServer.id').onDelete('CASCADE').notNullable();
76
+ table.uuid('itemId').references('items.id').onDelete('CASCADE').notNullable();
77
+ table.integer('quantity').notNullable();
78
+ });
79
+ await knex.raw('DROP FUNCTION IF EXISTS ensure_player_inventory_history_partition(VARCHAR)');
80
+ await knex.raw('DROP TABLE IF EXISTS "playerInventoryHistory" CASCADE');
81
+ }
82
+ //# sourceMappingURL=20250606060546-inventory-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250606060546-inventory-tracking.js","sourceRoot":"","sources":["../../../src/migrations/sql/20250606060546-inventory-tracking.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,MAAM,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;GAed,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0Cd,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,CACZ,8GAA8G,CAC/G,CAAC;IACF,MAAM,IAAI,CAAC,GAAG,CAAC,6FAA6F,CAAC,CAAC;IAC9G,MAAM,IAAI,CAAC,GAAG,CAAC,yFAAyF,CAAC,CAAC;IAC1G,MAAM,IAAI,CAAC,GAAG,CACZ,yHAAyH,CAC1H,CAAC;IACF,MAAM,IAAI,CAAC,GAAG,CACZ,qHAAqH,CACtH,CAAC;IACF,MAAM,IAAI,CAAC,GAAG,CACZ,oIAAoI,CACrI,CAAC;IAEF,uCAAuC;IACvC,MAAM,IAAI,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE;QACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7F,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9E,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC7F,MAAM,IAAI,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
4
+ //# sourceMappingURL=20250613110835-add-platform-id-to-players.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250613110835-add-platform-id-to-players.d.ts","sourceRoot":"","sources":["../../../src/migrations/sql/20250613110835-add-platform-id-to-players.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpD"}
@@ -0,0 +1,43 @@
1
+ export async function up(knex) {
2
+ // Add platformId column to players table
3
+ await knex.schema.alterTable('players', (table) => {
4
+ table.string('platformId').nullable();
5
+ });
6
+ // Add unique constraint for domain + platformId
7
+ await knex.schema.alterTable('players', (table) => {
8
+ table.unique(['domain', 'platformId']);
9
+ });
10
+ // Drop the existing unique constraint
11
+ await knex.raw(`
12
+ ALTER TABLE players
13
+ DROP CONSTRAINT players_domain_steam_xbox_eos_unique;
14
+ `);
15
+ // Add new unique constraint that includes platformId
16
+ await knex.raw(`
17
+ ALTER TABLE players
18
+ ADD CONSTRAINT players_domain_steam_xbox_eos_platform_unique
19
+ UNIQUE NULLS NOT DISTINCT (domain, "steamId", "xboxLiveId", "epicOnlineServicesId", "platformId");
20
+ `);
21
+ }
22
+ export async function down(knex) {
23
+ // Drop the new unique constraint
24
+ await knex.raw(`
25
+ ALTER TABLE players
26
+ DROP CONSTRAINT players_domain_steam_xbox_eos_platform_unique;
27
+ `);
28
+ // Drop the individual platformId unique constraint
29
+ await knex.schema.alterTable('players', (table) => {
30
+ table.dropUnique(['domain', 'platformId']);
31
+ });
32
+ // Remove platformId column
33
+ await knex.schema.alterTable('players', (table) => {
34
+ table.dropColumn('platformId');
35
+ });
36
+ // Re-add the original unique constraint
37
+ await knex.raw(`
38
+ ALTER TABLE players
39
+ ADD CONSTRAINT players_domain_steam_xbox_eos_unique
40
+ UNIQUE NULLS NOT DISTINCT (domain, "steamId", "xboxLiveId", "epicOnlineServicesId");
41
+ `);
42
+ }
43
+ //# sourceMappingURL=20250613110835-add-platform-id-to-players.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250613110835-add-platform-id-to-players.js","sourceRoot":"","sources":["../../../src/migrations/sql/20250613110835-add-platform-id-to-players.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,yCAAyC;IACzC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,gDAAgD;IAChD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,IAAI,CAAC,GAAG,CAAC;;;GAGd,CAAC,CAAC;IAEH,qDAAqD;IACrD,MAAM,IAAI,CAAC,GAAG,CAAC;;;;GAId,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,iCAAiC;IACjC,MAAM,IAAI,CAAC,GAAG,CAAC;;;GAGd,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,IAAI,CAAC,GAAG,CAAC;;;;GAId,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
4
+ //# sourceMappingURL=20250613203142-add-dimension-to-position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250613203142-add-dimension-to-position.d.ts","sourceRoot":"","sources":["../../../src/migrations/sql/20250613203142-add-dimension-to-position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpD"}
@@ -0,0 +1,21 @@
1
+ export async function up(knex) {
2
+ // Add dimension column to playerOnGameServer table
3
+ await knex.schema.alterTable('playerOnGameServer', (table) => {
4
+ table.string('dimension').nullable();
5
+ });
6
+ // Add dimension column to playerLocation table
7
+ await knex.schema.alterTable('playerLocation', (table) => {
8
+ table.string('dimension').nullable();
9
+ });
10
+ }
11
+ export async function down(knex) {
12
+ // Remove dimension column from playerOnGameServer table
13
+ await knex.schema.alterTable('playerOnGameServer', (table) => {
14
+ table.dropColumn('dimension');
15
+ });
16
+ // Remove dimension column from playerLocation table
17
+ await knex.schema.alterTable('playerLocation', (table) => {
18
+ table.dropColumn('dimension');
19
+ });
20
+ }
21
+ //# sourceMappingURL=20250613203142-add-dimension-to-position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250613203142-add-dimension-to-position.js","sourceRoot":"","sources":["../../../src/migrations/sql/20250613203142-add-dimension-to-position.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,mDAAmD;IACnD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3D,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;QACvD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,wDAAwD;IACxD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3D,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;QACvD,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Knex } from 'knex';
2
+ export declare function up(knex: Knex): Promise<void>;
3
+ export declare function down(knex: Knex): Promise<void>;
4
+ //# sourceMappingURL=20250614113157-entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250614113157-entities.d.ts","sourceRoot":"","sources":["../../../src/migrations/sql/20250614113157-entities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpD"}
@@ -0,0 +1,36 @@
1
+ export async function up(knex) {
2
+ await knex.schema.createTable('entities', (table) => {
3
+ table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
4
+ table.timestamps(true, true, true);
5
+ table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
6
+ table.uuid('gameserverId').references('gameservers.id').onDelete('CASCADE').notNullable();
7
+ table.string('name').notNullable();
8
+ table.string('code').notNullable();
9
+ table.text('description').nullable();
10
+ table.enum('type', ['hostile', 'friendly', 'neutral']).nullable();
11
+ table.jsonb('metadata').nullable();
12
+ // Add index on code since we'll use that in queries a lot
13
+ table.index('code');
14
+ // Add unique constraint to prevent duplicates
15
+ table.unique(['code', 'gameserverId', 'domain']);
16
+ });
17
+ // Insert entity permissions
18
+ await knex('permission').insert([
19
+ {
20
+ permission: 'READ_ENTITIES',
21
+ description: 'Can view entity details',
22
+ friendlyName: 'Read Entities',
23
+ },
24
+ {
25
+ permission: 'MANAGE_ENTITIES',
26
+ description: 'Can create, update, and delete entities',
27
+ friendlyName: 'Manage Entities',
28
+ },
29
+ ]);
30
+ }
31
+ export async function down(knex) {
32
+ // Remove entity permissions
33
+ await knex('permission').whereIn('permission', ['READ_ENTITIES', 'MANAGE_ENTITIES']).del();
34
+ await knex.schema.dropTable('entities');
35
+ }
36
+ //# sourceMappingURL=20250614113157-entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20250614113157-entities.js","sourceRoot":"","sources":["../../../src/migrations/sql/20250614113157-entities.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1F,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,0DAA0D;QAC1D,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,8CAA8C;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;QAC9B;YACE,UAAU,EAAE,eAAe;YAC3B,WAAW,EAAE,yBAAyB;YACtC,YAAY,EAAE,eAAe;SAC9B;QACD;YACE,UAAU,EAAE,iBAAiB;YAC7B,WAAW,EAAE,yCAAyC;YACtD,YAAY,EAAE,iBAAiB;SAChC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,4BAA4B;IAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAE3F,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AAC1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"alterEnum.d.ts","sourceRoot":"","sources":["../../../src/migrations/util/alterEnum.ts"],"names":[],"mappings":"AACA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAQ7F"}
1
+ {"version":3,"file":"alterEnum.d.ts","sourceRoot":"","sources":["../../../src/migrations/util/alterEnum.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAQ7F"}
@@ -1,4 +1,3 @@
1
- /* eslint-disable quotes */
2
1
  export function formatAlterTableEnumSql(tableName, columnName, enums) {
3
2
  const constraintName = `${tableName}_${columnName}_check`;
4
3
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"alterEnum.js","sourceRoot":"","sources":["../../../src/migrations/util/alterEnum.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,UAAkB,EAAE,KAAe;IAC5F,MAAM,cAAc,GAAG,GAAG,SAAS,IAAI,UAAU,QAAQ,CAAC;IAC1D,OAAO;QACL,gBAAgB,SAAS,gCAAgC,cAAc,IAAI;QAC3E,gBAAgB,SAAS,qBAAqB,cAAc,aAAa,UAAU,mBAAmB,KAAK,CAAC,IAAI,CAC9G,YAAY,CACb,aAAa;KACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"alterEnum.js","sourceRoot":"","sources":["../../../src/migrations/util/alterEnum.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,UAAkB,EAAE,KAAe;IAC5F,MAAM,cAAc,GAAG,GAAG,SAAS,IAAI,UAAU,QAAQ,CAAC;IAC1D,OAAO;QACL,gBAAgB,SAAS,gCAAgC,cAAc,IAAI;QAC3E,gBAAgB,SAAS,qBAAqB,cAAc,aAAa,UAAU,mBAAmB,KAAK,CAAC,IAAI,CAC9G,YAAY,CACb,aAAa;KACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilder.d.ts","sourceRoot":"","sources":["../src/queryBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,IAAI,qBAAqB,EACrC,KAAK,IAAI,cAAc,EACvB,IAAI,EAIL,MAAM,WAAW,CAAC;AAGnB,qBAAa,YAAY,CAAC,CAAC;IAEzB,OAAO,CAAC,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;KAClE,CAAC;IAGF,MAAM,CAAC,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;KAClE,CAAC;IAGF,WAAW,CAAC,EAAE;SACX,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;KAC3B,CAAC;IAGF,QAAQ,CAAC,EAAE;SACR,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;KAC3B,CAAC;IAIF,IAAI,CAAC,EAAE,MAAM,CAAC;IAId,KAAK,CAAC,EAAE,MAAM,CAAC;IAIf,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,aAAa,CAAC,EAAE,aAAa,CAAC;IAI9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,oBAAY,aAAa;IACvB,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAID,wBAAsB,oBAAoB,kBAezC;AAID,qBAAa,YAAY,CAAC,KAAK,SAAS,cAAc,EAAE,SAAS;IAC/D,OAAO,CAAC,KAAK,CAA0B;gBAC3B,QAAQ,GAAE,YAAY,CAAC,SAAS,CAAsB;IAIlE;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0BxB,KAAK,CAAC,YAAY,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAqCrG,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,UAAU;CAMnB"}
1
+ {"version":3,"file":"queryBuilder.d.ts","sourceRoot":"","sources":["../src/queryBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,IAAI,qBAAqB,EACrC,KAAK,IAAI,cAAc,EACvB,IAAI,EAIL,MAAM,WAAW,CAAC;AAGnB,qBAAa,YAAY,CAAC,CAAC;IAEzB,OAAO,CAAC,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;KAClE,CAAC;IAGF,MAAM,CAAC,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;KAClE,CAAC;IAGF,WAAW,CAAC,EAAE;SACX,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;KAC3B,CAAC;IAGF,QAAQ,CAAC,EAAE;SACR,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;KAC3B,CAAC;IAIF,IAAI,CAAC,EAAE,MAAM,CAAC;IAId,KAAK,CAAC,EAAE,MAAM,CAAC;IAIf,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,aAAa,CAAC,EAAE,aAAa,CAAC;IAI9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,oBAAY,aAAa;IACvB,GAAG,QAAQ;IACX,IAAI,SAAS;CACd;AAID,wBAAsB,oBAAoB,kBAczC;AAID,qBAAa,YAAY,CAAC,KAAK,SAAS,cAAc,EAAE,SAAS;IAC/D,OAAO,CAAC,KAAK,CAA0B;gBAC3B,QAAQ,GAAE,YAAY,CAAC,SAAS,CAAsB;IAIlE;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0BxB,KAAK,CAAC,YAAY,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAqCrG,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,UAAU;CAMnB"}
@@ -63,9 +63,7 @@ export async function populateModelColumns() {
63
63
  if (await isDbAvailable()) {
64
64
  const knex = await getKnex();
65
65
  // Find all tables
66
- const tables = await knex.raw(
67
- // eslint-disable-next-line
68
- "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE'");
66
+ const tables = await knex.raw("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE'");
69
67
  // For each table, store the columns
70
68
  for (const table of tables.rows) {
71
69
  const tableName = table.table_name;
@@ -1 +1 @@
1
- {"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../src/queryBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../src/queryBuilder.ts"],"names":[],"mappings":"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"}
package/dist/redis.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createClient, RedisClientOptions } from 'redis';
2
- type RedisClient = ReturnType<typeof createClient>;
2
+ export type RedisClient = ReturnType<typeof createClient>;
3
3
  declare class RedisClass {
4
4
  private log;
5
5
  private clients;
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAIzD,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAEnD,cAAM,UAAU;IACd,OAAO,CAAC,GAAG,CAAmB;IAE9B,OAAO,CAAC,OAAO,CAAkC;IAEjD;;;;;;OAMG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4BnF;;OAEG;IACG,OAAO;CAMd;AAED,eAAO,MAAM,KAAK,YAAmB,CAAC"}
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAIzD,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAE1D,cAAM,UAAU;IACd,OAAO,CAAC,GAAG,CAAmB;IAE9B,OAAO,CAAC,OAAO,CAAkC;IAEjD;;;;;;OAMG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IA6BnF;;OAEG;IACG,OAAO;CAMd;AAED,eAAO,MAAM,KAAK,YAAmB,CAAC"}
package/dist/redis.js CHANGED
@@ -14,12 +14,13 @@ class RedisClass {
14
14
  * @returns
15
15
  */
16
16
  async getClient(name, extra = {}) {
17
- const cachedClient = this.clients.get(name);
17
+ const normalizedName = name.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
18
+ const cachedClient = this.clients.get(normalizedName);
18
19
  if (cachedClient)
19
20
  return cachedClient;
20
- this.log.debug(`Creating new Redis client for ${name}`);
21
+ this.log.debug(`Creating new Redis client for ${normalizedName}`);
21
22
  const client = createClient({
22
- name,
23
+ name: normalizedName,
23
24
  username: config.get('redis.username'),
24
25
  password: config.get('redis.password'),
25
26
  socket: {
@@ -29,8 +30,8 @@ class RedisClass {
29
30
  ...extra,
30
31
  });
31
32
  await client.connect();
32
- this.clients.set(name, client);
33
- health.registerHook(name, async () => {
33
+ this.clients.set(normalizedName, client);
34
+ health.registerHook(normalizedName, async () => {
34
35
  await client.ping();
35
36
  });
36
37
  return client;
package/dist/redis.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,UAAU;IAAhB;QACU,QAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtB,YAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IA8CnD,CAAC;IA5CC;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,QAA4B,EAAE;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,YAAY;YAAE,OAAO,YAAY,CAAC;QAEtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,IAAI;YACJ,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACtC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACtC,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC9B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;aAC/B;YACD,GAAG,KAAK;SACT,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE/B,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACnC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,UAAU;IAAhB;QACU,QAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtB,YAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IA+CnD,CAAC;IA7CC;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,QAA4B,EAAE;QAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEtD,IAAI,YAAY;YAAE,OAAO,YAAY,CAAC;QAEtC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,cAAc,EAAE,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACtC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACtC,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC9B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;aAC/B;YACD,GAAG,KAAK;SACT,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takaro/db",
3
- "version": "0.0.30",
3
+ "version": "0.1.0",
4
4
  "description": "An opinionated data layer",
5
5
  "main": "dist/main.js",
6
6
  "types": "dist/main.d.ts",
package/src/encryption.ts CHANGED
@@ -15,7 +15,6 @@ export async function decrypt(value: string): Promise<string> {
15
15
 
16
16
  export async function hash(value: string): Promise<string> {
17
17
  const knex = await getKnex();
18
- // eslint-disable-next-line quotes
19
18
  const res = await knex.raw("SELECT crypt(?, gen_salt('bf')) as value", [value]);
20
19
  return res.rows[0].value;
21
20
  }
package/src/main.ts CHANGED
@@ -10,6 +10,6 @@ export * from './encryption.js';
10
10
 
11
11
  export { configSchema, IDbConfig } from './config.js';
12
12
 
13
- export { Redis } from './redis.js';
13
+ export { Redis, RedisClient } from './redis.js';
14
14
 
15
15
  export * from './errorTypeGuards.js';
@@ -0,0 +1,55 @@
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(`
6
+ CREATE OR REPLACE FUNCTION generate_registration_token()
7
+ RETURNS text
8
+ LANGUAGE sql
9
+ AS $$
10
+ SELECT encode(
11
+ decode(
12
+ replace(
13
+ array_to_string(
14
+ ARRAY[
15
+ gen_random_uuid()::text,
16
+ gen_random_uuid()::text
17
+ ],
18
+ ''
19
+ ),
20
+ '-',
21
+ ''
22
+ ),
23
+ 'hex'
24
+ ),
25
+ 'base64'
26
+ );
27
+ $$;
28
+ `);
29
+
30
+ // Then run the migrations
31
+ await knex.raw(formatAlterTableEnumSql('gameservers', 'type', ['MOCK', 'RUST', 'SEVENDAYSTODIE', 'GENERIC']));
32
+
33
+ await knex.schema.alterTable('domains', (table) => {
34
+ table.string('serverRegistrationToken', 128).notNullable().defaultTo(knex.raw('generate_registration_token()'));
35
+ });
36
+
37
+ await knex.schema.alterTable('gameservers', (table) => {
38
+ table.string('identityToken').nullable();
39
+ });
40
+ }
41
+
42
+ export async function down(knex: Knex): Promise<void> {
43
+ await knex.raw(formatAlterTableEnumSql('gameservers', 'type', ['MOCK', 'RUST', 'SEVENDAYSTODIE']));
44
+
45
+ await knex.schema.alterTable('domains', (table) => {
46
+ table.dropColumn('serverRegistrationToken');
47
+ });
48
+
49
+ await knex.schema.alterTable('gameservers', (table) => {
50
+ table.dropColumn('identityToken');
51
+ });
52
+
53
+ // Drop the function
54
+ await knex.raw('DROP FUNCTION IF EXISTS generate_registration_token();');
55
+ }
@@ -0,0 +1,96 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.raw(`
5
+ CREATE TABLE "playerInventoryHistory" (
6
+ id UUID DEFAULT gen_random_uuid() NOT NULL,
7
+ "createdAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
8
+ "updatedAt" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
9
+ domain VARCHAR(255) NOT NULL,
10
+ "playerId" UUID NOT NULL,
11
+ "itemId" UUID NOT NULL,
12
+ quantity INTEGER NOT NULL,
13
+ CONSTRAINT "playerInventoryHistory_pkey" PRIMARY KEY ("createdAt", "playerId", "itemId"),
14
+ CONSTRAINT "playerInventoryHistory_domain_foreign" FOREIGN KEY (domain) REFERENCES domains(id) ON DELETE CASCADE,
15
+ CONSTRAINT "playerInventoryHistory_playerId_foreign" FOREIGN KEY ("playerId") REFERENCES "playerOnGameServer"(id) ON DELETE CASCADE,
16
+ CONSTRAINT "playerInventoryHistory_itemId_foreign" FOREIGN KEY ("itemId") REFERENCES items(id) ON DELETE CASCADE,
17
+ CONSTRAINT "playerInventoryHistory_quantity_check" CHECK (quantity >= 0)
18
+ ) PARTITION BY RANGE ("createdAt")
19
+ `);
20
+
21
+ await knex.raw(`
22
+ CREATE OR REPLACE FUNCTION ensure_player_inventory_history_partition(date_param VARCHAR DEFAULT NULL)
23
+ RETURNS VOID AS $$
24
+ DECLARE
25
+ current_day_start DATE;
26
+ next_day_start DATE;
27
+ partition_name TEXT;
28
+ partition_exists BOOLEAN;
29
+ target_date DATE;
30
+ BEGIN
31
+ IF date_param IS NOT NULL THEN
32
+ target_date := DATE(date_param::TIMESTAMP);
33
+ ELSE
34
+ target_date := CURRENT_DATE;
35
+ END IF;
36
+
37
+ current_day_start := DATE_TRUNC('day', target_date);
38
+ next_day_start := current_day_start + INTERVAL '1 day';
39
+
40
+ partition_name := 'playerInventoryHistory_' || TO_CHAR(current_day_start, 'YYYY_MM_DD');
41
+
42
+ SELECT EXISTS (
43
+ SELECT 1 FROM pg_class c
44
+ JOIN pg_namespace n ON n.oid = c.relnamespace
45
+ WHERE c.relname = partition_name
46
+ AND n.nspname = 'public'
47
+ ) INTO partition_exists;
48
+
49
+ IF NOT partition_exists THEN
50
+ EXECUTE format(
51
+ 'CREATE TABLE %I PARTITION OF "playerInventoryHistory"
52
+ FOR VALUES FROM (%L) TO (%L)',
53
+ partition_name,
54
+ current_day_start,
55
+ next_day_start
56
+ );
57
+
58
+ RAISE NOTICE 'Created partition: % for date: %',
59
+ partition_name, current_day_start;
60
+ END IF;
61
+ END;
62
+ $$ LANGUAGE plpgsql;
63
+ `);
64
+
65
+ await knex.raw(
66
+ `CREATE INDEX "playerInventoryHistory_domain_createdAt_idx" ON "playerInventoryHistory" (domain, "createdAt")`,
67
+ );
68
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_playerId_idx" ON "playerInventoryHistory" ("playerId")`);
69
+ await knex.raw(`CREATE INDEX "playerInventoryHistory_itemId_idx" ON "playerInventoryHistory" ("itemId")`);
70
+ await knex.raw(
71
+ `CREATE INDEX "playerInventoryHistory_playerId_createdAt_idx" ON "playerInventoryHistory" ("playerId", "createdAt" DESC)`,
72
+ );
73
+ await knex.raw(
74
+ `CREATE INDEX "playerInventoryHistory_itemId_createdAt_idx" ON "playerInventoryHistory" ("itemId", "createdAt" DESC)`,
75
+ );
76
+ await knex.raw(
77
+ `CREATE INDEX "playerInventoryHistory_domain_itemId_createdAt_idx" ON "playerInventoryHistory" (domain, "itemId", "createdAt" DESC)`,
78
+ );
79
+
80
+ // Delete the old playerInventory table
81
+ await knex.raw('DROP TABLE IF EXISTS "playerInventory" CASCADE');
82
+ }
83
+
84
+ export async function down(knex: Knex): Promise<void> {
85
+ await knex.schema.createTable('playerInventory', (table) => {
86
+ table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid ()'));
87
+ table.timestamps(true, true, true);
88
+ table.string('domain').references('domains.id').onDelete('CASCADE').notNullable();
89
+ table.uuid('playerId').references('playerOnGameServer.id').onDelete('CASCADE').notNullable();
90
+ table.uuid('itemId').references('items.id').onDelete('CASCADE').notNullable();
91
+ table.integer('quantity').notNullable();
92
+ });
93
+
94
+ await knex.raw('DROP FUNCTION IF EXISTS ensure_player_inventory_history_partition(VARCHAR)');
95
+ await knex.raw('DROP TABLE IF EXISTS "playerInventoryHistory" CASCADE');
96
+ }
@@ -0,0 +1,51 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ // Add platformId column to players table
5
+ await knex.schema.alterTable('players', (table) => {
6
+ table.string('platformId').nullable();
7
+ });
8
+
9
+ // Add unique constraint for domain + platformId
10
+ await knex.schema.alterTable('players', (table) => {
11
+ table.unique(['domain', 'platformId']);
12
+ });
13
+
14
+ // Drop the existing unique constraint
15
+ await knex.raw(`
16
+ ALTER TABLE players
17
+ DROP CONSTRAINT players_domain_steam_xbox_eos_unique;
18
+ `);
19
+
20
+ // Add new unique constraint that includes platformId
21
+ await knex.raw(`
22
+ ALTER TABLE players
23
+ ADD CONSTRAINT players_domain_steam_xbox_eos_platform_unique
24
+ UNIQUE NULLS NOT DISTINCT (domain, "steamId", "xboxLiveId", "epicOnlineServicesId", "platformId");
25
+ `);
26
+ }
27
+
28
+ export async function down(knex: Knex): Promise<void> {
29
+ // Drop the new unique constraint
30
+ await knex.raw(`
31
+ ALTER TABLE players
32
+ DROP CONSTRAINT players_domain_steam_xbox_eos_platform_unique;
33
+ `);
34
+
35
+ // Drop the individual platformId unique constraint
36
+ await knex.schema.alterTable('players', (table) => {
37
+ table.dropUnique(['domain', 'platformId']);
38
+ });
39
+
40
+ // Remove platformId column
41
+ await knex.schema.alterTable('players', (table) => {
42
+ table.dropColumn('platformId');
43
+ });
44
+
45
+ // Re-add the original unique constraint
46
+ await knex.raw(`
47
+ ALTER TABLE players
48
+ ADD CONSTRAINT players_domain_steam_xbox_eos_unique
49
+ UNIQUE NULLS NOT DISTINCT (domain, "steamId", "xboxLiveId", "epicOnlineServicesId");
50
+ `);
51
+ }
@@ -0,0 +1,25 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ // Add dimension column to playerOnGameServer table
5
+ await knex.schema.alterTable('playerOnGameServer', (table) => {
6
+ table.string('dimension').nullable();
7
+ });
8
+
9
+ // Add dimension column to playerLocation table
10
+ await knex.schema.alterTable('playerLocation', (table) => {
11
+ table.string('dimension').nullable();
12
+ });
13
+ }
14
+
15
+ export async function down(knex: Knex): Promise<void> {
16
+ // Remove dimension column from playerOnGameServer table
17
+ await knex.schema.alterTable('playerOnGameServer', (table) => {
18
+ table.dropColumn('dimension');
19
+ });
20
+
21
+ // Remove dimension column from playerLocation table
22
+ await knex.schema.alterTable('playerLocation', (table) => {
23
+ table.dropColumn('dimension');
24
+ });
25
+ }
@@ -0,0 +1,40 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.schema.createTable('entities', (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('gameserverId').references('gameservers.id').onDelete('CASCADE').notNullable();
9
+ table.string('name').notNullable();
10
+ table.string('code').notNullable();
11
+ table.text('description').nullable();
12
+ table.enum('type', ['hostile', 'friendly', 'neutral']).nullable();
13
+ table.jsonb('metadata').nullable();
14
+ // Add index on code since we'll use that in queries a lot
15
+ table.index('code');
16
+ // Add unique constraint to prevent duplicates
17
+ table.unique(['code', 'gameserverId', 'domain']);
18
+ });
19
+
20
+ // Insert entity permissions
21
+ await knex('permission').insert([
22
+ {
23
+ permission: 'READ_ENTITIES',
24
+ description: 'Can view entity details',
25
+ friendlyName: 'Read Entities',
26
+ },
27
+ {
28
+ permission: 'MANAGE_ENTITIES',
29
+ description: 'Can create, update, and delete entities',
30
+ friendlyName: 'Manage Entities',
31
+ },
32
+ ]);
33
+ }
34
+
35
+ export async function down(knex: Knex): Promise<void> {
36
+ // Remove entity permissions
37
+ await knex('permission').whereIn('permission', ['READ_ENTITIES', 'MANAGE_ENTITIES']).del();
38
+
39
+ await knex.schema.dropTable('entities');
40
+ }
@@ -1,4 +1,3 @@
1
- /* eslint-disable quotes */
2
1
  export function formatAlterTableEnumSql(tableName: string, columnName: string, enums: string[]) {
3
2
  const constraintName = `${tableName}_${columnName}_check`;
4
3
  return [
@@ -64,7 +64,6 @@ export async function populateModelColumns() {
64
64
  const knex = await getKnex();
65
65
  // Find all tables
66
66
  const tables = await knex.raw(
67
- // eslint-disable-next-line
68
67
  "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE'",
69
68
  );
70
69
  // For each table, store the columns
package/src/redis.ts CHANGED
@@ -2,7 +2,7 @@ import { createClient, RedisClientOptions } from 'redis';
2
2
  import { config } from './config.js';
3
3
  import { logger, health } from '@takaro/util';
4
4
 
5
- type RedisClient = ReturnType<typeof createClient>;
5
+ export type RedisClient = ReturnType<typeof createClient>;
6
6
 
7
7
  class RedisClass {
8
8
  private log = logger('redis');
@@ -17,14 +17,15 @@ class RedisClass {
17
17
  * @returns
18
18
  */
19
19
  async getClient(name: string, extra: RedisClientOptions = {}): Promise<RedisClient> {
20
- const cachedClient = this.clients.get(name);
20
+ const normalizedName = name.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
21
+ const cachedClient = this.clients.get(normalizedName);
21
22
 
22
23
  if (cachedClient) return cachedClient;
23
24
 
24
- this.log.debug(`Creating new Redis client for ${name}`);
25
+ this.log.debug(`Creating new Redis client for ${normalizedName}`);
25
26
 
26
27
  const client = createClient({
27
- name,
28
+ name: normalizedName,
28
29
  username: config.get('redis.username'),
29
30
  password: config.get('redis.password'),
30
31
  socket: {
@@ -35,9 +36,9 @@ class RedisClass {
35
36
  });
36
37
 
37
38
  await client.connect();
38
- this.clients.set(name, client);
39
+ this.clients.set(normalizedName, client);
39
40
 
40
- health.registerHook(name, async () => {
41
+ health.registerHook(normalizedName, async () => {
41
42
  await client.ping();
42
43
  });
43
44