feat: wallet balances grouped by user with split layout

- Left sidebar: user list with ID, username, status icon, wallet count
- Right panel: selected user's balances + crypto wallet table
- Fix inverted status logic (0=Active, 1=Deleted, 2=Blocked)
- Admin bot: block/unblock toggle based on current user status
- Seed data: set active users to status=0 instead of status=1
- Toggle-status route: 0↔2 instead of 1↔0
This commit is contained in:
NW
2026-06-23 12:41:18 +01:00
parent 7b247075a0
commit b6f21222e7
7 changed files with 194 additions and 41 deletions

View File

@@ -1,14 +1,32 @@
import { Router } from 'express';
import db from '../../config/database.js';
import { renderWalletList } from '../views/wallets.js';
import { renderWalletLayout } from '../views/wallets.js';
const router = Router();
router.get('/', async (req, res) => {
const wallets = await db.allAsync(
'SELECT * FROM crypto_wallets ORDER BY id DESC LIMIT 200'
const users = await db.allAsync(
`SELECT u.id, u.telegram_id, u.username, u.status, u.total_balance, u.bonus_balance,
COUNT(w.id) AS wallet_count
FROM users u
LEFT JOIN crypto_wallets w ON w.user_id = u.id AND w.wallet_type NOT LIKE '%#_%' ESCAPE '#'
GROUP BY u.id
ORDER BY u.id DESC`
);
res.send(renderWalletList(wallets));
const selectedId = req.query.user ? parseInt(req.query.user, 10) : (users.length > 0 ? users[0].id : null);
let wallets = [];
let selectedUser = null;
if (selectedId) {
selectedUser = await db.getAsync('SELECT * FROM users WHERE id = ?', [selectedId]);
wallets = await db.allAsync(
`SELECT * FROM crypto_wallets WHERE user_id = ? AND wallet_type NOT LIKE '%#_%' ESCAPE '#' ORDER BY wallet_type`,
[selectedId]
);
}
res.send(renderWalletLayout(users, selectedUser, wallets));
});
export default router;
export default router;