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:
parent
dbc12ac816
commit
268997a009
4 changed files with 54 additions and 49 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
}));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue