change db directory to submodule
This commit is contained in:
@@ -1,62 +0,0 @@
|
|||||||
import * as dotenv from 'dotenv'
|
|
||||||
import { Kysely, PostgresDialect } from 'kysely'
|
|
||||||
import { Pool } from 'pg'
|
|
||||||
import migrateToLatest from './migrations'
|
|
||||||
import { type KillTable } from './model'
|
|
||||||
import type Database from './model'
|
|
||||||
dotenv.config()
|
|
||||||
const migration = migrateToLatest()
|
|
||||||
const db = new Kysely<Database>({
|
|
||||||
dialect: new PostgresDialect({
|
|
||||||
pool: new Pool({
|
|
||||||
host: process.env.POSTGRES_HOST,
|
|
||||||
database: process.env.POSTGRES_DATABASE,
|
|
||||||
user: process.env.POSTGRES_USER,
|
|
||||||
password: process.env.POSTGRES_PASSWORD,
|
|
||||||
max: 30
|
|
||||||
})
|
|
||||||
}),
|
|
||||||
log (event) {
|
|
||||||
if (process.env.ENVIRONMENT !== 'dev') {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (event.level === 'query') {
|
|
||||||
console.log(event.query.sql)
|
|
||||||
console.log(event.query.parameters)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
interface RemoveFromKill {
|
|
||||||
id: unknown
|
|
||||||
unix_time: unknown
|
|
||||||
}
|
|
||||||
|
|
||||||
type KillRecord = Omit<KillTable, keyof RemoveFromKill>
|
|
||||||
|
|
||||||
export async function CreateKillRecord (data: KillRecord) {
|
|
||||||
await db
|
|
||||||
.insertInto('kill')
|
|
||||||
.values({ ...data })
|
|
||||||
.execute()
|
|
||||||
}
|
|
||||||
export async function getHostList () {
|
|
||||||
return await db.selectFrom('host').select(['id', 'host.name']).execute()
|
|
||||||
}
|
|
||||||
// tokens are stored in raw... maybe we should use something better in the future
|
|
||||||
// Using callback for express-basic-auth
|
|
||||||
export async function CheckServerToken (token: string) {
|
|
||||||
return await db.selectFrom('host').select('id')
|
|
||||||
.where('token', '=', Buffer.from(token, 'base64').toString())
|
|
||||||
.executeTakeFirst()
|
|
||||||
.then((result) => {
|
|
||||||
return result
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function dbReady (): Promise<Kysely<Database>> {
|
|
||||||
await migration
|
|
||||||
return db
|
|
||||||
}
|
|
||||||
|
|
||||||
export default db
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
import { promises as fs } from 'fs'
|
|
||||||
import {
|
|
||||||
FileMigrationProvider,
|
|
||||||
Kysely,
|
|
||||||
Migrator,
|
|
||||||
PostgresDialect
|
|
||||||
} from 'kysely'
|
|
||||||
import * as path from 'path'
|
|
||||||
import { Pool } from 'pg'
|
|
||||||
import type Database from './model'
|
|
||||||
|
|
||||||
async function migrateToLatest () {
|
|
||||||
const db = new Kysely<Database>({
|
|
||||||
dialect: new PostgresDialect({
|
|
||||||
pool: new Pool({
|
|
||||||
host: process.env.POSTGRES_HOST,
|
|
||||||
database: process.env.POSTGRES_DATABASE,
|
|
||||||
user: process.env.POSTGRES_USER,
|
|
||||||
password: process.env.POSTGRES_PASSWORD
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
const migrator = new Migrator({
|
|
||||||
db,
|
|
||||||
provider: new FileMigrationProvider({
|
|
||||||
fs,
|
|
||||||
path,
|
|
||||||
migrationFolder: path.join(__dirname, './migrations')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
const { error, results } = await migrator.migrateToLatest()
|
|
||||||
|
|
||||||
results?.forEach((it) => {
|
|
||||||
if (it.status === 'Success') {
|
|
||||||
console.log(`migration "${it.migrationName}" was executed successfully`)
|
|
||||||
} else if (it.status === 'Error') {
|
|
||||||
console.error(`failed to execute migration "${it.migrationName}"`)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
console.error('failed to migrate')
|
|
||||||
console.error(error)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
await db.destroy()
|
|
||||||
}
|
|
||||||
|
|
||||||
export default migrateToLatest
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
import { Kysely, sql } from 'kysely'
|
|
||||||
|
|
||||||
export async function up(db: Kysely<any>): Promise<void> {
|
|
||||||
await db.schema
|
|
||||||
.createTable('player')
|
|
||||||
.addColumn('id', 'integer', (col) => col.unique().primaryKey())
|
|
||||||
.addColumn('name', 'varchar')
|
|
||||||
.addColumn('optout', 'boolean')
|
|
||||||
.addColumn('hide_TOS', 'boolean')
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema
|
|
||||||
.createTable('weapon')
|
|
||||||
.addColumn('id', 'varchar', (col) => col.unique().primaryKey())
|
|
||||||
.addColumn('name', 'varchar')
|
|
||||||
.addColumn('description', 'varchar')
|
|
||||||
.addColumn('image', 'varchar')
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema
|
|
||||||
.createTable('map')
|
|
||||||
.addColumn('id', 'varchar', (col) => col.unique().primaryKey())
|
|
||||||
.addColumn('name', 'varchar')
|
|
||||||
.addColumn('description', 'varchar')
|
|
||||||
.addColumn('image', 'varchar')
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema
|
|
||||||
.createTable('server')
|
|
||||||
.addColumn('id', 'serial', (col) => col.primaryKey())
|
|
||||||
.addColumn('name', 'varchar', (col) => col.unique())
|
|
||||||
.addColumn('description', 'varchar')
|
|
||||||
.addColumn('token', 'varchar', (col) =>
|
|
||||||
col.notNull().defaultTo(sql`gen_random_uuid()`)
|
|
||||||
)
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema
|
|
||||||
.createTable('kill')
|
|
||||||
.addColumn('id', 'serial', (col) => col.primaryKey())
|
|
||||||
.addColumn('server', 'integer', (col) =>
|
|
||||||
col.references('server.id').notNull().onDelete('cascade')
|
|
||||||
)
|
|
||||||
.addColumn('killstat_version', 'varchar')
|
|
||||||
.addColumn('match_id', 'varchar')
|
|
||||||
.addColumn('game_mode', 'varchar')
|
|
||||||
.addColumn('map', 'varchar')
|
|
||||||
.addColumn('unix_time', 'timestamp', (col) =>
|
|
||||||
col.defaultTo(sql`now()`).notNull()
|
|
||||||
)
|
|
||||||
.addColumn('game_time', 'decimal')
|
|
||||||
.addColumn('player_count', 'integer')
|
|
||||||
.addColumn('attacker_name', 'varchar')
|
|
||||||
.addColumn('attacker_id', 'varchar')
|
|
||||||
.addColumn('attacker_current_weapon', 'varchar')
|
|
||||||
.addColumn('attacker_current_weapon_mods', 'integer')
|
|
||||||
.addColumn('attacker_weapon_1', 'varchar')
|
|
||||||
.addColumn('attacker_weapon_1_mods', 'integer')
|
|
||||||
.addColumn('attacker_weapon_2', 'varchar')
|
|
||||||
.addColumn('attacker_weapon_2_mods', 'integer')
|
|
||||||
.addColumn('attacker_weapon_3', 'varchar')
|
|
||||||
.addColumn('attacker_weapon_3_mods', 'integer')
|
|
||||||
.addColumn('attacker_offhand_weapon_1', 'integer')
|
|
||||||
.addColumn('attacker_offhand_weapon_2', 'integer')
|
|
||||||
.addColumn('victim_name', 'varchar')
|
|
||||||
.addColumn('victim_id', 'varchar')
|
|
||||||
.addColumn('victim_current_weapon', 'varchar')
|
|
||||||
.addColumn('victim_current_weapon_mods', 'integer')
|
|
||||||
.addColumn('victim_weapon_1', 'varchar')
|
|
||||||
.addColumn('victim_weapon_1_mods', 'integer')
|
|
||||||
.addColumn('victim_weapon_2', 'varchar')
|
|
||||||
.addColumn('victim_weapon_2_mods', 'integer')
|
|
||||||
.addColumn('victim_weapon_3', 'varchar')
|
|
||||||
.addColumn('victim_weapon_3_mods', 'integer')
|
|
||||||
.addColumn('victim_offhand_weapon_1', 'integer')
|
|
||||||
.addColumn('victim_offhand_weapon_2', 'integer')
|
|
||||||
.addColumn('cause_of_death', 'varchar')
|
|
||||||
.addColumn('distance', 'decimal')
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
/*await db.schema
|
|
||||||
.createTable("pet")
|
|
||||||
.addColumn("id", "serial", (col) => col.primaryKey())
|
|
||||||
.addColumn("name", "varchar", (col) => col.notNull().unique())
|
|
||||||
.addColumn("owner_id", "integer", (col) =>
|
|
||||||
col.references("person.id").onDelete("cascade").notNull()
|
|
||||||
)
|
|
||||||
.addColumn("species", "varchar", (col) => col.notNull())
|
|
||||||
.execute();*/
|
|
||||||
/*
|
|
||||||
await db.schema
|
|
||||||
.createIndex("kill")
|
|
||||||
.on("pet")
|
|
||||||
.column("owner_id")
|
|
||||||
.execute();*/
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> {
|
|
||||||
await db.schema.dropTable('kill').execute()
|
|
||||||
await db.schema.dropTable('player').execute()
|
|
||||||
await db.schema.dropTable('weapon').execute()
|
|
||||||
await db.schema.dropTable('map').execute()
|
|
||||||
await db.schema.dropTable('server').execute()
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import { Kysely, sql } from 'kysely'
|
|
||||||
import { Client } from 'pg'
|
|
||||||
|
|
||||||
const notify_newkill = `
|
|
||||||
CREATE OR REPLACE FUNCTION notify_new_kill()
|
|
||||||
RETURNS trigger
|
|
||||||
AS
|
|
||||||
$$
|
|
||||||
BEGIN
|
|
||||||
PERFORM pg_notify('new_kill', row_to_json(NEW)::text);
|
|
||||||
RETURN NULL;
|
|
||||||
END;
|
|
||||||
$$
|
|
||||||
LANGUAGE plpgsql;
|
|
||||||
`
|
|
||||||
|
|
||||||
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<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query(notify_newkill)
|
|
||||||
await pgClient.query(`CREATE TRIGGER insert_kills_notify AFTER INSERT ON kill FOR EACH ROW EXECUTE PROCEDURE notify_new_kill();`)
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.query(`DROP FUNCTION IF EXISTS notify_new_kill;`)
|
|
||||||
await pgClient.query(`DROP TRIGGER IF EXISTS insert_kills_notify;`)
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
import { Kysely, sql } 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<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query('DROP TABLE IF EXISTS player')
|
|
||||||
|
|
||||||
await pgClient.query('ALTER TABLE kill ADD COLUMN IF NOT EXISTS servername character varying NULL;')
|
|
||||||
await pgClient.query('ALTER TABLE kill ADD COLUMN IF NOT EXISTS host integer NULL;')
|
|
||||||
await pgClient.query('UPDATE kill SET servername = server.name FROM server WHERE server.id = kill.server;')
|
|
||||||
|
|
||||||
await pgClient.query('CREATE TABLE host (id SERIAL PRIMARY KEY, name character varying, token character varying)')
|
|
||||||
await pgClient.query('INSERT INTO host (token) SELECT DISTINCT token FROM server')
|
|
||||||
await pgClient.query('UPDATE kill SET host = host.id FROM host FULL JOIN server ON server.token = host.token WHERE host.token = server.token AND server.id = kill.server;')
|
|
||||||
|
|
||||||
await pgClient.query('ALTER TABLE kill ALTER COLUMN servername SET NOT NULL;')
|
|
||||||
await pgClient.query('ALTER TABLE kill DROP COLUMN server;')
|
|
||||||
await pgClient.query('DROP TABLE IF EXISTS server')
|
|
||||||
//Update the hosts column once the hoster table is manually updated
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query('ALTER TABLE kill ADD server integer NULL;')
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD server integer NULL;`)
|
|
||||||
await pgClient.query('UPDATE kill SET server = server.id FROM server where server.name = kill.servername;')
|
|
||||||
await pgClient.query('ALTER TABLE kill ALTER COLUMN server SET NOT NULL;')
|
|
||||||
await pgClient.query('ALTER TABLE kill DROP COLUMN servername;')
|
|
||||||
await pgClient.query('ALTER TABLE kill DROP COLUMN host;')
|
|
||||||
await pgClient.query('DROP TABLE IF EXISTS host')
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import { Kysely, sql } 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<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query(`CREATE OR REPLACE FUNCTION public.first_agg (anyelement, anyelement)
|
|
||||||
RETURNS anyelement
|
|
||||||
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
|
|
||||||
'SELECT $1';`)
|
|
||||||
|
|
||||||
await pgClient.query(`CREATE AGGREGATE public.first (anyelement) (
|
|
||||||
SFUNC = public.first_agg
|
|
||||||
, STYPE = anyelement
|
|
||||||
, PARALLEL = safe
|
|
||||||
);`)
|
|
||||||
|
|
||||||
await pgClient.query(`CREATE OR REPLACE FUNCTION public.last_agg (anyelement, anyelement)
|
|
||||||
RETURNS anyelement
|
|
||||||
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
|
|
||||||
'SELECT $2';`)
|
|
||||||
|
|
||||||
|
|
||||||
await pgClient.query(`CREATE AGGREGATE public.last (anyelement) (
|
|
||||||
SFUNC = public.last_agg
|
|
||||||
, STYPE = anyelement
|
|
||||||
, PARALLEL = safe
|
|
||||||
);`)
|
|
||||||
//Update the hosts column once the hoster table is manually updated
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
pgClient.query('DROP AGGREGATE public.last')
|
|
||||||
pgClient.query('DROP FUNCTION public.last_agg')
|
|
||||||
pgClient.query('DROP AGGREGATE public.first')
|
|
||||||
pgClient.query('DROP AGGREGATE public.first_agg')
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import { Kysely, sql } 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<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD COLUMN IF NOT EXISTS attacker_titan character varying NULL;`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'scorch' WHERE (cause_of_death = 'mp_titancore_flame_wave_secondary' OR cause_of_death = 'mp_titancore_flame_wave' OR cause_of_death = 'mp_titancore_flame_wall' OR cause_of_death = 'mp_titanweapon_meteor_thermite' OR cause_of_death = 'mp_titanweapon_heat_shield' OR cause_of_death = 'titan_punch_scorch' OR cause_of_death = 'mp_titanweapon_meteor')`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'ronin' WHERE (cause_of_death = 'mp_titanweapon_arc_wave' OR cause_of_death = 'mp_titancore_shift_core' OR cause_of_death = 'titan_sword' OR cause_of_death = 'mp_titanweapon_leadwall')`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'ion' WHERE (cause_of_death = 'titan_punch_ion' OR cause_of_death = 'mp_titanweapon_vortex_shield_ion' OR cause_of_death = 'mp_titancore_laser_cannon' OR cause_of_death = 'mp_titanability_laser_trip' OR cause_of_death = 'mp_titanweapon_laser_lite')`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'tone' WHERE (cause_of_death = 'mp_titancore_salvo_core' OR cause_of_death = 'titan_punch_tone' OR cause_of_death = 'mp_titanweapon_salvo_rockets' OR cause_of_death = 'mp_titanweapon_sticky_40mm')`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'northstar' WHERE (cause_of_death = 'mp_titanability_slow_trap' OR cause_of_death = 'mp_titanweapon_flightcore_rockets' OR cause_of_death = 'titan_punch_northstar' OR cause_of_death = 'mp_titanweapon_sniper')`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'legion' WHERE (cause_of_death = 'titan_punch_legion' OR cause_of_death = 'mp_titanweapon_predator_cannon')`)
|
|
||||||
await pgClient.query(`UPDATE kill SET attacker_titan = 'vanguard' WHERE (cause_of_death = 'mp_titanweapon_dumbfire_rockets' OR cause_of_death = 'titan_punch_vanguard' OR cause_of_death = 'mp_titanweapon_tracker_rockets' OR cause_of_death = 'mp_titanweapon_particle_accelerator' OR cause_of_death = 'mp_titanweapon_xo16_vanguard')`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD COLUMN IF NOT EXISTS victim_titan character varying NULL;`)
|
|
||||||
//Update the hosts column once the hoster table is manually updated
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
pgClient.query('ALTER TABLE kill DROP COLUMN IF EXISTS attacker_titan')
|
|
||||||
pgClient.query('ALTER TABLE kill DROP COLUMN IF EXISTS victim_titan')
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
import { Kysely, sql } 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
|
|
||||||
})
|
|
||||||
|
|
||||||
const weapons = [
|
|
||||||
'car',
|
|
||||||
'alternator_smg',
|
|
||||||
'hemlok_smg',
|
|
||||||
'r97',
|
|
||||||
'hemlok',
|
|
||||||
'vinson',
|
|
||||||
'g2',
|
|
||||||
'rspn101',
|
|
||||||
'rspn101_og',
|
|
||||||
'esaw',
|
|
||||||
'lstar',
|
|
||||||
'lmg',
|
|
||||||
'shotgun',
|
|
||||||
'mastiff',
|
|
||||||
'dmr',
|
|
||||||
'sniper',
|
|
||||||
'doubletake',
|
|
||||||
'pulse_lmg',
|
|
||||||
'smr',
|
|
||||||
'softball',
|
|
||||||
'epg',
|
|
||||||
'shotgun_pistol',
|
|
||||||
'wingman_n',
|
|
||||||
'autopistol',
|
|
||||||
'semipistol',
|
|
||||||
'wingman',
|
|
||||||
'mgl',
|
|
||||||
'arc_launcher',
|
|
||||||
'rocket_launcher',
|
|
||||||
'defender', 'grenade_sonar', 'thermite_grenade', 'grenade_emp', 'smart_pistol', 'satchel', 'grenade_electric_smoke', 'frag_grenade', 'grenade_gravity', 'turretplasma',
|
|
||||||
]
|
|
||||||
|
|
||||||
export async function up(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await Promise.all(weapons.map(async (e) => {
|
|
||||||
console.log('update ' + e)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET cause_of_death = 'mp_weapon_${e}' WHERE cause_of_death = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_current_weapon = 'mp_weapon_${e}' WHERE attacker_current_weapon = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_weapon_1 = 'mp_weapon_${e}' WHERE attacker_weapon_1 = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_weapon_2 = 'mp_weapon_${e}' WHERE attacker_weapon_2 = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_weapon_3 = 'mp_weapon_${e}' WHERE attacker_weapon_3 = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_current_weapon = 'mp_weapon_${e}' WHERE victim_current_weapon = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_weapon_1 = 'mp_weapon_${e}' WHERE victim_weapon_1 = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_weapon_2 = 'mp_weapon_${e}' WHERE victim_weapon_2 = '${e}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_weapon_3 = 'mp_weapon_${e}' WHERE victim_weapon_3 = '${e}';`
|
|
||||||
)
|
|
||||||
console.log('weapon ' + e + ' updated')
|
|
||||||
}))
|
|
||||||
|
|
||||||
console.log('end')
|
|
||||||
|
|
||||||
//Update the hosts column once the hoster table is manually updated
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> { }
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
import { Kysely, sql } 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<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME attacker_offhand_weapon_2 TO attacker_offhand_weapon_2_mods;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME attacker_offhand_weapon_1 TO attacker_offhand_weapon_1_mods;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME victim_offhand_weapon_2 TO victim_offhand_weapon_2_mods;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME victim_offhand_weapon_1 TO victim_offhand_weapon_1_mods;`)
|
|
||||||
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD COLUMN IF NOT EXISTS victim_offhand_weapon_1 character varying NULL;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD COLUMN IF NOT EXISTS victim_offhand_weapon_2 character varying NULL;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD COLUMN IF NOT EXISTS attacker_offhand_weapon_1 character varying NULL;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill ADD COLUMN IF NOT EXISTS attacker_offhand_weapon_2 character varying NULL;`)
|
|
||||||
//Update the hosts column once the hoster table is manually updated
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
|
|
||||||
await pgClient.query(`ALTER TABLE kill DROP COLUMN IF EXISTS victim_offhand_weapon_1;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill DROP COLUMN IF EXISTS victim_offhand_weapon_2;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill DROP COLUMN IF EXISTS attacker_offhand_weapon_1;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill DROP COLUMN IF EXISTS attacker_offhand_weapon_2;`)
|
|
||||||
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME attacker_offhand_weapon_2_mods TO victim_offhand_weapon_2;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME attacker_offhand_weapon_1_mods TO victim_offhand_weapon_1;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME victim_offhand_weapon_2_mods TO victim_offhand_weapon_2;`)
|
|
||||||
await pgClient.query(`ALTER TABLE kill RENAME victim_offhand_weapon_1_mods TO victim_offhand_weapon_1;`)
|
|
||||||
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
import { Kysely, sql } 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
|
|
||||||
})
|
|
||||||
|
|
||||||
const weapons = {
|
|
||||||
titan_sword: 'melee_titan_sword',
|
|
||||||
yh803_bullet: 'mp_weapon_yh803_bullet',
|
|
||||||
titan_punch_scorch: 'melee_titan_punch_scorch',
|
|
||||||
titan_punch_tone: 'melee_titan_punch_tone',
|
|
||||||
titan_punch_ion: "melee_titan_punch_ion",
|
|
||||||
titan_punch_vanguard: "melee_titan_punch_vanguard",
|
|
||||||
titan_punch_legion: "melee_titan_punch_legion",
|
|
||||||
titan_punch_northstar: "melee_titan_punch_northstar",
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function up(db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await Promise.all(
|
|
||||||
Object.entries(weapons).map(async (e) => {
|
|
||||||
console.log('update ' + e[0])
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET cause_of_death = '${e[1]}' WHERE cause_of_death = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_current_weapon = '${e[1]}' WHERE attacker_current_weapon = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_weapon_1 = '${e[1]}' WHERE attacker_weapon_1 = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_weapon_2 = '${e[1]}' WHERE attacker_weapon_2 = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET attacker_weapon_3 = '${e[1]}' WHERE attacker_weapon_3 = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_current_weapon = '${e[1]}' WHERE victim_current_weapon = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_weapon_1 = '${e[1]}' WHERE victim_weapon_1 = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_weapon_2 = '${e[1]}' WHERE victim_weapon_2 = '${e[0]}';`
|
|
||||||
)
|
|
||||||
await pgClient.query(
|
|
||||||
`UPDATE KILL SET victim_weapon_3 = '${e[1]}' WHERE victim_weapon_3 = '${e[0]}';`
|
|
||||||
)
|
|
||||||
console.log('weapon ' + e[1] + ' updated')
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
console.log('end')
|
|
||||||
|
|
||||||
//Update the hosts column once the hoster table is manually updated
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down(db: Kysely<any>): Promise<void> { }
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
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<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query('DROP TABLE IF EXISTS kill_view;')
|
|
||||||
console.log('creating table kill_view')
|
|
||||||
await pgClient.query(`CREATE TABLE kill_view
|
|
||||||
AS (
|
|
||||||
with "kills" as (select count("id") as "kills", coalesce(max("distance"), 0) as "max_distance", coalesce(sum("distance"), 0) as "total_distance", "attacker_id", last(attacker_name) as "attacker_name", "cause_of_death", "map", "game_mode", "servername", "host" from "kill" where "attacker_id" != "victim_id" group by "attacker_id", "cause_of_death", "map", "servername", "host", "game_mode"), "deaths" as (select count("id") as "deaths", "victim_id", last(victim_name) as "victim_name", "cause_of_death", "map", "game_mode", "servername", "host" from "kill" group by "victim_id", "cause_of_death", "map", "servername", "host", "game_mode"), "deathswithweapon" as (select count("id") as "deaths", "victim_id", "victim_current_weapon", "map", "game_mode", "servername", "host" from "kill" group by "victim_id", "victim_current_weapon", "map", "servername", "host", "game_mode") select COALESCE(kills.attacker_name, deaths.victim_name) as "attacker_name", COALESCE(kills.attacker_id, deaths.victim_id) as "attacker_id", COALESCE(kills.kills, 0) as "kills", COALESCE(kills.total_distance, 0) as "total_distance", COALESCE(deathswithweapon.deaths, 0) as "deaths_with_weapon", COALESCE(kills.max_distance, 0) as "max_distance", COALESCE(deaths.deaths, 0) as "deaths", COALESCE(kills.servername, deaths.servername) as "servername", COALESCE(kills.host, deaths.host) as "host", COALESCE(kills.cause_of_death, deaths.cause_of_death) as "cause_of_death", COALESCE(kills.map, deaths.map) as "map", COALESCE(kills.game_mode, deaths.game_mode) as "game_mode" from "kills" full join "deaths" on "deaths"."victim_id" = "kills"."attacker_id" and "deaths"."cause_of_death" = "kills"."cause_of_death" and "deaths"."servername" = "kills"."servername" and "deaths"."host" = "kills"."host" and "deaths"."game_mode" = "kills"."game_mode" and "deaths"."map" = "kills"."map" left join "deathswithweapon" on "deathswithweapon"."victim_id" = "kills"."attacker_id" and "deathswithweapon"."victim_current_weapon" = "kills"."cause_of_death" and "deathswithweapon"."servername" = "kills"."servername" and "deathswithweapon"."host" = "kills"."host" and "deathswithweapon"."game_mode" = "kills"."game_mode" and "deathswithweapon"."map" = "kills"."map"
|
|
||||||
);`)
|
|
||||||
console.log('creating index on attacker_id')
|
|
||||||
await pgClient.query('CREATE INDEX ON kill_view USING HASH ("attacker_id");')
|
|
||||||
console.log('creating index on map')
|
|
||||||
await pgClient.query('CREATE INDEX ON kill_view USING HASH ("map");')
|
|
||||||
console.log('creating index on game_mode')
|
|
||||||
await pgClient.query('CREATE INDEX ON kill_view USING HASH ("game_mode");')
|
|
||||||
console.log('creating index on cause_of_death')
|
|
||||||
await pgClient.query('CREATE INDEX ON kill_view USING HASH ("cause_of_death");')
|
|
||||||
console.log('creating index on server')
|
|
||||||
await pgClient.query('CREATE INDEX ON kill_view ("servername", "host");')
|
|
||||||
console.log('creating function update_kill_view_fnct')
|
|
||||||
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)
|
|
||||||
VALUES(1,0,0, new.attacker_id, new.map, new.game_mode, new.cause_of_death, new.servername, new.host,new.distance, new.distance);
|
|
||||||
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)
|
|
||||||
VALUES(1,0,0, new.victim_id, new.map, new.game_mode, new.cause_of_death, new.servername, new.host,0,0);
|
|
||||||
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)
|
|
||||||
VALUES(0,0,1, new.victim_id, new.map, new.game_mode, new.attacker_current_weapon, new.servername, new.host,0,0);
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$ LANGUAGE PLPGSQL;`)
|
|
||||||
console.log('creating trigger update_kill_view')
|
|
||||||
await pgClient.query(`CREATE OR REPLACE TRIGGER update_kill_view
|
|
||||||
AFTER INSERT ON kill
|
|
||||||
FOR EACH ROW
|
|
||||||
EXECUTE FUNCTION update_kill_view_fnct();`)
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down (db: Kysely<any>): Promise<void> {
|
|
||||||
await pgClient.connect()
|
|
||||||
await pgClient.query('DROP TRIGGER IF EXISTS update_kill_view;')
|
|
||||||
await pgClient.query('DROP FUNCTION IF EXISTS update_kill_view_fnct')
|
|
||||||
await pgClient.query('DROP TABLE IF EXISTS kill_view;')
|
|
||||||
await pgClient.end()
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
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<any>): Promise<void> {
|
|
||||||
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<any>): Promise<void> {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
import { sql, type Kysely } from 'kysely'
|
|
||||||
|
|
||||||
export async function up (db: Kysely<any>): Promise<void> {
|
|
||||||
await db.schema.createSchema('ToneAPI').ifNotExists().execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.host')
|
|
||||||
.addColumn('host_name', 'varchar(50)', (col) => col.notNull())
|
|
||||||
.addColumn('host_id', 'integer', (col) => col.notNull().primaryKey().autoIncrement())
|
|
||||||
.addColumn('host_token', 'varchar(50)', (col) => col.notNull().defaultTo(sql`gen_random_uuid()`))
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.server')
|
|
||||||
.addColumn('server_name', 'varchar(64)', (col) => col.notNull())
|
|
||||||
.addColumn('host_id', 'integer', (col) => col.notNull().references('ToneAPI.host.host_id'))
|
|
||||||
.addPrimaryKeyConstraint('server_pkey', ['server_name', 'host_id'])
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.match')
|
|
||||||
.addColumn('match_id', 'integer', (col) => col.notNull().primaryKey().autoIncrement())
|
|
||||||
.addColumn('host_id', 'integer', (col) => col.notNull().primaryKey())
|
|
||||||
.addColumn('server_name', 'varchar(64)', (col) => col.notNull())
|
|
||||||
.addColumn('game_map', 'varchar(30)', (col) => col.notNull())
|
|
||||||
.addColumn('gamemode', 'varchar(10)', (col) => col.notNull())
|
|
||||||
.addColumn('air_accel', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addForeignKeyConstraint('fk_match_host_of_server', ['host_id', 'server_name'], 'ToneAPI.server', ['host_id', 'server_name'])
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.player')
|
|
||||||
.addColumn('player_id', 'bigint', (col) => col.notNull().primaryKey())
|
|
||||||
.addColumn('player_name', 'varchar(50)', (col) => col.notNull())
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.weapon')
|
|
||||||
.addColumn('weapon_id', 'varchar(50)', (col) => col.notNull().primaryKey())
|
|
||||||
.addColumn('weapon_name', 'varchar(50)', (col) => col.notNull())
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.mods_on_weapon')
|
|
||||||
.addColumn('mod_id', 'integer', (col) => col.notNull().primaryKey())
|
|
||||||
.addColumn('speedloader', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('extra_ammo', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('gunrunner', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('gun_ready', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('quickswap', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('tactikill', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('suppressor', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('ricochet', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.addColumn('pro_screen', 'boolean', (col) => col.notNull().defaultTo(false))
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.titan_chassis')
|
|
||||||
.addColumn('titan_id', 'varchar(30)', (col) => col.notNull().primaryKey())
|
|
||||||
.addColumn('chassis_name', 'varchar(30)', (col) => col.notNull())
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.loadout')
|
|
||||||
.addColumn('loadout_id', 'integer', (col) => col.notNull().primaryKey().autoIncrement())
|
|
||||||
.addColumn('primary_weapon', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('primary_mod_id', 'integer', (col) => col.references('ToneAPI.mods_on_weapon.mod_id'))
|
|
||||||
.addColumn('secondary_weapon', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('secondary_mod_id', 'integer', (col) => col.references('ToneAPI.mods_on_weapon.mod_id'))
|
|
||||||
.addColumn('anti_titan_weapon', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('anti_titan_mod_id', 'integer', (col) => col.references('ToneAPI.mods_on_weapon.mod_id'))
|
|
||||||
.addColumn('ordnance', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('tactical', 'varchar(50)')
|
|
||||||
.addColumn('titan_weapon', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('pilot_passive_1', 'varchar(50)')
|
|
||||||
.addColumn('pilot_passive_2', 'varchar(50)')
|
|
||||||
.addColumn('titan_passive_1', 'varchar(50)')
|
|
||||||
.addColumn('titan_passive_2', 'varchar(50)')
|
|
||||||
.addColumn('titan_passive_3', 'varchar(50)')
|
|
||||||
.addColumn('titan_passive_4', 'varchar(50)')
|
|
||||||
.addColumn('titan_passive_5', 'varchar(50)')
|
|
||||||
.addColumn('titan_passive_6', 'varchar(50)')
|
|
||||||
.addColumn('titan_special', 'varchar(50)')
|
|
||||||
.addColumn('titan_anti_rodeo', 'varchar(50)')
|
|
||||||
.addColumn('titan_primary_mod', 'varchar(50)')
|
|
||||||
.addColumn('titan_id', 'varchar(50)', (col) => col.references('ToneAPI.titan_chassis.titan_id'))
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.kill')
|
|
||||||
.addColumn('kill_id', 'bigint', (col) => col.notNull().primaryKey().autoIncrement())
|
|
||||||
.addColumn('attacker_id', 'bigint', (col) => col.notNull().references('ToneAPI.player.player_id'))
|
|
||||||
.addColumn('victim_id', 'bigint', (col) => col.notNull().references('ToneAPI.player.player_id'))
|
|
||||||
.addColumn('match_id', 'integer', (col) => col.notNull().references('ToneAPI.match.match_id'))
|
|
||||||
.addColumn('attacker_loadout_id', 'integer', (col) => col.notNull().references('ToneAPI.loadout.loadout_id'))
|
|
||||||
.addColumn('victim_loadout_id', 'integer', (col) => col.notNull().references('ToneAPI.loadout.loadout_id'))
|
|
||||||
.addColumn('attacker_speed', 'integer')
|
|
||||||
.addColumn('victim_speed', 'integer')
|
|
||||||
.addColumn('attacker_movementstate', 'varchar(50)')
|
|
||||||
.addColumn('victim_movementstate', 'varchar(50)')
|
|
||||||
.addColumn('distance', 'integer')
|
|
||||||
.addColumn('unix_time', 'timestamp')
|
|
||||||
.addColumn('game_time', 'decimal')
|
|
||||||
.addColumn('cause_of_death', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('attacker_held_weapon', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('victim_held_weapon', 'varchar(50)', (col) => col.references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.titan_stats_in_match')
|
|
||||||
.addColumn('match_id', 'integer', (col) => col.notNull().references('ToneAPI.match.match_id'))
|
|
||||||
.addColumn('player_id', 'bigint', (col) => col.notNull().references('ToneAPI.player.player_id'))
|
|
||||||
.addColumn('titan_id', 'varchar(50)', (col) => col.notNull().references('ToneAPI.titan_chassis.titan_id'))
|
|
||||||
.addColumn('playtime', 'bigint')
|
|
||||||
.addColumn('shots_fired', 'integer')
|
|
||||||
.addColumn('shots_hit', 'integer')
|
|
||||||
.addColumn('headshots', 'integer')
|
|
||||||
.addPrimaryKeyConstraint('titan_stats_in_match_pkey', ['match_id', 'player_id', 'titan_id'])
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.weapon_stats_in_match')
|
|
||||||
.addColumn('match_id', 'integer', (col) => col.notNull().references('ToneAPI.match.match_id'))
|
|
||||||
.addColumn('player_id', 'bigint', (col) => col.notNull().references('ToneAPI.player.player_id'))
|
|
||||||
.addColumn('weapon_id', 'varchar(50)', (col) => col.notNull().references('ToneAPI.weapon.weapon_id'))
|
|
||||||
.addColumn('playtime', 'bigint')
|
|
||||||
.addColumn('shots_fired', 'integer')
|
|
||||||
.addColumn('shots_hit', 'integer')
|
|
||||||
.addColumn('headshots', 'integer')
|
|
||||||
.addColumn('ricochets', 'integer')
|
|
||||||
.addPrimaryKeyConstraint('weapon_stats_in_match_pkey', ['match_id', 'player_id', 'weapon_id'])
|
|
||||||
.execute()
|
|
||||||
|
|
||||||
await db.schema.createTable('ToneAPI.player_stats_in_match')
|
|
||||||
.addColumn('match_id', 'integer', (col) => col.notNull().references('ToneAPI.match.match_id'))
|
|
||||||
.addColumn('player_id', 'bigint', (col) => col.notNull().references('ToneAPI.player.player_id'))
|
|
||||||
.addColumn('shots_fired', 'integer')
|
|
||||||
.addColumn('shots_hit', 'integer')
|
|
||||||
.addColumn('headshots', 'integer')
|
|
||||||
.addColumn('ricochets', 'integer')
|
|
||||||
.addColumn('overall_distance_covered', 'bigint')
|
|
||||||
.addColumn('time_grounded', 'bigint')
|
|
||||||
.addColumn('time_wall', 'bigint')
|
|
||||||
.addColumn('time_air', 'bigint')
|
|
||||||
.addPrimaryKeyConstraint('playerstats_in_match_pkey', ['match_id', 'player_id'])
|
|
||||||
.execute()
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function down (db: Kysely<any>): Promise<void> {
|
|
||||||
|
|
||||||
}
|
|
||||||
-160
@@ -1,160 +0,0 @@
|
|||||||
import { type Generated } from 'kysely'
|
|
||||||
|
|
||||||
interface HostTable {
|
|
||||||
host_name: string
|
|
||||||
host_id: Generated<number>
|
|
||||||
host_token: Generated<string>
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ServerTable {
|
|
||||||
server_name: string
|
|
||||||
host_id: number
|
|
||||||
}
|
|
||||||
|
|
||||||
interface MatchTable {
|
|
||||||
match_id: Generated<number>
|
|
||||||
host_id: number
|
|
||||||
server_name: string
|
|
||||||
game_map: string
|
|
||||||
gamemode: string
|
|
||||||
air_accel: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
interface PlayerTable {
|
|
||||||
weapon_id: string
|
|
||||||
weapon_name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
interface WeaponTable {
|
|
||||||
playername: string
|
|
||||||
player_id: number
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ModsOnWeaponTable {
|
|
||||||
mod_id: number
|
|
||||||
speedloader: boolean
|
|
||||||
extra_ammo: boolean
|
|
||||||
gunrunner: boolean
|
|
||||||
gun_ready: boolean
|
|
||||||
quickswap: boolean
|
|
||||||
tactikill: boolean
|
|
||||||
suppressor: boolean
|
|
||||||
ricochet: boolean
|
|
||||||
pro_screen: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
interface TitanChassisTable {
|
|
||||||
titan_id: string
|
|
||||||
chassis_name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
interface LoadoutTable {
|
|
||||||
loadout_id: Generated<number>
|
|
||||||
primary_weapon: string
|
|
||||||
secondary_weapon: string
|
|
||||||
anti_titan_weapon: string
|
|
||||||
primary_mod_id: number
|
|
||||||
secondary_mod_id: number
|
|
||||||
anti_titan_mod_id: number
|
|
||||||
ordnance: string
|
|
||||||
tactical: string
|
|
||||||
titan_weapon: string
|
|
||||||
pilot_passive_1: string
|
|
||||||
pilot_passive_2: string
|
|
||||||
titan_passive_1: string
|
|
||||||
titan_passive_2: string
|
|
||||||
titan_passive_3: string
|
|
||||||
titan_passive_4: string
|
|
||||||
titan_passive_5: string
|
|
||||||
titan_passive_6: string
|
|
||||||
titan_special: string
|
|
||||||
titan_anti_rodeo: string
|
|
||||||
titan_primary_mod: string
|
|
||||||
titan_id: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface KillTable {
|
|
||||||
kill_id: Generated<bigint>
|
|
||||||
attacker_id: bigint
|
|
||||||
victim_id: bigint
|
|
||||||
match_id: number
|
|
||||||
attacker_loadout_id: number
|
|
||||||
victim_loadout_id: number
|
|
||||||
attacker_speed: number
|
|
||||||
victim_speed: number
|
|
||||||
attacker_movementstate: string
|
|
||||||
victim_movementstate: string
|
|
||||||
distance: number
|
|
||||||
unix_time: Date
|
|
||||||
game_time: number
|
|
||||||
cause_of_death: string
|
|
||||||
attacker_held_weapon: string
|
|
||||||
victim_held_weapon: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TitanStatsInMatchTable {
|
|
||||||
match_id: number
|
|
||||||
player_id: bigint
|
|
||||||
titan_id: string
|
|
||||||
playtime: bigint
|
|
||||||
shots_fired: number
|
|
||||||
shots_hit: number
|
|
||||||
headshots: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface WeaponStatsInMatchTable {
|
|
||||||
match_id: number
|
|
||||||
player_id: bigint
|
|
||||||
weapon_id: string
|
|
||||||
playtime: bigint
|
|
||||||
shots_fired: number
|
|
||||||
shots_hit: number
|
|
||||||
headshots: number
|
|
||||||
ricochets: number
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PlayerStatsInMatchTable {
|
|
||||||
match_id: number
|
|
||||||
player_id: bigint
|
|
||||||
shots_fired: number
|
|
||||||
shots_hit: number
|
|
||||||
headshots: number
|
|
||||||
ricochets: number
|
|
||||||
overall_distance_covered: bigint
|
|
||||||
time_grounded: bigint
|
|
||||||
time_wall: bigint
|
|
||||||
time_air: bigint
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface KillViewTable {
|
|
||||||
kills: number
|
|
||||||
deaths: number
|
|
||||||
deaths_with_weapon: number
|
|
||||||
attacker_id: number
|
|
||||||
attacker_name: string
|
|
||||||
map: string
|
|
||||||
game_mode: string
|
|
||||||
cause_of_death: string
|
|
||||||
servername: string
|
|
||||||
host: number
|
|
||||||
max_distance: number
|
|
||||||
total_distance: number
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Database {
|
|
||||||
kill_view: KillViewTable
|
|
||||||
host: HostTable
|
|
||||||
server: ServerTable
|
|
||||||
match: MatchTable
|
|
||||||
player: PlayerTable
|
|
||||||
weapon: WeaponTable
|
|
||||||
mods_on_weapon: ModsOnWeaponTable
|
|
||||||
titan_chassis: TitanChassisTable
|
|
||||||
loadout: LoadoutTable
|
|
||||||
kill: KillTable
|
|
||||||
titan_stats_in_match: TitanStatsInMatchTable
|
|
||||||
weapon_stats_in_match: WeaponStatsInMatchTable
|
|
||||||
player_stats_in_match: PlayerStatsInMatchTable
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Database
|
|
||||||
Reference in New Issue
Block a user