From a49fd1f5bb26438a1279beadf9493842e709aef1 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Thu, 22 Jun 2023 13:11:09 +0200 Subject: [PATCH] add migartion to change update_kill_view_fnct --- src/client/client.ts | 1 + .../2023-06-22-01 fix_empty_names.ts | 100 ++++++++++++++++++ src/process/onKill.ts | 1 - 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 src/db/migrations/2023-06-22-01 fix_empty_names.ts diff --git a/src/client/client.ts b/src/client/client.ts index 8ce6d58..e28778b 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -75,6 +75,7 @@ router.get('/players', const result = db.selectFrom('kill_view') let data const resultFiltered = processQueryArgs(result, req.query as unknown as string | string[]) + // Cache stuff when no route is present so request doesn't takes 4secs to complete if (result !== resultFiltered) { const selection = resultFiltered.select([sum('kills').as('kills'), sum('deaths').as('deaths'), sum('deaths_with_weapon').as('deaths_while_equipped'), 'attacker_id', sql`last(attacker_name)`.as('username'), sum('total_distance').as('total_distance'), max('max_distance').as('max_distance')]).groupBy('attacker_id') data = (await selection.execute()).reduce>((acc, curr) => { diff --git a/src/db/migrations/2023-06-22-01 fix_empty_names.ts b/src/db/migrations/2023-06-22-01 fix_empty_names.ts new file mode 100644 index 0000000..b56e37d --- /dev/null +++ b/src/db/migrations/2023-06-22-01 fix_empty_names.ts @@ -0,0 +1,100 @@ +import { type Kysely } from 'kysely' +import { Client } from 'pg' + +const pgClient = new Client({ + host: process.env.POSTGRES_HOST, + database: process.env.POSTGRES_DATABASE, + user: process.env.POSTGRES_USER, + password: process.env.POSTGRES_PASSWORD +}) + +export async function up (db: Kysely): Promise { + await pgClient.connect() + await pgClient.query(`CREATE OR REPLACE FUNCTION update_kill_view_fnct() + RETURNS TRIGGER +AS $$ +BEGIN + IF EXISTS( + SELECT * FROM kill_view + WHERE + new.attacker_id = attacker_id AND + new.map = map AND + new.game_mode = game_mode AND + new.cause_of_death = cause_of_death AND + new.servername = servername AND + new.host = host + ) THEN + UPDATE kill_view SET kills = kills + 1, + max_distance = (SELECT Max(v) FROM (VALUES (new.distance), (max_distance)) AS value(v)), + total_distance = total_distance + new.distance, + attacker_name = new.attacker_name + WHERE + new.attacker_id = attacker_id AND + new.map = map AND + new.game_mode = game_mode AND + new.cause_of_death = cause_of_death AND + new.servername = servername AND + new.host = host; + ELSE + INSERT INTO kill_view(kills,deaths, deaths_with_weapon, attacker_id, map, game_mode, cause_of_death, servername, host, max_distance, total_distance, attacker_name) + VALUES(1,0,0, new.attacker_id, new.map, new.game_mode, new.cause_of_death, new.servername, new.host,new.distance, new.distance, new.attacker_name); + END IF; + + + IF EXISTS( + SELECT * FROM kill_view + WHERE + new.victim_id = attacker_id AND + new.map = map AND + new.game_mode = game_mode AND + new.cause_of_death = cause_of_death AND + new.servername = servername AND + new.host = host + ) THEN + UPDATE kill_view SET deaths = deaths + 1 + WHERE + new.victim_id = attacker_id AND + new.map = map AND + new.game_mode = game_mode AND + new.cause_of_death = cause_of_death AND + new.servername = servername AND + new.host = host; + ELSE + INSERT INTO kill_view(deaths, kills, deaths_with_weapon, attacker_id, map, game_mode, cause_of_death, servername, host, max_distance, total_distance, attacker_name) + VALUES(1,0,0, new.victim_id, new.map, new.game_mode, new.cause_of_death, new.servername, new.host,0,0, new.victim_name); + END IF; + + + IF EXISTS( + SELECT * FROM kill_view + WHERE + new.victim_id = attacker_id AND + new.map = map AND + new.game_mode = game_mode AND + new.attacker_current_weapon = cause_of_death AND + new.servername = servername AND + new.host = host + ) THEN + UPDATE kill_view SET deaths_with_weapon = deaths_with_weapon + 1 + WHERE + new.victim_id = attacker_id AND + new.map = map AND + new.game_mode = game_mode AND + new.attacker_current_weapon = cause_of_death AND + new.servername = servername AND + new.host = host; + ELSE + INSERT INTO kill_view(deaths, kills, deaths_with_weapon, attacker_id, map, game_mode, cause_of_death, servername, host, max_distance, total_distance, attacker_name) + VALUES(0,0,1, new.victim_id, new.map, new.game_mode, new.attacker_current_weapon, new.servername, new.host,0,0, new.victim_name); + END IF; + + + RETURN NEW; +END; +$$ LANGUAGE PLPGSQL;`) + await pgClient.end() +} + +export async function down (db: Kysely): Promise { + +} diff --git a/src/process/onKill.ts b/src/process/onKill.ts index 0f018ed..e1b0ff0 100644 --- a/src/process/onKill.ts +++ b/src/process/onKill.ts @@ -15,7 +15,6 @@ export default async function listenKills () { pgClient.on('notification', (data) => { if (!data.payload) return const payload = JSON.parse(data.payload) - console.log(`recieved kill for ${payload.attacker_name as string}`) let killEntry = allData[payload.attacker_id] let deathEntry = allData[payload.victim_id]