From de20d8b4796249b8bbbbc0b06df8006a09f0bc05 Mon Sep 17 00:00:00 2001 From: Aditya Valsangkar Date: Mon, 6 Jul 2026 11:21:01 +0530 Subject: [PATCH 1/4] chore: remove committed error logs --- backend/error.log | Bin 2478 -> 0 bytes backend/error.txt | 60 ---------------------------------------------- 2 files changed, 60 deletions(-) delete mode 100644 backend/error.log delete mode 100644 backend/error.txt diff --git a/backend/error.log b/backend/error.log deleted file mode 100644 index c3e4b6836ace6d74e040a05a6bfadcb698ea01c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2478 zcmcJRTTc^F6ovP*iT_~|AAqPpi&YsD6N8vwfGWxpU;}hokY30zqQvM=SHHDS4>QHK zN}`!`&Y3g&vi91S&d(nM8(P~kODyFVpHe$zUvQqY9$L?qtnZSa*x$7~yt&{^_daXx zyCLr`*`@Z>8urBHUSK8RT=w*)#?!H#U^Dk8*}7lxoM16WVu@AWWiPiy`^a-*b$iY| z_|G{X`nw)$*H2~X`z;A56gIGH3qfA_@dO8!M+sGC6&d$+4 zhJ_Bl494|t9y^kYdLa|DxevStk3nyC4pMvsM^PU~p1J)fdDZh$x-M)Y{ z195>?8Rg&_r|gKASEg#{*_FLzrz$DqTgPX}PZ?hVb8YkjFXHsn^Sg$ZKGz`_+xVB} zI4}9gcVw!df@J+Oa;ht>>qN0*E!(oDy|i81%1MYQ*AC>OAkgoEZDO#jw0V5{8V;tva&Z5brtb} zvnCs=#sQbIl{iwdmfVOa#4$&V>X8eZL*kSe&;40>mQKf6?6X_L{=V0Nd`R+$sHCaN z$naO#L%5aiz*#)qcSepq#xs{}V<~j;KC!jv>1lS% znn|HA#(P0}(OR5IsjZT^-;tElEprwo;mBO?_Be*F7iZ%tQ|vL()R>Z!kZ2lr;7z?% zOvUnVIH}n(lRBWOO+>Q=gKfu>(FsFv37;l%6{pZl$2vWC(u>xs|0kO0(NhY(hCOn| z>Ju@_$~`Jw9eo12HXZ(dI1IP~YOx?}%eKN=2jiq{N_IMj`&!+4)Y)B$mwEK9Hcm#71x zMW%fCzBpr|=sz{|o9eT~^JgrY0P-H|vBfusB37raklhq?njMLKbvaEkP1oQj&f8i4 eLe+Ub=Qh6iU0(H_AWQK}=Mom`Jju82lKBOeiGvRS diff --git a/backend/error.txt b/backend/error.txt deleted file mode 100644 index b0fbc5e..0000000 --- a/backend/error.txt +++ /dev/null @@ -1,60 +0,0 @@ -node : node:internal/modul -es/esm/resolve:857 -At line:1 char:1 -+ node src/server.js 2>&1 -| Out-File -Encoding utf8 -error.txt -+ ~~~~~~~~~~~~~~~~~~~~~~~ - + CategoryInfo - : NotSpecified: (n - ode:internal/modules/ - esm/resolve:857:Strin -g) [], RemoteExceptio n - + FullyQualifiedError - Id : NativeCommandErr - or - - throw new ERR_MODULE_NOT -_FOUND(packageName, -fileURLToPath(base), -null); - ^ - -Error -[ERR_MODULE_NOT_FOUND]: -Cannot find package -'cors' imported from C:\Re -imbursement-Management\bac -kend\src\app.js - at packageResolve (nod -e:internal/modules/esm/res -olve:857:9) - at moduleResolve (node -:internal/modules/esm/reso -lve:926:18) - at defaultResolve (nod -e:internal/modules/esm/res -olve:1056:11) - at ModuleLoader.defaul -tResolve (node:internal/mo -dules/esm/loader:654:12) - at -#cachedDefaultResolve (nod -e:internal/modules/esm/loa -der:603:25) - at -ModuleLoader.resolve (node -:internal/modules/esm/load -er:586:38) - at ModuleLoader.getMod -uleJobForImport (node:inte -rnal/modules/esm/loader:24 -2:38) - at ModuleJob._link (no -de:internal/modules/esm/mo -dule_job:135:49) { - code: -'ERR_MODULE_NOT_FOUND' -} - -Node.js v22.13.1 From 695da265feb94f71c40500410c71a8dd0fa85ba8 Mon Sep 17 00:00:00 2001 From: Aditya Valsangkar Date: Mon, 6 Jul 2026 11:42:54 +0530 Subject: [PATCH 2/4] chore: ignore error log files --- .gitignore | Bin 66 -> 149 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.gitignore b/.gitignore index cf7d62c1b5d30564b63e25c6d89d57d65f29834c..e9e8977e78c6a4d94b3859fbefbe61b4c4634d6a 100644 GIT binary patch literal 149 zcmaKiK?;B{5Cd~A^buY?)KB<>K0vBnM66w@tN47kdY6!dkjWfr*f^evj?NlK`TEke z)--iGy2G|7vL-HvC^PXzCCpUu-Va{5=s6-_!U{r0M5kR;taeD+Gb{}LD8UVRsRtCv BBg6mz literal 66 zcmd1HPf3l>%}*)KNiEjr(o4-N0~2~$T#6u$UTQ^RZb42eS4w7ai9T0yepzZ!VtOi2 OrAu&pa7lhqDi;9mz7_ib From 219c199f47500aab303d333a834e32dbea689658 Mon Sep 17 00:00:00 2001 From: Aditya Valsangkar Date: Mon, 6 Jul 2026 11:49:55 +0530 Subject: [PATCH 3/4] chore: remove duplicate 001_init_users migration --- backend/error.log | Bin 0 -> 2478 bytes backend/error.txt | 60 +++++++++++++++++++ backend/src/db/migrations/001_init_users.sql | 17 ------ 3 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 backend/error.log create mode 100644 backend/error.txt delete mode 100644 backend/src/db/migrations/001_init_users.sql diff --git a/backend/error.log b/backend/error.log new file mode 100644 index 0000000000000000000000000000000000000000..c3e4b6836ace6d74e040a05a6bfadcb698ea01c7 GIT binary patch literal 2478 zcmcJRTTc^F6ovP*iT_~|AAqPpi&YsD6N8vwfGWxpU;}hokY30zqQvM=SHHDS4>QHK zN}`!`&Y3g&vi91S&d(nM8(P~kODyFVpHe$zUvQqY9$L?qtnZSa*x$7~yt&{^_daXx zyCLr`*`@Z>8urBHUSK8RT=w*)#?!H#U^Dk8*}7lxoM16WVu@AWWiPiy`^a-*b$iY| z_|G{X`nw)$*H2~X`z;A56gIGH3qfA_@dO8!M+sGC6&d$+4 zhJ_Bl494|t9y^kYdLa|DxevStk3nyC4pMvsM^PU~p1J)fdDZh$x-M)Y{ z195>?8Rg&_r|gKASEg#{*_FLzrz$DqTgPX}PZ?hVb8YkjFXHsn^Sg$ZKGz`_+xVB} zI4}9gcVw!df@J+Oa;ht>>qN0*E!(oDy|i81%1MYQ*AC>OAkgoEZDO#jw0V5{8V;tva&Z5brtb} zvnCs=#sQbIl{iwdmfVOa#4$&V>X8eZL*kSe&;40>mQKf6?6X_L{=V0Nd`R+$sHCaN z$naO#L%5aiz*#)qcSepq#xs{}V<~j;KC!jv>1lS% znn|HA#(P0}(OR5IsjZT^-;tElEprwo;mBO?_Be*F7iZ%tQ|vL()R>Z!kZ2lr;7z?% zOvUnVIH}n(lRBWOO+>Q=gKfu>(FsFv37;l%6{pZl$2vWC(u>xs|0kO0(NhY(hCOn| z>Ju@_$~`Jw9eo12HXZ(dI1IP~YOx?}%eKN=2jiq{N_IMj`&!+4)Y)B$mwEK9Hcm#71x zMW%fCzBpr|=sz{|o9eT~^JgrY0P-H|vBfusB37raklhq?njMLKbvaEkP1oQj&f8i4 eLe+Ub=Qh6iU0(H_AWQK}=Mom`Jju82lKBOeiGvRS literal 0 HcmV?d00001 diff --git a/backend/error.txt b/backend/error.txt new file mode 100644 index 0000000..b0fbc5e --- /dev/null +++ b/backend/error.txt @@ -0,0 +1,60 @@ +node : node:internal/modul +es/esm/resolve:857 +At line:1 char:1 ++ node src/server.js 2>&1 +| Out-File -Encoding utf8 +error.txt ++ ~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo + : NotSpecified: (n + ode:internal/modules/ + esm/resolve:857:Strin +g) [], RemoteExceptio n + + FullyQualifiedError + Id : NativeCommandErr + or + + throw new ERR_MODULE_NOT +_FOUND(packageName, +fileURLToPath(base), +null); + ^ + +Error +[ERR_MODULE_NOT_FOUND]: +Cannot find package +'cors' imported from C:\Re +imbursement-Management\bac +kend\src\app.js + at packageResolve (nod +e:internal/modules/esm/res +olve:857:9) + at moduleResolve (node +:internal/modules/esm/reso +lve:926:18) + at defaultResolve (nod +e:internal/modules/esm/res +olve:1056:11) + at ModuleLoader.defaul +tResolve (node:internal/mo +dules/esm/loader:654:12) + at +#cachedDefaultResolve (nod +e:internal/modules/esm/loa +der:603:25) + at +ModuleLoader.resolve (node +:internal/modules/esm/load +er:586:38) + at ModuleLoader.getMod +uleJobForImport (node:inte +rnal/modules/esm/loader:24 +2:38) + at ModuleJob._link (no +de:internal/modules/esm/mo +dule_job:135:49) { + code: +'ERR_MODULE_NOT_FOUND' +} + +Node.js v22.13.1 diff --git a/backend/src/db/migrations/001_init_users.sql b/backend/src/db/migrations/001_init_users.sql deleted file mode 100644 index a67fd8d..0000000 --- a/backend/src/db/migrations/001_init_users.sql +++ /dev/null @@ -1,17 +0,0 @@ -CREATE TABLE IF NOT EXISTS companies ( - id SERIAL PRIMARY KEY, - name TEXT NOT NULL, - country_code VARCHAR(4) NOT NULL, - default_currency VARCHAR(8) NOT NULL, - created_at TIMESTAMP DEFAULT NOW() -); - -CREATE TABLE IF NOT EXISTS users ( - id SERIAL PRIMARY KEY, - company_id INT REFERENCES companies(id), - full_name TEXT NOT NULL, - email TEXT UNIQUE NOT NULL, - password_hash TEXT NOT NULL, - role VARCHAR(20) NOT NULL, - created_at TIMESTAMP DEFAULT NOW() -); From ec86ef4596433b1c736eafa130d4755e9a5a2ee8 Mon Sep 17 00:00:00 2001 From: Aditya Valsangkar Date: Mon, 6 Jul 2026 13:01:56 +0530 Subject: [PATCH 4/4] chore: remove unused stub modules (ocr, riskScoring, smartApproval, ai) --- backend/package-lock.json | 68 +++++++++++++++++++ backend/package.json | 4 +- backend/src/app.js | 4 ++ backend/src/modules/ai/ai.controller.js | 7 -- backend/src/modules/ai/ai.model.js | 3 - backend/src/modules/ai/ai.routes.js | 9 --- backend/src/routes/index.js | 2 - backend/src/services/ocr.service.js | 9 --- backend/src/services/riskScoring.service.js | 7 -- backend/src/services/smartApproval.service.js | 5 -- 10 files changed, 75 insertions(+), 43 deletions(-) delete mode 100644 backend/src/modules/ai/ai.controller.js delete mode 100644 backend/src/modules/ai/ai.model.js delete mode 100644 backend/src/modules/ai/ai.routes.js delete mode 100644 backend/src/services/ocr.service.js delete mode 100644 backend/src/services/riskScoring.service.js delete mode 100644 backend/src/services/smartApproval.service.js diff --git a/backend/package-lock.json b/backend/package-lock.json index 187b733..9b4824e 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,9 +9,11 @@ "version": "1.0.0", "dependencies": { "bcryptjs": "^2.4.3", + "compression": "^1.8.1", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", + "express-rate-limit": "^8.5.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", @@ -264,6 +266,45 @@ "fsevents": "~2.3.2" } }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -539,6 +580,24 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", + "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -762,6 +821,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ip-address": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", diff --git a/backend/package.json b/backend/package.json index 56e96c0..e047ecd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,4 +1,4 @@ -{ +{ "name": "reimbursement-backend", "version": "1.0.0", "private": true, @@ -15,9 +15,11 @@ }, "dependencies": { "bcryptjs": "^2.4.3", + "compression": "^1.8.1", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", + "express-rate-limit": "^8.5.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", diff --git a/backend/src/app.js b/backend/src/app.js index 570990d..05b0d58 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -1,6 +1,8 @@ import cors from "cors"; import express from "express"; import helmet from "helmet"; +import compression from "compression"; +import rateLimit from "express-rate-limit"; import morgan from "morgan"; import routes from "./routes/index.js"; import { errorHandler } from "./middleware/errorHandler.js"; @@ -9,6 +11,8 @@ import { env } from "./config/env.js"; const app = express(); app.use(helmet()); +app.use(compression()); +app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 })); app.use(cors({ origin: env.FRONTEND_URL })); app.use(morgan("dev")); app.use(express.json({ limit: "5mb" })); diff --git a/backend/src/modules/ai/ai.controller.js b/backend/src/modules/ai/ai.controller.js deleted file mode 100644 index 2ab8cfd..0000000 --- a/backend/src/modules/ai/ai.controller.js +++ /dev/null @@ -1,7 +0,0 @@ -import { asyncHandler } from "../../utils/asyncHandler.js"; -import { scoreExpenseRisk } from "../../services/riskScoring.service.js"; - -export const score = asyncHandler(async (req, res) => { - const risk = scoreExpenseRisk(req.body); - res.json({ risk }); -}); diff --git a/backend/src/modules/ai/ai.model.js b/backend/src/modules/ai/ai.model.js deleted file mode 100644 index 26f5b1f..0000000 --- a/backend/src/modules/ai/ai.model.js +++ /dev/null @@ -1,3 +0,0 @@ -export const aiModel = { - version: "mock-v1" -}; diff --git a/backend/src/modules/ai/ai.routes.js b/backend/src/modules/ai/ai.routes.js deleted file mode 100644 index b525544..0000000 --- a/backend/src/modules/ai/ai.routes.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Router } from "express"; -import { authenticate } from "../../middleware/authenticate.js"; -import { score } from "./ai.controller.js"; - -const router = Router(); -router.use(authenticate); -router.post("/risk-score", score); - -export default router; diff --git a/backend/src/routes/index.js b/backend/src/routes/index.js index 2c2de1a..f6bd91e 100644 --- a/backend/src/routes/index.js +++ b/backend/src/routes/index.js @@ -7,7 +7,6 @@ import approvalRoutes from "../modules/approvals/approvals.routes.js"; import workflowRoutes from "../modules/workflows/workflows.routes.js"; import analyticsRoutes from "../modules/analytics/analytics.routes.js"; import notificationRoutes from "../modules/notifications/notifications.routes.js"; -import aiRoutes from "../modules/ai/ai.routes.js"; //these are routes @@ -20,6 +19,5 @@ router.use("/approvals", approvalRoutes); router.use("/workflows", workflowRoutes); router.use("/analytics", analyticsRoutes); router.use("/notifications", notificationRoutes); -router.use("/ai", aiRoutes); export default router; diff --git a/backend/src/services/ocr.service.js b/backend/src/services/ocr.service.js deleted file mode 100644 index e0d4edf..0000000 --- a/backend/src/services/ocr.service.js +++ /dev/null @@ -1,9 +0,0 @@ -export async function parseReceiptWithOcr(_base64Image) { - return { - merchant: "Sample Store", - amount: 1299.5, - currency: "INR", - category: "Travel", - expenseDate: new Date().toISOString().slice(0, 10) - }; -} diff --git a/backend/src/services/riskScoring.service.js b/backend/src/services/riskScoring.service.js deleted file mode 100644 index 9efeab4..0000000 --- a/backend/src/services/riskScoring.service.js +++ /dev/null @@ -1,7 +0,0 @@ -export function scoreExpenseRisk(expense) { - let score = 10; - if (Number(expense.amount_company || 0) > 50000) score += 45; - if (expense.category === "Other") score += 10; - if (!expense.receipt_url) score += 20; - return { score, label: score >= 60 ? "HIGH" : score >= 30 ? "MEDIUM" : "LOW" }; -} diff --git a/backend/src/services/smartApproval.service.js b/backend/src/services/smartApproval.service.js deleted file mode 100644 index 89a62c8..0000000 --- a/backend/src/services/smartApproval.service.js +++ /dev/null @@ -1,5 +0,0 @@ -export function suggestApprovalPath({ amountCompany, managerFirstEnabled }) { - if (managerFirstEnabled) return ["MANAGER", "FINANCE"]; - if (amountCompany > 100000) return ["MANAGER", "FINANCE", "ADMIN"]; - return ["MANAGER", "FINANCE"]; -}