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:
@@ -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;
|
||||
Reference in New Issue
Block a user