node-mongo-demo
node.js and mongodb demo
git clone https://9o.is/git/node-mongo-demo.git
commit 71f1d034ee8fe2144fbf0fd9046be730fcbf5148 parent 6f348d89a1e88286287940b480c1f5c0bcb2e476 Author: Jul <jul@9o.is> Date: Sun, 26 Jan 2025 13:51:14 -0500 create POST /api/lucky7/bets endpoint Diffstat:
| A | backend/src/api/lucky7-bets-create.js | | | 52 | ++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | backend/src/api/lucky7.js | | | 2 | ++ |
| A | backend/src/models/lucky7-bet.js | | | 16 | ++++++++++++++++ |
| D | backend/src/models/lucky7-game.js | | | 12 | ------------ |
4 files changed, 70 insertions(+), 12 deletions(-)
diff --git a/backend/src/api/lucky7-bets-create.js b/backend/src/api/lucky7-bets-create.js @@ -0,0 +1,52 @@ +import { randomInt } from "crypto"; +import lucky7Session, { nextGameTime } from "../services/lucky7-session.js"; +import Lucky7Bet from "../models/lucky7-bet.js"; + +const roll = () => [randomInt(1,7), randomInt(1,7)]; + +const outcome = (roll, lucky) => { + const seven = 7 === roll[0] + roll[1]; + return (lucky && seven) || (!lucky && !seven); +}; + +const lucky7BetsCreate = async (req, res) => { + const { userId } = req; + const { lucky } = req.body; + + if (typeof lucky !== 'boolean') { + return res.status(400).json({ message: 'invalid input' }) + } + + try { + const session = await lucky7Session(userId); + + if (session.nextGameInSeconds <= 5) { + return res.status(400).json({ message: '5 seconds or less remaining for next dice roll' }) + } + + const rollAt = nextGameTime(session.createdAt); + + const existingBet = await Lucky7Bet.findOne({ + userId, + rollAt, + }); + + const bet = existingBet || + new Lucky7Bet({ userId, rollAt }); + + if (!bet.roll.length) { + bet.roll = roll(); + } + + bet.lucky = lucky; + bet.win = outcome(bet.roll, lucky); + await bet.save() + + res.status(200).json(bet); + } catch (error) { + console.error(error); + res.status(500).json({ message: "Something went wrong" }); + } +}; + +export default lucky7BetsCreate; diff --git a/backend/src/api/lucky7.js b/backend/src/api/lucky7.js @@ -1,9 +1,11 @@ import express from "express"; +import lucky7BetsCreate from "./lucky7-bets-create.js"; import lucky7SessionsCreate from "./lucky7-sessions-create.js"; import auth from "../utils/auth.js"; const router = express.Router(); router.post("/sessions", auth, lucky7SessionsCreate); +router.post("/bets", auth, lucky7BetsCreate); export default router; diff --git a/backend/src/models/lucky7-bet.js b/backend/src/models/lucky7-bet.js @@ -0,0 +1,16 @@ +import mongoose from "mongoose"; + +const lucky7BetSchema = mongoose.Schema({ + userId: { type: 'ObjectId', ref: 'User', required: true, index: true }, + rollAt: { type: Date, unique: true, required: true }, + lucky: { type: Boolean, required: true }, + roll: { type: [Number], required: true }, + win: { type: Boolean, required: true }, +}, { + optimisticConcurrency: true, +}); + +lucky7BetSchema.index({ userId: 1, rollAt: -1 }); + +export default mongoose.model("Lucky7Bet", lucky7BetSchema); + diff --git a/backend/src/models/lucky7-game.js b/backend/src/models/lucky7-game.js @@ -1,12 +0,0 @@ -import mongoose from "mongoose"; - -const lucky7GameSchema = mongoose.Schema({ - userId: { type: 'ObjectId', ref: 'User', required: true } - rollAt: { type: Date, required: true }, - lucky: { type: Boolean, required: true }, - roll: { type: [Number], required: true }, - win: { type: Boolean, required: true }, -}); - -export default mongoose.model("Lucky7Game", lucky7GameSchema); -