Implement basic service and api for accounts

This commit is contained in:
Dominic Ferrando
2026-08-15 14:53:36 -04:00
parent 2d20f5e893
commit e96c40c9c7
3 changed files with 109 additions and 7 deletions
+73
View File
@@ -0,0 +1,73 @@
import { Activity, Gender, type Player } from "@blade-and-brawn/domain";
import { db } from "../database/db";
import type { CalculatorService } from "./calculator";
import { Value } from "@sinclair/typebox/value";
import { t } from "elysia";
export class AccountsService {
constructor(private Calculator: CalculatorService) { }
async get(id: string) {
return await (db).selectFrom("accounts")
.selectAll()
.where("id", "=", id)
.executeTakeFirst();
}
async stats(id: string) {
const latestAssessment = await db.selectFrom("accounts")
.innerJoin("assessments", "assessments.account_id", "accounts.id")
.select([
"assessments.age", "assessments.gender", "assessments.weight", "assessments.name",
"assessments.perf_back_squat", "assessments.perf_bench_press", "assessments.perf_broad_jump",
"assessments.perf_cone_drill", "assessments.perf_deadlift", "assessments.perf_run"
])
.where("accounts.id", "=", id)
.orderBy("assessments.created_at", "desc")
.limit(1)
.executeTakeFirst();
if (!latestAssessment) return;
Value.Assert(t.Enum(Gender), latestAssessment.gender);
return this.Calculator.calculate(
{
name: latestAssessment.name,
metrics: {
age: latestAssessment.age,
weight: latestAssessment.weight,
gender: latestAssessment.gender
}
},
[
// Strength
{
activity: Activity.BenchPress,
performance: latestAssessment.perf_bench_press ?? 0
},
{
activity: Activity.Deadlift,
performance: latestAssessment.perf_deadlift ?? 0
},
{
activity: Activity.BackSquat,
performance: latestAssessment.perf_back_squat ?? 0
},
// Power
{
activity: Activity.BroadJump,
performance: latestAssessment.perf_broad_jump ?? 0
},
// Endurance
{
activity: Activity.Run,
performance: latestAssessment.perf_run ?? 0
},
// Agility
{
activity: Activity.ConeDrill,
performance: latestAssessment.perf_cone_drill ?? 0
},
]
);
}
}