import { eq } from 'drizzle-orm'; import useDatabase from '~/composables/useDatabase'; import { characterAbilitiesTable, characterLevelingTable, characterModifiersTable, characterSpellsTable, characterTable, characterTrainingTable } from '~/db/schema'; export default defineEventHandler(async (e) => { const id = getRouterParam(e, "id"); if(!id) { setResponseStatus(e, 400); return; } const db = useDatabase(); const old = db.select().from(characterTable).where(eq(characterTable.id, parseInt(id, 10))).get(); if(!old) { setResponseStatus(e, 404); return; } const session = await getUserSession(e); if(!session.user || old.owner !== session.user.id || session.user.state !== 1) { setResponseStatus(e, 401); return; } try { const _id = db.transaction((tx) => { const _id = tx.insert(characterTable).values({ name: old.name, owner: session.user!.id, people: old.people!, level: old.level, aspect: old.aspect, notes: old.notes, health: old.health, mana: old.mana, visibility: old.visibility, thumbnail: old.thumbnail, }).returning({ id: characterTable.id }).get().id; const leveling = tx.select().from(characterLevelingTable).where(eq(characterLevelingTable.character, parseInt(id, 10))).all(); if(leveling.length > 0) tx.insert(characterLevelingTable).values(leveling.map(e => ({ character: _id, level: e.level, choice: e.choice }))).run(); const training = tx.select().from(characterTrainingTable).where(eq(characterTrainingTable.character, parseInt(id, 10))).all(); if(training.length > 0) tx.insert(characterTrainingTable).values(training.map(e => ({ character: _id, stat: e.stat, level: e.level, choice: e.choice }))).run(); const modifiers = tx.select().from(characterModifiersTable).where(eq(characterModifiersTable.character, parseInt(id, 10))).all(); if(modifiers.length > 0) tx.insert(characterModifiersTable).values(modifiers.map(e => ({ character: _id, modifier: e.modifier, value: e.value }))).run(); const spells = tx.select().from(characterSpellsTable).where(eq(characterSpellsTable.character, parseInt(id, 10))).all(); if(spells.length > 0) tx.insert(characterSpellsTable).values(spells.map(e => ({ character: _id, value: e.value }))).run(); const abilities = tx.select().from(characterAbilitiesTable).where(eq(characterAbilitiesTable.character, parseInt(id, 10))).all(); if(abilities.length > 0) tx.insert(characterAbilitiesTable).values(abilities.map(e => ({ character: _id, ability: e.ability, value: e.value, max: e.max }))).run(); return _id; }); setResponseStatus(e, 201); return _id; } catch(_e) { setResponseStatus(e, 201); throw _e; } });