feat: convert campaigns, game-items, game-talents, rolls routes to async mysql2

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Aaron Wood 2026-04-11 00:09:46 -04:00
parent dbc12ac816
commit 268997a009
4 changed files with 54 additions and 49 deletions

View file

@ -1,50 +1,55 @@
import { Router } from "express";
import type { RowDataPacket, ResultSetHeader } from "mysql2";
import db from "../db.js";
const router = Router();
// GET /api/campaigns — list all campaigns
router.get("/", (_req, res) => {
const campaigns = db
.prepare("SELECT * FROM campaigns ORDER BY created_at DESC")
.all();
res.json(campaigns);
// GET /api/campaigns
router.get("/", async (_req, res) => {
const [rows] = await db.execute<RowDataPacket[]>(
"SELECT * FROM campaigns ORDER BY created_at DESC"
);
res.json(rows);
});
// POST /api/campaigns — create a campaign
router.post("/", (req, res) => {
// POST /api/campaigns
router.post("/", async (req, res) => {
const { name } = req.body;
if (!name || !name.trim()) {
if (!name?.trim()) {
res.status(400).json({ error: "Campaign name is required" });
return;
}
const result = db
.prepare("INSERT INTO campaigns (name) VALUES (?)")
.run(name.trim());
const campaign = db
.prepare("SELECT * FROM campaigns WHERE id = ?")
.get(result.lastInsertRowid);
res.status(201).json(campaign);
const [result] = await db.execute<ResultSetHeader>(
"INSERT INTO campaigns (name) VALUES (?)",
[name.trim()]
);
const [rows] = await db.execute<RowDataPacket[]>(
"SELECT * FROM campaigns WHERE id = ?",
[result.insertId]
);
res.status(201).json(rows[0]);
});
// GET /api/campaigns/:id — get a single campaign
router.get("/:id", (req, res) => {
const campaign = db
.prepare("SELECT * FROM campaigns WHERE id = ?")
.get(req.params.id);
if (!campaign) {
// GET /api/campaigns/:id
router.get("/:id", async (req, res) => {
const [rows] = await db.execute<RowDataPacket[]>(
"SELECT * FROM campaigns WHERE id = ?",
[req.params.id]
);
if (rows.length === 0) {
res.status(404).json({ error: "Campaign not found" });
return;
}
res.json(campaign);
res.json(rows[0]);
});
// DELETE /api/campaigns/:id — delete a campaign (cascades to characters)
router.delete("/:id", (req, res) => {
const result = db
.prepare("DELETE FROM campaigns WHERE id = ?")
.run(req.params.id);
if (result.changes === 0) {
// DELETE /api/campaigns/:id
router.delete("/:id", async (req, res) => {
const [result] = await db.execute<ResultSetHeader>(
"DELETE FROM campaigns WHERE id = ?",
[req.params.id]
);
if (result.affectedRows === 0) {
res.status(404).json({ error: "Campaign not found" });
return;
}

View file

@ -1,13 +1,14 @@
import { Router } from "express";
import type { RowDataPacket } from "mysql2";
import db from "../db.js";
const router = Router();
router.get("/", (_req, res) => {
const items = db
.prepare("SELECT * FROM game_items ORDER BY type, name")
.all() as Array<Record<string, unknown>>;
const parsed = items.map((item) => ({
router.get("/", async (_req, res) => {
const [rows] = await db.execute<RowDataPacket[]>(
"SELECT * FROM game_items ORDER BY type, name"
);
const parsed = rows.map((item) => ({
...item,
effects: JSON.parse(item.effects as string),
properties: JSON.parse(item.properties as string),

View file

@ -1,13 +1,14 @@
import { Router } from "express";
import type { RowDataPacket } from "mysql2";
import db from "../db.js";
const router = Router();
router.get("/", (_req, res) => {
const talents = db
.prepare("SELECT * FROM game_talents ORDER BY source, name")
.all() as Array<Record<string, unknown>>;
const parsed = talents.map((t) => ({
router.get("/", async (_req, res) => {
const [rows] = await db.execute<RowDataPacket[]>(
"SELECT * FROM game_talents ORDER BY source, name"
);
const parsed = rows.map((t) => ({
...t,
effect: JSON.parse(t.effect as string),
}));

View file

@ -1,24 +1,22 @@
import { Router } from "express";
import type { RowDataPacket } from "mysql2";
import db from "../db.js";
const router = Router({ mergeParams: true });
router.get("/", (req, res) => {
const { campaignId } = req.params;
const rolls = db
.prepare(
router.get("/", async (req: any, res) => {
const { campaignId } = req.params as { campaignId: string };
const [rows] = await db.execute<RowDataPacket[]>(
"SELECT * FROM roll_log WHERE campaign_id = ? ORDER BY created_at DESC LIMIT 50",
)
.all(campaignId) as Array<Record<string, unknown>>;
const parsed = rolls.map((r) => ({
[campaignId]
);
const parsed = rows.map((r) => ({
...r,
rolls: JSON.parse(r.rolls as string),
advantage: r.advantage === 1,
disadvantage: r.disadvantage === 1,
nat20: r.nat20 === 1,
}));
res.json(parsed);
});