I wouldn't merge this yet. There are 3 bugs that will break things, 1 SQL injection, and 1 risk. The original code was correct before this change.
src/orders/service.ts
L15: 🔴 bug: the loop runs one step too far.i <= order.items.lengthreadsorder.items[length], which isundefined, so.pricethrows a TypeError on every call. Use<, or keep the originalreduce, which was correct and shorter.L22: 🔴 bug:awaitwas removed fromthis.coupons.find(code), socouponis now a Promise.coupon.expiresAtisundefinedandundefined < Date.now()isfalse, so the expiry check never fires and expired coupons are accepted.coupon.idis alsoundefined. Put theawaitback.L24: 🔴 bug: the update is fire-and-forget and.catch(() => {})hides any failure. Callers see success even when the coupon was never saved, and nothing is logged. Put backawait this.repo.update(...)and let errors reach the caller.L22-23: 🟡 risk: iffindreturns null for an unknown code,coupon.expiresAtthrows a TypeError instead of a clear error. Addif (!coupon) throw new Error("invalid coupon").
L28: 🔴 security: SQL injection in listOrders. userId is put straight into the SQL string. A value like ' OR '1'='1 returns every user's orders, and with stacked queries an attacker could change or delete data (CWE-89, OWASP A03). Even if userId comes from an auth token today, this function can't assume that, and a single caller passing a request param makes it exploitable. Use a parameterized query, e.g. this.db.query("SELECT * FROM orders WHERE user_id = $1", [userId]) (use whatever placeholder syntax your driver expects).
L28: 🔵 nit:SELECT *returns every column and will pick up any column added later. List the columns you need.L27: 🔵 nit: no return type, unlikegetOrderTotal. AddPromise<Order[]>.
Real run recorded with claude-code / claude-opus-5-5. Output is shown verbatim, unmodified.
Qué hace
Escribe comentarios de revisión de código en un formato compacto L<line>: <problem>. <fix>., listos para pegar en un pull request.
Cómo funciona
- Se activa con /caveman-review, "review this PR" o "review the diff".
- Resume cada hallazgo en una línea con el número de línea exacto, los nombres de símbolos entre comillas invertidas y una solución concreta, además de una etiqueta de gravedad opcional: 🔴 bug, 🟡 risk, 🔵 nit, ❓ question.
- Omite las expresiones dubitativas y no repite el diff. Para problemas de seguridad, desacuerdos de arquitectura y situaciones de incorporación, escribe un párrafo completo en su lugar.
Ideal para
Revisar diffs y pull requests cuando quieres hallazgos que se lean de un vistazo.
Conviene saber
Solo escribe comentarios. No edita código, no aprueba ni solicita cambios, ni ejecuta linters.
Solo contiene instrucciones: sin scripts, sin acceso a la red y sin escritura de archivos. El paquete también contiene README, LICENSE y NOTICE del repositorio original. Los hallazgos de la revisión son salida del modelo; compruébalos antes de publicarlos.