-
Notifications
You must be signed in to change notification settings - Fork 253
Completed Navbar , auth (frontend as well as backend ) #291
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Completed Navbar , auth (frontend as well as backend ) #291
Conversation
WalkthroughIntroduces Tailwind/ShadCN-style UI configuration, utilities, and themed styles; adds animated navbar components and integrates a Navbar page. Implements Signin/Signup pages and routes. Adds a Node/Express/Mongo backend with JWT-based Register/Login endpoints and routing. Configures project tooling (PostCSS, Tailwind, jsconfig) and backend bootstrapping. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant U as User
participant FE as Frontend (Signin/Signup)
participant BE as Backend (/api/user)
participant C as Controller (user.controller)
participant DB as MongoDB (User)
rect rgb(245,248,255)
note over U,FE: Signup flow
U->>FE: Submit firstname, lastname, email, password
FE->>BE: POST /Register {username, email, password}
BE->>C: RegisterUser
C->>DB: Find existing by email/username
alt exists
C-->>BE: 404 "try Login"
BE-->>FE: 404
else new
C->>DB: Create user (hashed password)
C-->>BE: 200 { message, user }
BE-->>FE: 200
end
end
rect rgb(240,255,245)
note over U,FE: Login flow
U->>FE: Submit email, password
FE->>BE: POST /Login {email, password}
BE->>C: LoginUser
C->>DB: Find user by email
alt not found or wrong password
C-->>BE: 404
BE-->>FE: 404
else valid
C-->>BE: 200 { user, jwt }
BE-->>FE: 200
FE->>FE: navigate("/")
end
end
sequenceDiagram
autonumber
participant V as Viewport/Scroll
participant NB as Navbar (wrapper)
participant Body as NavBody
participant M as MobileNav
participant T as MobileNavToggle
V-->>NB: scrollY change
NB->>Body: visible=true when scrollY>100
Body->>Body: animate blur/shadow/width/offset
T->>M: toggle open/close
M->>M: AnimatePresence mount/unmount menu
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Assessment against linked issues
Poem
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 24
🧹 Nitpick comments (29)
eduaid_web_backend/.gitignore (1)
1-2
: Add common backend ignores (.env.*, logs, build artifacts).Helps prevent leaks and noise across environments.
node_modules -.env +.env +.env.* +logs +*.log +npm-debug.log* +yarn-error.log* +coverage +dist +build +.DS_Storeeduaid_web_backend/package.json (3)
7-8
: Avoid double-loading dotenv.You have
nodemon -r dotenv/config
and also calldotenv.config()
in code. Keep one."scripts": { - "dev": "nodemon -r dotenv/config index.js" + "dev": "nodemon index.js" },Or remove the in-code
dotenv.config()
instead.
11-21
: Trim unnecessary deps: Express 5 includes body parsing.
body-parser
is redundant; preferexpress.json()
andexpress.urlencoded()
."dependencies": { "axios": "^1.11.0", "bcrypt": "^6.0.0", - "body-parser": "^2.2.0", "cookie-parser": "^1.4.7", "cors": "^2.8.5", "dotenv": "^17.2.1", "express": "^5.1.0", "jsonwebtoken": "^9.0.2", "mongoose": "^8.18.0" },
1-25
: Add production start script and Node engine constraint.Clarifies how to run in prod and constrains Node for Express 5/Mongoose 8.
"type": "module", "scripts": { - "dev": "nodemon -r dotenv/config index.js" + "dev": "nodemon index.js", + "start": "node index.js" }, @@ "license": "ISC", + "engines": { + "node": ">=18.18" + },eduaid_web/tailwind.config.js (1)
3-3
: Use string form for darkMode unless you’re customizing the selector
darkMode: ["class"]
is typically used as["class", ".your-selector"]
. If you’re not customizing, switch to"class"
to avoid config ambiguity.- darkMode: ["class"], + darkMode: "class",eduaid_web/src/pages/Home.jsx (2)
44-46
: Navbar placement: consider elevating to a layout to show on all pagesMounting the navbar inside Home means it disappears on other routes. Consider rendering it in
App
(outside<Routes>
) or a shared layout so/signin
,/signup
, etc., also have it.
44-44
: Mobile viewport sizing nit
h-screen
can be jittery on mobile browsers. Prefermin-h-screen
for smoother behavior.- <div className="popup w-screen h-screen bg-[#000000] "> + <div className="popup w-screen min-h-screen bg-[#000000] ">eduaid_web_backend/index.js (2)
9-10
: Tighten CORS for auth endpointsOpen CORS is fine for local dev, but for JWT auth you should restrict origins (and enable credentials only if using cookies).
- app.use(cors()); - app.use(express.json()); + const allowedOrigins = (process.env.CORS_ORIGIN || "http://localhost:5173,http://localhost:3000").split(","); + app.use(cors({ origin: allowedOrigins, credentials: false })); + app.use(express.json({ limit: "1mb" }));
2-2
: Remove unused import
express
is not used in this file.-import express from "express";
eduaid_web_backend/app.js (2)
24-24
: cookieParser appears unusedEither remove it or actually set/parse httpOnly cookies for JWTs.
-app.use(cookieParser()); +// app.use(cookieParser()); // enable when using cookies (httpOnly, secure, sameSite)
1-4
: Harden app with basic security middlewareHelmet and a global rate limit (especially for auth) are advisable.
+import helmet from "helmet"; +import rateLimit from "express-rate-limit"; const app = express(); +app.use(helmet()); +app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100, standardHeaders: true, legacyHeaders: false }));eduaid_web_backend/routes/user.routes.js (2)
4-4
: Remove debug log from routerAvoid noisy console output in production.
-console.log("aaya hu routes ");
5-6
: Normalize route casing to lowercaseConventional, avoids surprises on case-sensitive clients.
-userrouter.route("/Register").post(RegisterUser); -userrouter.route("/Login").post(LoginUser); +userrouter.route("/register").post(RegisterUser); +userrouter.route("/login").post(LoginUser);eduaid_web_backend/DB/user.db.js (2)
4-11
: Minor: redundant index on usernameunique already creates an index; you can drop the separate index flag.
username: { type: String, required: true, unique: true, lowercase: true, trim: true, - index: true, },
28-29
: Follow-up: ensure controllers never return passwordWith select: false, prefer explicit projections (e.g., .select("+password") only when needed). Review controller responses to omit sensitive fields.
eduaid_web/src/pages/Navbar.jsx (2)
16-16
: Remove stray debug log.Leftover console.log will clutter prod consoles.
- console.log("aaefe"); + // no-op
15-15
: Consider a clearer component name.NavbarDemo → AppNavbar/PrimaryNavbar reads better in production.
-export default function NavbarDemo() { +export default function AppNavbar() {eduaid_web/src/pages/Signup.jsx (2)
52-57
: Improve form UX and semantics (autocomplete, names, minLength).Better browser autofill and basic client-side validation.
- <Input id="firstname" placeholder="Tyler" type="text" required /> + <Input id="firstname" name="firstname" placeholder="Tyler" type="text" autoComplete="given-name" required /> @@ - <Input id="lastname" placeholder="Durden" type="text" required /> + <Input id="lastname" name="lastname" placeholder="Durden" type="text" autoComplete="family-name" required /> @@ - <Input id="email" placeholder="[email protected]" type="email" required /> + <Input id="email" name="email" placeholder="[email protected]" type="email" autoComplete="email" required /> @@ - <Input id="password" placeholder="••••••••" type="password" required /> + <Input id="password" name="password" placeholder="••••••••" type="password" autoComplete="new-password" minLength={8} required />Also applies to: 61-66
46-47
: Tiny copy tweak for consistency.“Sign up for EduAid” reads better.
- Signup to EduAid + Sign up for EduAideduaid_web/src/components/ui/Input.jsx (1)
6-6
: Fix typo in comment.- const radius = 100; // change this to increase the rdaius of the hover effect + const radius = 100; // change this to increase the radius of the hover effecteduaid_web/src/pages/Signin.jsx (2)
28-29
: Correct log/copy: this is Signin, not Signup.- console.error("Signup error:", err); - alert(`Signup failed.${err.message}`); + console.error("Signin error:", err); + alert(`Signin failed. ${err.message}`);
44-49
: Improve form UX (autocomplete and min length).- <Input id="email" placeholder="[email protected]" type="email" required /> + <Input id="email" name="email" placeholder="[email protected]" type="email" autoComplete="email" required /> @@ - <Input id="password" placeholder="••••••••" type="password" required /> + <Input id="password" name="password" placeholder="••••••••" type="password" autoComplete="current-password" minLength={8} required />eduaid_web/src/index.css (1)
29-83
: Consolidate base layers to one block.You can put
:root
,.dark
, and the global*
/body
applies into a single@layer base
for clarity and to avoid brace mismatches.Also applies to: 87-94
eduaid_web_backend/Controller/user.controller.js (3)
16-21
: Name clarity and config-ize salt rounds.
- Rename to
hashedPassword
.- Pull salt rounds from config/env.
- const hashpassword = await bcrypt.hash(password, 10); + const SALT_ROUNDS = Number(process.env.BCRYPT_SALT_ROUNDS ?? 10); + const hashedPassword = await bcrypt.hash(password, SALT_ROUNDS); @@ - password: hashpassword, + password: hashedPassword,
54-58
: JWT secret presence and token transport.
- Ensure
process.env.Authentication_for_jsonwebtoken
is defined at startup; fail fast if missing.- Prefer httpOnly, secure cookies for token transport to mitigate XSS.
Would you like a small middleware snippet to assert the secret at boot and set a cookie (
SameSite=Lax
,Secure
in production)?
1-4
: Schema/indexes: enforce uniqueness on email and username.Make sure
UserSchema
hasunique: true
onusername
and appropriate indexes to back up the conflict check.eduaid_web/src/components/ui/Resizable-navbar.jsx (3)
50-67
: Width/minWidth animation may squish content.Animating
width
to 40% withminWidth: 800px
can create layout thrash and overflow. Consider a fixedmax-w-*
with opacity/blur/shadow animations instead.
193-201
: Brand link target and alt text.Use
/
instead of#
and a more descriptive alt.- <a - href="#" + <a + href="/" @@ - <img - src="https://assets.aceternity.com/logo-dark.png" - alt="logo" + <img + src="https://assets.aceternity.com/logo-dark.png" + alt="EduAid logo"
216-223
: Minor: remove duplicate classes and tighten variants.
bg-white
appears twice and straybutton
class is unused.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
⛔ Files ignored due to path filters (2)
eduaid_web/package-lock.json
is excluded by!**/package-lock.json
eduaid_web_backend/package-lock.json
is excluded by!**/package-lock.json
📒 Files selected for processing (23)
eduaid_web/components.json
(1 hunks)eduaid_web/jsconfig.json
(1 hunks)eduaid_web/package.json
(2 hunks)eduaid_web/postcss.config.js
(1 hunks)eduaid_web/src/App.js
(2 hunks)eduaid_web/src/components/ui/Input.jsx
(1 hunks)eduaid_web/src/components/ui/Label.jsx
(1 hunks)eduaid_web/src/components/ui/Resizable-navbar.jsx
(1 hunks)eduaid_web/src/index.css
(1 hunks)eduaid_web/src/lib/utils.js
(1 hunks)eduaid_web/src/pages/Home.jsx
(2 hunks)eduaid_web/src/pages/Navbar.jsx
(1 hunks)eduaid_web/src/pages/Signin.jsx
(1 hunks)eduaid_web/src/pages/Signup.jsx
(1 hunks)eduaid_web/tailwind.config.js
(1 hunks)eduaid_web_backend/.gitignore
(1 hunks)eduaid_web_backend/Controller/user.controller.js
(1 hunks)eduaid_web_backend/DB/connect.db.js
(1 hunks)eduaid_web_backend/DB/user.db.js
(1 hunks)eduaid_web_backend/app.js
(1 hunks)eduaid_web_backend/index.js
(1 hunks)eduaid_web_backend/package.json
(1 hunks)eduaid_web_backend/routes/user.routes.js
(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (12)
eduaid_web/src/App.js (2)
eduaid_web/src/pages/Signin.jsx (1)
Signin
(7-68)eduaid_web/src/pages/Signup.jsx (1)
Signup
(7-85)
eduaid_web_backend/index.js (2)
eduaid_web_backend/app.js (1)
app
(4-4)eduaid_web_backend/DB/connect.db.js (1)
connectDB
(5-13)
eduaid_web_backend/app.js (1)
eduaid_web_backend/routes/user.routes.js (1)
userrouter
(3-3)
eduaid_web_backend/routes/user.routes.js (1)
eduaid_web_backend/Controller/user.controller.js (2)
RegisterUser
(6-38)LoginUser
(39-65)
eduaid_web/src/pages/Home.jsx (1)
eduaid_web/src/pages/Navbar.jsx (1)
NavbarDemo
(15-96)
eduaid_web/src/pages/Signin.jsx (4)
eduaid_web/src/pages/Signup.jsx (3)
loading
(8-8)navigate
(9-9)handleSubmit
(11-37)eduaid_web/src/components/ui/Label.jsx (1)
Label
(6-14)eduaid_web/src/components/ui/Input.jsx (1)
Input
(5-47)eduaid_web/src/lib/utils.js (1)
cn
(4-6)
eduaid_web/src/components/ui/Input.jsx (1)
eduaid_web/src/lib/utils.js (1)
cn
(4-6)
eduaid_web/src/pages/Navbar.jsx (1)
eduaid_web/src/components/ui/Resizable-navbar.jsx (18)
Navbar
(13-42)Navbar
(13-42)NavBody
(44-75)NavBody
(44-75)NavbarLogo
(190-203)NavbarLogo
(190-203)NavItems
(77-108)NavItems
(77-108)NavbarButton
(205-233)NavbarButton
(205-233)MobileNav
(110-141)MobileNav
(110-141)MobileNavHeader
(143-153)MobileNavHeader
(143-153)MobileNavToggle
(179-188)MobileNavToggle
(179-188)MobileNavMenu
(155-177)MobileNavMenu
(155-177)
eduaid_web/src/components/ui/Label.jsx (1)
eduaid_web/src/lib/utils.js (1)
cn
(4-6)
eduaid_web_backend/Controller/user.controller.js (1)
eduaid_web_backend/DB/user.db.js (1)
UserModel
(28-28)
eduaid_web/src/pages/Signup.jsx (4)
eduaid_web/src/pages/Signin.jsx (3)
loading
(8-8)navigate
(9-9)handleSubmit
(11-33)eduaid_web/src/components/ui/Label.jsx (1)
Label
(6-14)eduaid_web/src/components/ui/Input.jsx (1)
Input
(5-47)eduaid_web/src/lib/utils.js (1)
cn
(4-6)
eduaid_web/src/components/ui/Resizable-navbar.jsx (1)
eduaid_web/src/lib/utils.js (1)
cn
(4-6)
🔇 Additional comments (10)
eduaid_web/tailwind.config.js (1)
7-49
: Theme token mapping looks solid and aligns with CSS varsColor tokens, chart palette, backgroundImage, and radius extensions are coherent with
src/index.css
. Good setup for light/dark theming.Also applies to: 50-57
eduaid_web/src/App.js (1)
9-10
: Auth routes added correctly
/signin
and/signup
are wired and will work underHashRouter
. LGTM.Also applies to: 20-21
eduaid_web_backend/app.js (1)
30-30
: ESM support verified. Thepackage.json
ineduaid_web_backend
has"type": "module"
, so theexport { app };
syntax is valid.eduaid_web/src/lib/utils.js (1)
4-6
: LGTM: cn wrapper is correctMatches common shadcn pattern and will de-dupe Tailwind classes.
eduaid_web/components.json (2)
1-21
: LGTM: shadcn-style config and aliases look consistentWorks with JS (tsx: false), lucide, and Tailwind setup.
6-12
: Referenced Tailwind config and CSS paths exist
Verified thateduaid_web/tailwind.config.js
andeduaid_web/src/index.css
are present—no further action required.eduaid_web/src/components/ui/Label.jsx (1)
6-17
: LGTM — solid forwardRef wrapper with class merge.Clean Radix wrapper, proper displayName, and cn usage look good.
eduaid_web/src/components/ui/Input.jsx (1)
3-3
: Import is correct: the project depends on “motion” v12.23.12, so keep theimport { useMotionTemplate, useMotionValue, motion } from "motion/react"
as-is.eduaid_web/src/index.css (1)
87-94
: Fix: Unclosed @layer block (build-breaking).The second
@layer base
block isn’t closed. This will break Tailwind/PostCSS parsing.Apply:
@layer base { * { @apply border-border; } body { @apply bg-background text-foreground; } -} +} +}Likely an incorrect or invalid review comment.
eduaid_web/src/components/ui/Resizable-navbar.jsx (1)
1-8
: Motion package confirmed; no framer-motion detected.eduaid_web/package.json lists “motion”@^12.23.12 and contains no framer-motion dependency, so imports from motion/react are valid.
app.use( | ||
cors({ | ||
origin: "*", | ||
credentials: true, | ||
}) | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix CORS: credentials=true with "*" origin is invalid and will be blocked by browsers
Restrict origin and mirror it dynamically; also explicitly allow headers/methods.
Apply:
-app.use(
- cors({
- origin: "*",
- credentials: true,
- })
-);
+const allowedOrigins = [process.env.FRONTEND_URL, "http://localhost:5173"].filter(Boolean);
+app.use(
+ cors({
+ origin: (origin, cb) => {
+ if (!origin || allowedOrigins.includes(origin)) return cb(null, true);
+ return cb(new Error("Not allowed by CORS"));
+ },
+ credentials: true,
+ methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
+ allowedHeaders: ["Content-Type", "Authorization"],
+ })
+);
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
app.use( | |
cors({ | |
origin: "*", | |
credentials: true, | |
}) | |
); | |
const allowedOrigins = [process.env.FRONTEND_URL, "http://localhost:5173"].filter(Boolean); | |
app.use( | |
cors({ | |
origin: (origin, cb) => { | |
if (!origin || allowedOrigins.includes(origin)) return cb(null, true); | |
return cb(new Error("Not allowed by CORS")); | |
}, | |
credentials: true, | |
methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"], | |
allowedHeaders: ["Content-Type", "Authorization"], | |
}) | |
); |
🤖 Prompt for AI Agents
In eduaid_web_backend/app.js around lines 6 to 11, the CORS config incorrectly
uses credentials: true with origin: "*", which browsers will block; replace the
static "*" origin with a dynamic origin function that checks the request Origin
against an allowlist and returns the request Origin when allowed (or
rejects/returns false when not allowed), keep credentials: true, and explicitly
add allowed headers and methods (e.g., allowedHeaders:
['Content-Type','Authorization', ...], methods:
['GET','POST','PUT','DELETE','OPTIONS']) and any optionsSuccessStatus you need
so preflight requests succeed.
}) | ||
); | ||
app.use(cookieParser()); | ||
app.use(express.static("Public")); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Verify static directory case/path
Ensure the directory exists (case-sensitive filesystems will 404).
🏁 Script executed:
#!/bin/bash
set -euo pipefail
if [ -d "eduaid_web_backend/Public" ]; then
echo "OK: eduaid_web_backend/Public exists"
else
echo "WARN: eduaid_web_backend/Public not found; verify path/case or update app.use(express.static(...))"
fi
Length of output: 265
Fix static directory path/casing in app.js
The call at eduaid_web_backend/app.js:25—app.use(express.static("Public"))
—points to a non-existent folder on case-sensitive filesystems. Rename your public
directory to Public
or update the code to express.static("public")
.
🤖 Prompt for AI Agents
In eduaid_web_backend/app.js around line 25, the static middleware points to
"Public" which will fail on case-sensitive filesystems; change the path to the
actual directory name by either renaming the filesystem folder to "Public" or
(recommended) update the code to use "public" so it matches the existing
directory.
const { username, email, password } = req.body; | ||
console.log(username, email, password); | ||
const user = await UserModel.findOne({ | ||
$or: [{ email }, { username }], | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Validate and normalize inputs.
Add basic required-field checks and normalize email to lowercase to avoid duplicates and inconsistent lookups.
- const { username, email, password } = req.body;
+ const { username, email, password } = req.body ?? {};
+ if (!username || !email || !password) {
+ return res.status(400).json({ message: "username, email, and password are required.", code: "BAD_REQUEST" });
+ }
+ const normalizedEmail = String(email).trim().toLowerCase();
@@
- const user = await UserModel.findOne({
- $or: [{ email }, { username }],
+ const user = await UserModel.findOne({
+ $or: [{ email: normalizedEmail }, { username }],
});
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const { username, email, password } = req.body; | |
console.log(username, email, password); | |
const user = await UserModel.findOne({ | |
$or: [{ email }, { username }], | |
}); | |
const { username, email, password } = req.body ?? {}; | |
if (!username || !email || !password) { | |
return res.status(400).json({ | |
message: "username, email, and password are required.", | |
code: "BAD_REQUEST" | |
}); | |
} | |
const normalizedEmail = String(email).trim().toLowerCase(); | |
console.log(username, email, password); | |
const user = await UserModel.findOne({ | |
$or: [{ email: normalizedEmail }, { username }], | |
}); |
🤖 Prompt for AI Agents
In eduaid_web_backend/Controller/user.controller.js around lines 8 to 12, the
request body fields are used directly leading to possible missing required
fields and inconsistent email lookups; add validation to ensure username, email,
and password are present and return a 400 response if any are missing, normalize
the email by trimming and converting to lowercase before use, trim the username
(and optionally normalize it) to avoid whitespace issues, and use these
normalized values in the UserModel.findOne query to prevent
duplicate/inconsistent matches.
const RegisterUser = async (req, res) => { | ||
try { | ||
const { username, email, password } = req.body; | ||
console.log(username, email, password); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do not log plaintext credentials.
console.log(username, email, password)
leaks PII and secrets.
- console.log(username, email, password);
+ // Do not log credentials in any environment
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
console.log(username, email, password); | |
// Do not log credentials in any environment |
🤖 Prompt for AI Agents
In eduaid_web_backend/Controller/user.controller.js around line 9, remove the
console.log(username, email, password) that prints plaintext credentials;
replace it with safe logging by never logging the password, and if you must
record user identifiers log only a non-sensitive identifier or masked/hashed
email (e.g., mask local part) using the app logger at appropriate level; ensure
no PII or secrets are written in development or production logs and add a
comment noting passwords must never be logged.
return res.status(404).json({ message: "User exists already ,do login" }); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Use correct HTTP status codes and consistent error shapes.
- User exists → 409 Conflict (not 404).
- Internal errors → 500 (not 404).
- Prefer a consistent
{ message, code }
and booleansuccess
.
- return res.status(404).json({ message: "User exists already ,do login" });
+ return res.status(409).json({ message: "User already exists. Please log in.", code: "USER_EXISTS" });
@@
- return res
- .status(404)
- .json({ message: `Having error in the registering user ${error}` });
+ return res
+ .status(500)
+ .json({ message: "Error registering user.", code: "REGISTER_FAILED" });
Also applies to: 25-26, 35-36
🤖 Prompt for AI Agents
In eduaid_web_backend/Controller/user.controller.js around lines 14-15 (and also
apply same fix to 25-26 and 35-36): responses use incorrect HTTP status codes
and inconsistent shapes; change the "User exists" response to use 409 Conflict,
change any internal/error responses to 500, and standardize all JSON responses
to the shape { success: boolean, message: string, code: number } (set
success:false for error paths and include the numeric HTTP status code in code);
update each return res.status(...) call accordingly so the status and JSON body
match (e.g., res.status(409).json({ success:false, message: "...", code:409 }))
and apply same pattern to the other mentioned lines.
<div className="flex items-center gap-4"> | ||
<Link to={'/signin'}><NavbarButton variant="primary">Sign in </NavbarButton></Link> | ||
<Link to={'/signup'}><NavbarButton variant="primary">Sign up </NavbarButton></Link> | ||
</div> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix nested anchor elements (Link wrapping an ).
NavbarButton renders an anchor by default; wrapping it in nests anchors (invalid HTML, accessibility issue). Render NavbarButton as Link instead.
- <div className="flex items-center gap-4">
- <Link to={'/signin'}><NavbarButton variant="primary">Sign in </NavbarButton></Link>
- <Link to={'/signup'}><NavbarButton variant="primary">Sign up </NavbarButton></Link>
- </div>
+ <div className="flex items-center gap-4">
+ <NavbarButton as={Link} to="/signin" variant="primary">Sign in</NavbarButton>
+ <NavbarButton as={Link} to="/signup" variant="primary">Sign up</NavbarButton>
+ </div>
- <Link to={"/signin"}>
- <NavbarButton
- onClick={() => setIsMobileMenuOpen(false)}
- variant="primary"
- className="w-full"
- >
- Sign in
- </NavbarButton>
- </Link>
+ <NavbarButton
+ as={Link}
+ to="/signin"
+ onClick={() => setIsMobileMenuOpen(false)}
+ variant="primary"
+ className="w-full"
+ >
+ Sign in
+ </NavbarButton>
- <Link to={"/signup"}>
- <NavbarButton
- onClick={() => setIsMobileMenuOpen(false)}
- variant="primary"
- className="w-full"
- >
- Sign up
- </NavbarButton>
- </Link>
+ <NavbarButton
+ as={Link}
+ to="/signup"
+ onClick={() => setIsMobileMenuOpen(false)}
+ variant="primary"
+ className="w-full"
+ >
+ Sign up
+ </NavbarButton>
Also applies to: 72-89
import { useState } from "react"; | ||
import { Label } from "../components/ui/Label.jsx"; | ||
import { Input } from "../components/ui/Input.jsx"; | ||
import { cn } from "../lib/utils.js"; | ||
import { useNavigate } from "react-router-dom"; | ||
|
||
export function Signin() { | ||
const [loading, setLoading] = useState(false); | ||
const navigate=useNavigate(); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Handle non-2xx responses and avoid hardcoded API URL.
Mirror Signup fixes: env-based base URL, res.ok check, and optional credentials for cookie auth.
import { useState } from "react";
import { Label } from "../components/ui/Label.jsx";
import { Input } from "../components/ui/Input.jsx";
import { cn } from "../lib/utils.js";
import { useNavigate } from "react-router-dom";
+const API_BASE = import.meta.env.VITE_API_BASE_URL || "http://localhost:1400";
+
export function Signin() {
const [loading, setLoading] = useState(false);
const navigate=useNavigate();
@@
- const res = await fetch("http://localhost:1400/api/user/Login", {
+ const res = await fetch(`${API_BASE}/api/user/Login`, {
method: "POST",
headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ email, password }),
+ body: JSON.stringify({ email, password }),
+ // credentials: "include", // if backend issues httpOnly cookies
});
- const data = await res.json();
- navigate('/');
+ const data = await res.json().catch(() => ({}));
+ if (!res.ok) {
+ throw new Error(data?.message || "Signin failed");
+ }
+ // If token-based auth is used, store token here (e.g., localStorage) or set context.
+ navigate("/");
Also applies to: 19-27
🤖 Prompt for AI Agents
In eduaid_web/src/pages/Signin.jsx around lines 1-10 and also apply to lines
19-27, the fetch call uses a hardcoded API URL and doesn't handle non-2xx
responses or include credentials; replace the hardcoded URL with a base URL from
an environment variable (e.g. process.env.REACT_APP_API_BASE_URL), build the
signin endpoint from that base, call fetch with credentials: 'include' (or a
configurable option) for cookie auth, check response.ok and treat non-2xx
responses as errors by reading and surfacing the response body (json/text)
before throwing or setting error state, and ensure loading state is cleared in
both success and error paths.
import { useState } from "react"; | ||
import { Label } from "../components/ui/Label.jsx"; | ||
import { Input } from "../components/ui/Input.jsx"; | ||
import { cn } from "../lib/utils.js"; | ||
import { useNavigate } from "react-router-dom"; | ||
|
||
export function Signup() { | ||
const [loading, setLoading] = useState(false); | ||
const navigate=useNavigate() | ||
|
||
const handleSubmit = async (e) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Handle non-2xx responses and avoid hardcoded API URL.
- Use env-based API base; avoid hardcoding localhost.
- Check res.ok; surface server error and only navigate on success.
- If using httpOnly cookies, include credentials.
import { useState } from "react";
import { Label } from "../components/ui/Label.jsx";
import { Input } from "../components/ui/Input.jsx";
import { cn } from "../lib/utils.js";
import { useNavigate } from "react-router-dom";
+const API_BASE = import.meta.env.VITE_API_BASE_URL || "http://localhost:1400";
+
export function Signup() {
const [loading, setLoading] = useState(false);
const navigate=useNavigate()
const handleSubmit = async (e) => {
@@
- try {
- const res = await fetch("http://localhost:1400/api/user/Register", {
+ try {
+ const res = await fetch(`${API_BASE}/api/user/Register`, {
method: "POST",
headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ username, email, password }),
+ body: JSON.stringify({ username, email, password }),
+ // If backend sets httpOnly cookies, uncomment the next line and enable CORS credentials server-side:
+ // credentials: "include",
});
- const data = await res.json();
- console.log("Signup response:", data);
- navigate('/');
+ const data = await res.json().catch(() => ({}));
+ if (!res.ok) {
+ throw new Error(data?.message || "Signup failed");
+ }
+ navigate("/");
} catch (err) {
- console.error("Signup error:", err);
- alert(`Signup failed.${err.message}`);
+ console.error("Signup error:", err);
+ alert(`Signup failed. ${err.message}`);
} finally {
setLoading(false);
}
};
Also applies to: 23-31
🤖 Prompt for AI Agents
In eduaid_web/src/pages/Signup.jsx around lines 1-11 (and also apply changes to
lines 23-31), replace the hardcoded localhost URL with a runtime env-based API
base (e.g. process.env.REACT_APP_API_BASE or import from config), call fetch
with credentials: 'include' when you expect httpOnly cookies, await the response
and check res.ok before navigating, parse the error body (or status text) and
surface it to the user (and set loading false) on non-2xx responses, and only
call navigate on successful responses; ensure loading state is toggled correctly
on both success and failure paths.
const email = e.target.email.value; | ||
const password = e.target.password.value; | ||
const username= firstname+ " "+ lastname; | ||
console.log(username,email,password); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do not log credentials — removes password from console.
Credentials in logs are a security risk.
- console.log(username,email,password);
+ // avoid logging PII/credentials
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
console.log(username,email,password); | |
// avoid logging PII/credentials |
🤖 Prompt for AI Agents
In eduaid_web/src/pages/Signup.jsx around line 21, the current console.log
prints username, email and password; remove the password from any logging and
either delete the console.log entirely or change it to only log non-sensitive
fields (e.g., username or email) for debugging. Ensure no credentials (password
or any authentication tokens) are written to console, replace with a sanitized
message if needed, and run tests to confirm no other logs leak sensitive data.
} | ||
}, | ||
plugins: [], | ||
plugins: [require("tailwindcss-animate")], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ESM config mixed with CommonJS require will break Tailwind config loading
You’re exporting with ESM (export default
) but using require(...)
for the plugin. Import the plugin and reference it instead.
- plugins: [require("tailwindcss-animate")],
+ plugins: [animate],
Add this import at the top of the file:
import animate from "tailwindcss-animate";
🤖 Prompt for AI Agents
In eduaid_web/tailwind.config.js around line 60, the file uses ESM export but
mixes CommonJS require for the plugin; change to an ESM import and reference
that import in the plugins array. At the top of the file add an import for the
plugin (import animate from "tailwindcss-animate") and then replace
require("tailwindcss-animate") in the plugins array with the imported animate
identifier.
@yatikakain mam can you please look into it and guide me further regarding this |
This pr creates auth login , signup ,
I also made a smooth backend and i also connect with frontend too ,
I also added the navbar and login and signup pages as well
anybody can check it and give me suggestion to
setup
create env file and add yout mongodb and jwt security pass
/Register and /Login for auth
Fix #290 #198 #174
Summary by CodeRabbit
New Features
Chores