@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.
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +0 -1
- package/dist/encryption.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/migrations/sql/20250112102308-generic-gameserver.d.ts +4 -0
- package/dist/migrations/sql/20250112102308-generic-gameserver.d.ts.map +1 -0
- package/dist/migrations/sql/20250112102308-generic-gameserver.js +47 -0
- package/dist/migrations/sql/20250112102308-generic-gameserver.js.map +1 -0
- package/dist/migrations/sql/20250606060546-inventory-tracking.d.ts +4 -0
- package/dist/migrations/sql/20250606060546-inventory-tracking.d.ts.map +1 -0
- package/dist/migrations/sql/20250606060546-inventory-tracking.js +82 -0
- package/dist/migrations/sql/20250606060546-inventory-tracking.js.map +1 -0
- package/dist/migrations/sql/20250613110835-add-platform-id-to-players.d.ts +4 -0
- package/dist/migrations/sql/20250613110835-add-platform-id-to-players.d.ts.map +1 -0
- package/dist/migrations/sql/20250613110835-add-platform-id-to-players.js +43 -0
- package/dist/migrations/sql/20250613110835-add-platform-id-to-players.js.map +1 -0
- package/dist/migrations/sql/20250613203142-add-dimension-to-position.d.ts +4 -0
- package/dist/migrations/sql/20250613203142-add-dimension-to-position.d.ts.map +1 -0
- package/dist/migrations/sql/20250613203142-add-dimension-to-position.js +21 -0
- package/dist/migrations/sql/20250613203142-add-dimension-to-position.js.map +1 -0
- package/dist/migrations/sql/20250614113157-entities.d.ts +4 -0
- package/dist/migrations/sql/20250614113157-entities.d.ts.map +1 -0
- package/dist/migrations/sql/20250614113157-entities.js +36 -0
- package/dist/migrations/sql/20250614113157-entities.js.map +1 -0
- package/dist/migrations/util/alterEnum.d.ts.map +1 -1
- package/dist/migrations/util/alterEnum.js +0 -1
- package/dist/migrations/util/alterEnum.js.map +1 -1
- package/dist/queryBuilder.d.ts.map +1 -1
- package/dist/queryBuilder.js +1 -3
- package/dist/queryBuilder.js.map +1 -1
- package/dist/redis.d.ts +1 -1
- package/dist/redis.d.ts.map +1 -1
- package/dist/redis.js +6 -5
- package/dist/redis.js.map +1 -1
- package/package.json +1 -1
- package/src/encryption.ts +0 -1
- package/src/main.ts +1 -1
- package/src/migrations/sql/20250112102308-generic-gameserver.ts +55 -0
- package/src/migrations/sql/20250606060546-inventory-tracking.ts +96 -0
- package/src/migrations/sql/20250613110835-add-platform-id-to-players.ts +51 -0
- package/src/migrations/sql/20250613203142-add-dimension-to-position.ts +25 -0
- package/src/migrations/sql/20250614113157-entities.ts +40 -0
- package/src/migrations/util/alterEnum.ts +0 -1
- package/src/queryBuilder.ts +0 -1
- package/src/redis.ts +7 -6
package/dist/encryption.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/encryption.js
CHANGED
|
@@ -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
|
}
|
package/dist/encryption.js.map
CHANGED
|
@@ -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,
|
|
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
|
package/dist/main.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alterEnum.js","sourceRoot":"","sources":["../../../src/migrations/util/alterEnum.ts"],"names":[],"mappings":"AAAA,
|
|
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,
|
|
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"}
|
package/dist/queryBuilder.js
CHANGED
|
@@ -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;
|
package/dist/queryBuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../src/queryBuilder.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AASzE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,OAAO,YAAY;CAyCxB;AAvCC;IADC,UAAU,EAAE;;6CAGX;AAGF;IADC,UAAU,EAAE;;4CAGX;AAGF;IADC,UAAU,EAAE;;iDAGX;AAGF;IADC,UAAU,EAAE;;8CAGX;AAIF;IAFC,UAAU,EAAE;IACZ,QAAQ,EAAE;;0CACG;AAId;IAFC,UAAU,EAAE;IACZ,QAAQ,EAAE;;2CACI;AAIf;IAFC,UAAU,EAAE;IACZ,QAAQ,EAAE;;4CACK;AAKhB;IAHC,UAAU,EAAE;IACZ,QAAQ,EAAE;IACV,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;;mDACM;AAI9B;IAFC,UAAU,EAAE;IACZ,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;4CACP;AAGpB,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,MAAM,aAAa,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;QAC7B,kBAAkB;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG
|
|
1
|
+
{"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../src/queryBuilder.ts"],"names":[],"mappings":"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"}
|
package/dist/redis.d.ts
CHANGED
package/dist/redis.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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 ${
|
|
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(
|
|
33
|
-
health.registerHook(
|
|
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;
|
|
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
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
|
@@ -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
|
+
}
|
package/src/queryBuilder.ts
CHANGED
|
@@ -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
|
|
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 ${
|
|
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(
|
|
39
|
+
this.clients.set(normalizedName, client);
|
|
39
40
|
|
|
40
|
-
health.registerHook(
|
|
41
|
+
health.registerHook(normalizedName, async () => {
|
|
41
42
|
await client.ping();
|
|
42
43
|
});
|
|
43
44
|
|