AI Review Center
Commit Review Workspace ?
Select a commit on the left to inspect quality, security, business value, findings, and suggested code changes.
Project AI Score
?
62%
Quality Avg
?
63%
Security Avg
?
59%
Reviews
?
92
Review Result ?
solutionbowl/bet-service · e43af628
The commit introduces multi-bet exposure calculation, updating, and clearing functionalities with associated routes and model changes. The core logic appears comprehensive and integrates well with existing models. However, quality and security are lowered due to use of console.log for debugging in production code, lack of input validation on incoming request bodies, and no authentication or authorization enforced on internal routes.
Quality
?
75%
Security
?
40%
Business Value
?
80%
Maintainability
?
73%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Console.log Used For Debug Output In Produ...
Where
src/controllers/bet.controller.js:83
Issue / Evidence
console.log used for debug output in production
Suggested Fix
replace with a proper logger and consider log level management
Console.log Used For Debug Output In Produ...
Where
src/controllers/multiBet.controller.js:406
Issue / Evidence
console.log used for debug output in production
Suggested Fix
replace with a proper logger and consider log level management
Console.log Used For Debug Output In Produ...
Where
src/controllers/multiBet.controller.js:411
Issue / Evidence
console.log used for debug output in production
Suggested Fix
replace with a proper logger and consider log level management
Console.log Used For Debug Output In Produ...
Where
src/controllers/multiBet.controller.js:444
Issue / Evidence
console.log used for debug output in production
Suggested Fix
replace with a proper logger and consider log level management
Console.log Used For Debug Output In Produ...
Where
src/controllers/multiBet.controller.js:449
Issue / Evidence
console.log used for debug output in production
Suggested Fix
replace with a proper logger and consider log level management
Error Handler Just Logs Error
Where
src/controllers/multiBet.controller.js:420
Issue / Evidence
Error handler just logs error
Suggested Fix
consider more robust error reporting or monitoring
Missing Validation
Where
src/controllers/multiBet.controller.js:438
Issue / Evidence
Missing input validation for 'bet_id' in clearMultiBetExposures
Suggested Fix
add validation to prevent invalid data processing
Security Issue
Where
src/routes/multiBetRoutes.js:34
Issue / Evidence
Route marked as internal but has no authentication
Suggested Fix
consider adding inter-service authorization or token validation to improve security
Security Issue
Where
src/routes/multiBetRoutes.js:44
Issue / Evidence
Route marked as internal but has no authentication
Suggested Fix
consider adding inter-service authorization or token validation to improve security
Code Change Preview · src/controllers/bet.controller.js
?
Removed / Before Commit
- diff --git a/src/controllers/bet.controller.js b/src/controllers/bet.controller.js - index 4375b1f..1a64a29 100644 - Math.max(placePnL, notPlacePnL, 0) - ); - - await Exposure.updateOne( - { - user_id,
Added / After Commit
+ diff --git a/src/controllers/bet.controller.js b/src/controllers/bet.controller.js + index 4375b1f..1a64a29 100644 + Math.max(placePnL, notPlacePnL, 0) + ); + + console.log(exposureProfit, exposure); + + await Exposure.updateOne( + { + user_id,
Removed / Before Commit
- diff --git a/src/controllers/multiBet.controller.js b/src/controllers/multiBet.controller.js - index 0e50ce2..5848b98 100644 - const mongoose = require("mongoose"); - const { getHierarchyIds } = require("../services/hierarchyService"); - const { emitBalanceUpdate } = require("../utils/socketClient"); - - /** - * Place Multi-Bet (DOUBLE/TRIPLE) - }); - await ledger.save(); - - return res.status(200).json({ - status: true, - message: `${betType} bet placed successfully`, - }; - - /** - * Settle Multi-Bet (Auto-fetch positions from RaceMarket)
Added / After Commit
+ diff --git a/src/controllers/multiBet.controller.js b/src/controllers/multiBet.controller.js + index 0e50ce2..5848b98 100644 + const mongoose = require("mongoose"); + const { getHierarchyIds } = require("../services/hierarchyService"); + const { emitBalanceUpdate } = require("../utils/socketClient"); + const { calculateMultiBetExposures, updateExposuresAfterLegWin, clearMultiBetExposures } = require("../utils/multiBetExposure"); + + /** + * Place Multi-Bet (DOUBLE/TRIPLE) + }); + await ledger.save(); + + // Calculate and create exposures for all legs + await calculateMultiBetExposures(bet._id, user_id, tenant_id, validatedLegs, stake); + + return res.status(200).json({ + status: true, + message: `${betType} bet placed successfully`,
Removed / Before Commit
- diff --git a/src/models/Exposure.js b/src/models/Exposure.js - index c2effc8..9b488b7 100644 - const exposureSchema = new mongoose.Schema({ - user_id: mongoose.Schema.Types.ObjectId, - tenant_id: mongoose.Schema.Types.ObjectId, - race_id: mongoose.Schema.Types.ObjectId, - market_id: String, - runner_id: String, - exposureProfit: { type: Number, default: 0 }, - exposure: { type: Number, default: 0 } - }, { timestamps: true }); - - module.exports = mongoose.model("Exposure", exposureSchema); - \ No newline at end of file
Added / After Commit
+ diff --git a/src/models/Exposure.js b/src/models/Exposure.js + index c2effc8..9b488b7 100644 + const exposureSchema = new mongoose.Schema({ + user_id: mongoose.Schema.Types.ObjectId, + tenant_id: mongoose.Schema.Types.ObjectId, + bet_id: mongoose.Schema.Types.ObjectId, + race_id: mongoose.Schema.Types.ObjectId, + market_id: String, + runner_id: String, + exposureProfit: { type: Number, default: 0 }, + exposure: { type: Number, default: 0 }, + + // Multi-bet specific fields + is_multi_bet: { type: Boolean, default: false }, + leg_number: { type: Number, default: 1 }, + stake_at_leg: { type: Number, default: 0 }, + leg_profit: { type: Number, default: 0 }, + is_active: { type: Boolean, default: true }
Removed / Before Commit
- diff --git a/src/routes/multiBetRoutes.js b/src/routes/multiBetRoutes.js - index 899a3aa..82ab6b9 100644 - ); - - /** - * @route POST /api/bets/settle-multi-bet - * @desc Settle a multi-bet after all races (auto-fetch positions) - * @access Private (Admin/Settlement service) - */ - router.post( - '/settle-multi-bet', - authMiddleware, - multiBetController.settleMultiBet - ); - - /** - * @route POST /api/bets/auto-settle-multi-bets - * @desc Auto-settle all pending multi-bets for logged-in user
Added / After Commit
+ diff --git a/src/routes/multiBetRoutes.js b/src/routes/multiBetRoutes.js + index 899a3aa..82ab6b9 100644 + ); + + /** + * @route POST /api/bets/update-multi-bet-exposures + * @desc Update exposures after a leg wins (called from tenant-service) + * @access Internal (no auth - inter-service call) + */ + router.post( + '/update-multi-bet-exposures', + multiBetController.updateMultiBetExposures + ); + + /** + * @route POST /api/bets/clear-multi-bet-exposures + * @desc Clear all exposures for a bet (called from tenant-service) + * @access Internal (no auth - inter-service call)
Removed / Before Commit
- diff --git a/src/utils/multiBetExposure.js b/src/utils/multiBetExposure.js - new file mode 100644 - index 0000000..f3966ee
Added / After Commit
+ diff --git a/src/utils/multiBetExposure.js b/src/utils/multiBetExposure.js + new file mode 100644 + index 0000000..f3966ee + const Exposure = require("../models/Exposure"); + const RacingBet = require("../models/RacingBet"); + const mongoose = require("mongoose"); + + /** + * Calculate and create exposures for multi-bet + * Uses cascading calculation based on confirmed won legs + */ + async function calculateMultiBetExposures(betId, userId, tenantId, legs, originalStake) { + try { + // Calculate confirmed amount up to last won leg + const sortedLegs = await RacingBet.find({ bet_id: betId }) + .sort({ leg_number: 1 }); + + let confirmedAmount = originalStake;