From ec75add5b71213397197f30f7e49f94b6cbfdfd7 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sat, 11 Apr 2026 00:16:18 -0400 Subject: [PATCH] fix: correct character:updated broadcast payload and existence check order - Broadcast enriched DB row (with parsed overrides) instead of raw req.body - Check affectedRows from UPDATE to detect missing characters before SELECT - Import ExecuteValues from mysql2 at the top level instead of inline cast --- server/src/routes/characters.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/server/src/routes/characters.ts b/server/src/routes/characters.ts index 13ab179..19d40b6 100644 --- a/server/src/routes/characters.ts +++ b/server/src/routes/characters.ts @@ -1,6 +1,6 @@ import { Router } from "express"; import type { ParamsDictionary } from "express-serve-static-core"; -import type { RowDataPacket, ResultSetHeader } from "mysql2"; +import type { RowDataPacket, ResultSetHeader, ExecuteValues } from "mysql2"; import type { Server } from "socket.io"; import db from "../db.js"; import { broadcastToCampaign } from "../socket.js"; @@ -156,23 +156,25 @@ router.patch("/:id", async (req, res) => { } values.push(id); - await db.execute(`UPDATE characters SET ${updates.join(", ")} WHERE id = ?`, values as import("mysql2").ExecuteValues); + const [updateResult] = await db.execute(`UPDATE characters SET ${updates.join(", ")} WHERE id = ?`, values as ExecuteValues); + if (updateResult.affectedRows === 0) { + res.status(404).json({ error: "Character not found" }); + return; + } const [rows] = await db.execute( "SELECT * FROM characters WHERE id = ?", [id] ); - if (rows.length === 0) { - res.status(404).json({ error: "Character not found" }); - return; - } + + const enriched = { + ...rows[0], + overrides: parseJson(rows[0].overrides), + }; const io: Server = req.app.get("io"); - broadcastToCampaign(io, Number(rows[0].campaign_id), "character:updated", { - id: Number(id), - ...req.body, - }); - res.json(rows[0]); + broadcastToCampaign(io, Number(rows[0].campaign_id), "character:updated", enriched); + res.json(enriched); } catch (err) { console.error(err); res.status(500).json({ error: "Internal server error" });