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 · a7b0e987
This commit introduces exposure tracking per tenant per race market, enhancing the business logic for better granularity in betting exposure management and real-time updates via socket emits. The code is generally well structured, utilizing efficient MongoDB update patterns and aggregation for exposure calculations. However, there is minor risk related to lack of input validation and type safety and error handling could be improved. The commit message is incomplete and uninformative.
Quality
?
85%
Security
?
75%
Business Value
?
80%
Maintainability
?
83%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Incomplete And Unclear
Where
commit message
Issue / Evidence
incomplete and unclear
Suggested Fix
provide a detailed message explaining what 'race tenant market' means and the purpose of the changes
Missing Validation
Where
src/controllers/bet.controller.js:130-151
Issue / Evidence
no input validation on user_id, tenant_id and runnerId
Suggested Fix
add validation and sanitization to reduce potential bugs and injection risk
Updateone Calls Lack Error Catching
Where
src/controllers/bet.controller.js:138-150
Issue / Evidence
updateOne calls lack error catching
Suggested Fix
add try/catch blocks or error handling to avoid hidden update failures
Missing Validation
Where
src/utils/exposureHelper.js:4-20
Issue / Evidence
no validation of parameters for getTenantExposure
Suggested Fix
add parameter validation and error handling
Catch Block Logs Error But Does Not Handle...
Where
src/utils/socketClient.js:40-63
Issue / Evidence
catch block logs error but does not handle or notify upstream
Suggested Fix
consider handling error cases or notifying relevant systems
Schema Types Could Be Enhanced With Requir...
Where
src/models/Exposure.js:3-10
Issue / Evidence
schema types could be enhanced with required fields and indexes
Suggested Fix
add required: true where appropriate and add indexes to improve query efficiency and data integrity
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 5d8471f..15310e1 100644 - raceRecord.markModified('market_data'); - await raceRecord.save(); - - var racemarket = await RaceMarket.findOne( - { race_id: new mongoose.Types.ObjectId(raceId) } - ); - - placedBets.push(bet); - - } catch (err) { - failedBets.push({ betData, error: err.message }); - }
Added / After Commit
+ diff --git a/src/controllers/bet.controller.js b/src/controllers/bet.controller.js + index 5d8471f..15310e1 100644 + raceRecord.markModified('market_data'); + await raceRecord.save(); + + for (const r of market.odds) { + const isSelectedRunner = + String(r.runnerId) === String(runnerId); + + const exposureChange = isSelectedRunner + ? -returnAmount + : amount; + + await Exposure.updateOne( + { + user_id, + tenant_id, + race_id: raceId,
Removed / Before Commit
- diff --git a/src/models/Exposure.js b/src/models/Exposure.js - new file mode 100644 - index 0000000..57daeb3 - \ No newline at end of file
Added / After Commit
+ diff --git a/src/models/Exposure.js b/src/models/Exposure.js + new file mode 100644 + index 0000000..57daeb3 + const mongoose = require("mongoose"); + + 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, + exposure: { type: Number, default: 0 } + }, { timestamps: true }); + + module.exports = mongoose.model("Exposure", exposureSchema); + \ No newline at end of file
Removed / Before Commit
- diff --git a/src/utils/exposureHelper.js b/src/utils/exposureHelper.js - new file mode 100644 - index 0000000..db98893 - \ No newline at end of file
Added / After Commit
+ diff --git a/src/utils/exposureHelper.js b/src/utils/exposureHelper.js + new file mode 100644 + index 0000000..db98893 + const mongoose = require("mongoose"); + const Exposure = require("../models/Exposure"); + + const getTenantExposure = async ({ raceId, marketId, tenantId }) => { + return await Exposure.aggregate([ + { + $match: { + tenant_id: new mongoose.Types.ObjectId(tenantId), + race_id: new mongoose.Types.ObjectId(raceId), + market_id: marketId + } + }, + { + $group: { + _id: "$runner_id",
Removed / Before Commit
- diff --git a/src/utils/socketClient.js b/src/utils/socketClient.js - index d12bf9b..4eb433c 100644 - const { io } = require("socket.io-client"); - - let socket = null; - - return socket; - }; - - const emitRaceOdds = (raceId, oddsData) => { - const s = getSocket(); - s.emit("raceOddsAdmin", { raceId, oddsData }); - }; - - module.exports = { getSocket, emitRaceOdds };
Added / After Commit
+ diff --git a/src/utils/socketClient.js b/src/utils/socketClient.js + index d12bf9b..4eb433c 100644 + const { io } = require("socket.io-client"); + const { getTenantExposure, mergeExposure } = require("./exposureHelper"); + + let socket = null; + + return socket; + }; + + const emitRaceOdds = async (raceId, oddsData, tenantId) => { + const s = getSocket(); + + // 🟢 1. SUPER ADMIN (GLOBAL - same as before) + s.emit("raceOddsAdmin", { + raceId, + oddsData // already contains global exposure + });