import { and, eq, sql } from 'drizzle-orm'; import useDatabase from '~/composables/useDatabase'; import { characterTable } from '~/db/schema'; import { group } from '~/shared/general.util'; import type { Character, DoubleIndex, Level, MainStat, TrainingLevel } from '~/types/character'; export default defineEventHandler(async (e) => { const id = getRouterParam(e, "id"); if(!id) { setResponseStatus(e, 400); return; } const session = await getUserSession(e); if(!session.user) { setResponseStatus(e, 401); return; } const db = useDatabase(); const character = db.query.characterTable.findFirst({ with: { abilities: true, levels: true, modifiers: true, spells: true, training: true, user: { columns: { username: true } } }, where: (character, { eq, and }) => and(eq(character.id, parseInt(id, 10)), eq(characterTable.owner, session.user!.id)), }).sync(); if(character !== undefined) { return { id: character.id, name: character.name, people: character.people, level: character.level, aspect: character.aspect, notes: character.notes, health: character.health, mana: character.mana, training: character.training.reduce((p, v) => { if(!(v.stat in p)) p[v.stat] = []; p[v.stat].push([v.level as TrainingLevel, v.choice]); return p; }, {} as Record[]>), leveling: character.levels.map(e => [e.level as Level, e.choice] as DoubleIndex), abilities: group(character.abilities.map(e => ({ ...e, value: [e.value, e.max] as [number, number] })), "ability", "value"), spells: character.spells.map(e => e.value), modifiers: group(character.modifiers, "modifier", "value"), owner: character.owner, username: character.user.username, visibility: character.visibility, } as Character; } setResponseStatus(e, 404); return; });