diff --git a/routes/mine_route.js b/routes/mine_route.js index d84d83b..d2ddd04 100644 --- a/routes/mine_route.js +++ b/routes/mine_route.js @@ -1,7 +1,7 @@ const express = require("express"); -const router = require("express").Router(); -const db = require("../database/database"); -const auth = require("../middleware/auth"); +const router = require("express").Router(); +const db = require("../database/database"); +const auth = require("../middleware/auth"); /* ───────────────────────────────────────── HELPER: Timer sicherstellen @@ -12,12 +12,12 @@ const auth = require("../middleware/auth"); async function ensureTimer(userBuildingId) { const [[existing]] = await db.query( "SELECT last_collected FROM building_collect_timer WHERE user_building_id = ?", - [userBuildingId] + [userBuildingId], ); if (!existing) { await db.query( "INSERT INTO building_collect_timer (user_building_id, last_collected) VALUES (?, NOW())", - [userBuildingId] + [userBuildingId], ); } } @@ -45,7 +45,7 @@ async function loadMineData(userId, buildingId) { WHERE ub.user_id = ? AND ub.building_id = ? `, - [userId, buildingId] + [userId, buildingId], ); return rows; } @@ -54,14 +54,14 @@ async function loadMineData(userId, buildingId) { GET /api/mine/:buildingId/status ───────────────────────────────────────── */ router.get("/:buildingId/status", auth, async (req, res) => { - const userId = req.session.user.id; + const userId = req.session.user.id; const buildingId = req.params.buildingId; try { // user_building holen const [[userBuilding]] = await db.query( "SELECT id, level FROM user_buildings WHERE user_id = ? AND building_id = ?", - [userId, buildingId] + [userId, buildingId], ); if (!userBuilding) { @@ -78,31 +78,32 @@ router.get("/:buildingId/status", auth, async (req, res) => { const { cycle_seconds, last_collected, level } = rows[0]; - const elapsed = Math.floor((Date.now() - new Date(last_collected).getTime()) / 1000); - const cycles = Math.floor(elapsed / cycle_seconds); - const nextIn = cycle_seconds - (elapsed % cycle_seconds); + const elapsed = Math.floor( + (Date.now() - new Date(last_collected).getTime()) / 1000, + ); + const cycles = Math.floor(elapsed / cycle_seconds); + const nextIn = cycle_seconds - (elapsed % cycle_seconds); const available = rows.map((r) => ({ resource: r.resource, - amount: r.amount * cycles, + amount: r.amount * cycles, })); const production = rows.map((r) => ({ resource: r.resource, - amount: r.amount, + amount: r.amount, })); res.json({ level, cycles, - ready: cycles > 0, + ready: cycles > 0, available, production, last_collected, next_cycle_in_seconds: nextIn, cycle_seconds, }); - } catch (err) { console.error(err); res.status(500).json({ error: "DB Fehler" }); @@ -114,14 +115,14 @@ router.get("/:buildingId/status", auth, async (req, res) => { Ressourcen gutschreiben + Timer reset ───────────────────────────────────────── */ router.post("/:buildingId/collect", auth, async (req, res) => { - const userId = req.session.user.id; + const userId = req.session.user.id; const buildingId = req.params.buildingId; try { // user_building holen const [[userBuilding]] = await db.query( "SELECT id FROM user_buildings WHERE user_id = ? AND building_id = ?", - [userId, buildingId] + [userId, buildingId], ); if (!userBuilding) { @@ -138,55 +139,65 @@ router.post("/:buildingId/collect", auth, async (req, res) => { const { user_building_id, cycle_seconds, last_collected } = rows[0]; - const elapsed = Math.floor((Date.now() - new Date(last_collected).getTime()) / 1000); - const cycles = Math.floor(elapsed / cycle_seconds); + const elapsed = Math.floor( + (Date.now() - new Date(last_collected).getTime()) / 1000, + ); + const cycles = Math.floor(elapsed / cycle_seconds); if (cycles < 1) { const waitSeconds = cycle_seconds - elapsed; - const minutes = Math.floor(waitSeconds / 60); - const seconds = waitSeconds % 60; + const minutes = Math.floor(waitSeconds / 60); + const seconds = waitSeconds % 60; return res.json({ - error: "Noch nichts bereit", + error: "Noch nichts bereit", ready_in_seconds: waitSeconds, ready_in_display: `${minutes}m ${seconds}s`, }); } - // ── Alle Ressourcen atomar in EINEM Query schreiben ────────────── - // Verhindert inkonsistente Zustände bei Verbindungsabbrüchen - const setClauses = rows - .map((r) => `\`${r.resource}\` = \`${r.resource}\` + ${r.amount * cycles}`) - .join(", "); + // Jede Ressource einzeln gutschreiben + const allowedResources = [ + "gold", + "silver", + "copper", + "iron", + "wood", + "stone", + "gems", + ]; - await db.query( - `INSERT INTO account_currency (account_id) - VALUES (?) - ON DUPLICATE KEY UPDATE ${setClauses}`, - [userId] - ); + for (const row of rows) { + if (!allowedResources.includes(row.resource)) continue; + + const toAdd = row.amount * cycles; + + await db.query( + `UPDATE account_currency SET \`${row.resource}\` = \`${row.resource}\` + ? WHERE account_id = ?`, + [toAdd, userId], + ); + } // Timer zuruecksetzen: last_collected um genau die abgeschlossenen // Zyklen vorruecken – Restsekunden bleiben erhalten, kein Verlust const newLastCollected = new Date( - new Date(last_collected).getTime() + cycles * cycle_seconds * 1000 + new Date(last_collected).getTime() + cycles * cycle_seconds * 1000, ); await db.query( "UPDATE building_collect_timer SET last_collected = ? WHERE user_building_id = ?", - [newLastCollected, user_building_id] + [newLastCollected, user_building_id], ); const collected = rows.map((r) => ({ resource: r.resource, - amount: r.amount * cycles, + amount: r.amount * cycles, })); res.json({ success: true, cycles, collected }); - } catch (err) { console.error(err); res.status(500).json({ error: "DB Fehler" }); } }); -module.exports = router; \ No newline at end of file +module.exports = router;