update nice visuel
This commit is contained in:
+37
-46
@@ -4,8 +4,7 @@ import { requireAuth, publicUser } from '../middleware.js';
|
||||
import {
|
||||
maxVaultSlots,
|
||||
settleVaultYield,
|
||||
summarizeVaultRates,
|
||||
estimatePendingYield,
|
||||
summarizeVaultState,
|
||||
} from '../vault.js';
|
||||
import { isConnected } from '../presence.js';
|
||||
|
||||
@@ -18,6 +17,8 @@ router.post('/stake', requireAuth, async (req, res) => {
|
||||
return res.status(400).json({ error: 'Select at least one item to stake' });
|
||||
}
|
||||
|
||||
const mode = isConnected(req.session.userId) ? 'online' : 'offline';
|
||||
|
||||
const result = await prisma.$transaction(async (tx) => {
|
||||
const user = await tx.user.findUnique({ where: { id: req.session.userId } });
|
||||
if (!user) {
|
||||
@@ -61,16 +62,31 @@ router.post('/stake', requireAuth, async (req, res) => {
|
||||
},
|
||||
});
|
||||
|
||||
return { user, stakedIds: ids, maxSlots, used: used + ids.length };
|
||||
// Shared timer: start only when vault was empty
|
||||
let updatedUser = user;
|
||||
if (used === 0 || !user.vaultYieldAt) {
|
||||
updatedUser = await tx.user.update({
|
||||
where: { id: user.id },
|
||||
data: { vaultYieldAt: now },
|
||||
});
|
||||
}
|
||||
|
||||
const staked = await tx.inventoryItem.findMany({
|
||||
where: { userId: user.id, staked: true },
|
||||
include: { item: true },
|
||||
});
|
||||
|
||||
return {
|
||||
user: updatedUser,
|
||||
stakedIds: ids,
|
||||
vault: summarizeVaultState(updatedUser, staked, mode),
|
||||
};
|
||||
});
|
||||
|
||||
res.json({
|
||||
user: publicUser(result.user),
|
||||
stakedIds: result.stakedIds,
|
||||
vault: {
|
||||
used: result.used,
|
||||
slots: result.maxSlots,
|
||||
},
|
||||
vault: result.vault,
|
||||
});
|
||||
} catch (err) {
|
||||
const status = err.status || 500;
|
||||
@@ -86,7 +102,6 @@ router.post('/unstake', requireAuth, async (req, res) => {
|
||||
return res.status(400).json({ error: 'Select at least one item to unstake' });
|
||||
}
|
||||
|
||||
// Settle yield before unstake (online if connected, else offline)
|
||||
const mode = isConnected(req.session.userId) ? 'online' : 'offline';
|
||||
const settled = await settleVaultYield(req.session.userId, mode);
|
||||
|
||||
@@ -120,16 +135,25 @@ router.post('/unstake', requireAuth, async (req, res) => {
|
||||
},
|
||||
});
|
||||
|
||||
const used = await tx.inventoryItem.count({
|
||||
const remaining = await tx.inventoryItem.findMany({
|
||||
where: { userId: user.id, staked: true },
|
||||
include: { item: true },
|
||||
});
|
||||
|
||||
const refreshed = await tx.user.findUnique({ where: { id: user.id } });
|
||||
let refreshed = user;
|
||||
if (remaining.length === 0 && user.vaultYieldAt) {
|
||||
refreshed = await tx.user.update({
|
||||
where: { id: user.id },
|
||||
data: { vaultYieldAt: null },
|
||||
});
|
||||
} else {
|
||||
refreshed = await tx.user.findUnique({ where: { id: user.id } });
|
||||
}
|
||||
|
||||
return {
|
||||
user: refreshed,
|
||||
unstakedIds: ids,
|
||||
maxSlots: maxVaultSlots(refreshed),
|
||||
used,
|
||||
vault: summarizeVaultState(refreshed, remaining, mode),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -137,10 +161,7 @@ router.post('/unstake', requireAuth, async (req, res) => {
|
||||
user: publicUser(result.user),
|
||||
unstakedIds: result.unstakedIds,
|
||||
yieldCredited: settled.credited,
|
||||
vault: {
|
||||
used: result.used,
|
||||
slots: result.maxSlots,
|
||||
},
|
||||
vault: result.vault,
|
||||
});
|
||||
} catch (err) {
|
||||
const status = err.status || 500;
|
||||
@@ -149,34 +170,4 @@ router.post('/unstake', requireAuth, async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
router.post('/claim', requireAuth, async (req, res) => {
|
||||
try {
|
||||
const mode = isConnected(req.session.userId) ? 'online' : 'offline';
|
||||
const settled = await settleVaultYield(req.session.userId, mode);
|
||||
const user = await prisma.user.findUnique({ where: { id: req.session.userId } });
|
||||
if (!user) return res.status(404).json({ error: 'User not found' });
|
||||
|
||||
const staked = await prisma.inventoryItem.findMany({
|
||||
where: { userId: user.id, staked: true },
|
||||
include: { item: true },
|
||||
});
|
||||
const rates = summarizeVaultRates(staked, user);
|
||||
|
||||
res.json({
|
||||
user: publicUser(user),
|
||||
credited: settled.credited,
|
||||
ticks: settled.ticks,
|
||||
vault: {
|
||||
used: staked.length,
|
||||
slots: maxVaultSlots(user),
|
||||
...rates,
|
||||
pendingYield: estimatePendingYield(staked, user, mode),
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: err.message || 'Failed to claim vault yield' });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
Reference in New Issue
Block a user