feat: place bid on offer

+ update market with socket
This commit is contained in:
Milo
2025-12-10 16:56:07 +01:00
parent 36ff2890ff
commit 9088193fc1
3 changed files with 26 additions and 9 deletions

View File

@@ -200,8 +200,8 @@ export const getOfferBids = flopoDB.prepare(`
`); `);
export const insertBid = flopoDB.prepare(` export const insertBid = flopoDB.prepare(`
INSERT INTO bids (bidder_id, market_offer_id, offer_amount) INSERT INTO bids (id, bidder_id, market_offer_id, offer_amount)
VALUES (@bidder_id, @market_offer_id, @offer_amount) VALUES (@id, @bidder_id, @market_offer_id, @offer_amount)
`); `);
export const insertManyUsers = flopoDB.transaction(async (users) => { export const insertManyUsers = flopoDB.transaction(async (users) => {

View File

@@ -15,6 +15,7 @@ import {
insertLog, insertLog,
updateUserCoins, updateUserCoins,
} from "../../database/index.js"; } from "../../database/index.js";
import { emitMarketUpdate } from "../socket.js";
// Create a new router instance // Create a new router instance
const router = express.Router(); const router = express.Router();
@@ -92,11 +93,11 @@ export function marketRoutes(client, io) {
if (lastBid?.bidder_id === buyer_id) if (lastBid?.bidder_id === buyer_id)
return res.status(403).send({ error: "You are already the highest bidder" }); return res.status(403).send({ error: "You are already the highest bidder" });
if (bid_amount < lastBid?.offer_amount + 10) { if (bid_amount < lastBid?.offer_amount + 10) {
return res.status(403).send({ message: "Bid amount is below minimum" }); return res.status(403).send({ error: "Bid amount is below minimum" });
} }
} else { } else {
if (bid_amount < offer.starting_price + 10) { if (bid_amount < offer.starting_price + 10) {
return res.status(403).send({ message: "Bid amount is below minimum" }); return res.status(403).send({ error: "Bid amount is below minimum" });
} }
} }
@@ -105,16 +106,14 @@ export function marketRoutes(client, io) {
if (bidder.coins < bid_amount) if (bidder.coins < bid_amount)
return res.status(403).send({ error: "You do not have enough coins to place this bid" }); return res.status(403).send({ error: "You do not have enough coins to place this bid" });
// TODO:
// buyer must refunded on outbid
insertBid.run({ insertBid.run({
id: Date.now(),
bidder_id: buyer_id, bidder_id: buyer_id,
market_offer_id: offer.id, market_offer_id: offer.id,
offer_amount: bid_amount, offer_amount: bid_amount,
}); });
const newCoinsAmount = bidder.coins - bid_amount; const newCoinsAmount = bidder.coins - bid_amount;
updateUserCoins.run({ buyer_id, coins: newCoinsAmount }); updateUserCoins.run({ id: buyer_id, coins: newCoinsAmount });
insertLog.run({ insertLog.run({
id: `${buyer_id}-bid-${offer.id}-${Date.now()}`, id: `${buyer_id}-bid-${offer.id}-${Date.now()}`,
user_id: buyer_id, user_id: buyer_id,
@@ -124,7 +123,23 @@ export function marketRoutes(client, io) {
user_new_amount: newCoinsAmount, user_new_amount: newCoinsAmount,
}); });
res.status(200).send({ message: "Bid placed successfully" }); // Refund the previous highest bidder
if (lastBid) {
const previousBidder = getUser.get(lastBid.bidder_id);
const refundedCoinsAmount = previousBidder.coins + lastBid.offer_amount;
updateUserCoins.run({ id: previousBidder.id, coins: refundedCoinsAmount });
insertLog.run({
id: `${previousBidder.id}-bid-refund-${offer.id}-${Date.now()}`,
user_id: previousBidder.id,
action: "BID_REFUNDED",
target_user_id: null,
coins_amount: lastBid.offer_amount,
user_new_amount: refundedCoinsAmount,
});
}
await emitMarketUpdate();
res.status(200).send({ error: "Bid placed successfully" });
} catch (e) { } catch (e) {
console.log(`[${Date.now()}]`, e); console.log(`[${Date.now()}]`, e);
res.status(500).send({ error: e }); res.status(500).send({ error: e });

View File

@@ -459,3 +459,5 @@ export const emitUpdate = (type, room) => io.emit("blackjack:update", { type, ro
export const emitToast = (payload) => io.emit("blackjack:toast", payload); export const emitToast = (payload) => io.emit("blackjack:toast", payload);
export const emitSolitaireUpdate = (userId, moves) => io.emit("solitaire:update", { userId, moves }); export const emitSolitaireUpdate = (userId, moves) => io.emit("solitaire:update", { userId, moves });
export const emitMarketUpdate = () => io.emit("market:update");