Files
djhackersdev_minime/src/idz/db/timeAttack.ts
T
2019-11-06 17:28:30 -05:00

91 lines
2.5 KiB
TypeScript

import { Client } from "pg";
import * as sql from "sql-bricks";
import { _findProfile } from "./_util";
import { ExtId } from "../model/base";
import { Profile } from "../model/profile";
import { TimeAttackScore } from "../model/timeAttack";
import { TimeAttackRepository } from "../repo";
import { generateId } from "../../db";
export class SqlTimeAttackRepository implements TimeAttackRepository {
constructor(private readonly _conn: Client) {}
async loadAll(extId: ExtId<Profile>): Promise<TimeAttackScore[]> {
const loadSql = sql
.select("ta.*")
.from("idz.time_attack ta")
.join("idz.profile p", { "ta.profile_id": "p.id" })
.where("p.ext_id", extId)
.toParams();
const { rows } = await this._conn.query(loadSql);
return rows.map(row => ({
routeNo: row.route_no,
timestamp: new Date(row.timestamp),
flags: row.flags,
totalTime: row.total_time,
sectionTimes: row.section_times,
grade: row.grade,
}));
}
async save(extId: ExtId<Profile>, score: TimeAttackScore): Promise<void> {
const profileId = await _findProfile(this._conn, extId);
const logSql = sql
.insert("idz.ta_result", {
id: generateId(),
profile_id: profileId,
route_no: score.routeNo,
total_time: score.totalTime,
section_times: score.sectionTimes,
flags: score.flags,
grade: score.grade,
})
.toParams();
await this._conn.query(logSql);
const existSql = sql
.select("ta.total_time")
.from("idz.ta_best ta")
.where("ta.profile_id", profileId)
.where("ta.route_no", score.routeNo)
.toParams();
const { rows } = await this._conn.query(existSql);
const row = rows[0];
if (row === undefined) {
const insertSql = sql
.insert("idz.ta_best", {
id: generateId(),
profile_id: profileId,
route_no: score.routeNo,
total_time: score.totalTime,
section_times: score.sectionTimes,
flags: score.flags,
grade: score.grade,
})
.toParams();
await this._conn.query(insertSql);
} else if (row.total_time > score.totalTime) {
const updateSql = sql
.update("idz.ta_best", {
total_time: score.totalTime,
section_times: score.sectionTimes,
flags: score.flags,
grade: score.grade,
})
.where("profile_id", profileId)
.where("route_no", score.routeNo)
.toParams();
await this._conn.query(updateSql);
}
}
}