From 6de436f798f1e5d1a8133914a1f3ce578a67b609 Mon Sep 17 00:00:00 2001 From: Muhammad-Mubashar516 Date: Fri, 26 Sep 2025 20:14:21 +0500 Subject: [PATCH 1/2] Setup MongoDB Atlas connection and environment configuration --- server/.env | 2 + server/.env.example | 1 - server/config/db.js | 22 ++++---- server/package.json | 124 ++++++++++++++++++++++---------------------- server/server.js | 9 ++-- server/yarn.lock | 21 +++++--- 6 files changed, 94 insertions(+), 85 deletions(-) create mode 100644 server/.env delete mode 100644 server/.env.example diff --git a/server/.env b/server/.env new file mode 100644 index 00000000..9da0f292 --- /dev/null +++ b/server/.env @@ -0,0 +1,2 @@ +MONGO_URI=mongodb+srv://mubashar:12345@cluster0.xzy4zte.mongodb.net/BlogApp?retryWrites=true&w=majority&appName=Cluster0 +PORT=5001 diff --git a/server/.env.example b/server/.env.example deleted file mode 100644 index 4522065b..00000000 --- a/server/.env.example +++ /dev/null @@ -1 +0,0 @@ -MONGO_URI = mongodb://127.0.0.1:27017/BlogApp \ No newline at end of file diff --git a/server/config/db.js b/server/config/db.js index 28343a4a..34db557b 100644 --- a/server/config/db.js +++ b/server/config/db.js @@ -1,12 +1,16 @@ const mongoose = require("mongoose"); -require('dotenv').config(); +require("dotenv").config(); +mongoose.set("strictQuery", false); -mongoose.set('strictQuery', false); - - -mongoose.connect(process.env.MONGO_URI || "mongodb://mongo:27017/Blog").then(()=>{ - console.log("connected!"); -}).catch((err)=>{ - console.log(err); -}) \ No newline at end of file +mongoose + .connect(process.env.MONGO_URI, { + useNewUrlParser: true, + useUnifiedTopology: true, + }) + .then(() => { + console.log("✅ MongoDB Atlas Connected!"); + }) + .catch((err) => { + console.error("❌ MongoDB Connection Error:", err.message); + }); diff --git a/server/package.json b/server/package.json index 0bc1d46f..036a9665 100644 --- a/server/package.json +++ b/server/package.json @@ -1,83 +1,83 @@ { - - + + "name": "blogapp", - - + + "version": "1.0.0", - - + + "description": "", - - + + "main": "server.js", - - + + "scripts": { - - - - + + + + "start": "nodemon server.js", - - - - + + + + "test": "echo \"Error: no test specified\" && exit 1" - - + + }, - - + + "author": "khushi patel", - - + + "license": "ISC", - - + + "devDependencies": { - - - - + + + + "nodemon": "^2.0.16" - - + + }, - - + + "dependencies": { - - - - + + + + "bcryptjs": "^2.4.3", - - - - + + + + "cors": "^2.8.5", - - - - - "dotenv": "^16.5.0", - - - - + + + + + "dotenv": "^16.6.1", + + + + "express": "^4.18.1", - - - - + + + + "helmet": "^8.1.0", - - - - - "mongoose": "^6.3.4" - - + + + + + "mongoose": "^6.13.8" + + } } diff --git a/server/server.js b/server/server.js index d9e8b048..ece1bb42 100644 --- a/server/server.js +++ b/server/server.js @@ -10,12 +10,12 @@ const app = express(); app.use(cors()); //setting helmet middleware -app.use(helmet( - { +app.use( + helmet({ contentSecurityPolicy: false, crossOriginEmbedderPolicy: false, - } -)); + }) +); app.set("view engine", "ejs"); app.use(express.json()); @@ -28,5 +28,4 @@ app.use("/api", (req, res, next) => { }); //define port - app.listen(5001, () => console.log("app started at 5001...")); diff --git a/server/yarn.lock b/server/yarn.lock index 6a549298..4665bd7a 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -1102,10 +1102,10 @@ destroy@1.2.0: resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -dotenv@^16.5.0: - version "16.5.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz" - integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== +dotenv@^16.6.1: + version "16.6.1" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== ee-first@1.1.1: version "1.1.1" @@ -1272,6 +1272,11 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +helmet@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz" + integrity sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -1416,10 +1421,10 @@ mongodb@4.17.2: "@aws-sdk/credential-providers" "^3.186.0" "@mongodb-js/saslprep" "^1.1.0" -mongoose@^6.3.4: - version "6.12.6" - resolved "https://registry.npmjs.org/mongoose/-/mongoose-6.12.6.tgz" - integrity sha512-VFxDnWj8esgswwplmpQYMT+lYcvuIhl76WDLz/vgp41/FOhBPM/n3GjyztK8R3r2ljsM6kudvKgqLhfcZEih1Q== +mongoose@^6.13.8: + version "6.13.8" + resolved "https://registry.npmjs.org/mongoose/-/mongoose-6.13.8.tgz" + integrity sha512-JHKco/533CyVrqCbyQsnqMpLn8ZCiKrPDTd2mvo2W7ygIvhygWjX2wj+RPjn6upZZgw0jC6U51RD7kUsyK8NBg== dependencies: bson "^4.7.2" kareem "2.5.1" From a6d4f0fc346a3bfd91cb5175d6ddb80d62742b11 Mon Sep 17 00:00:00 2001 From: Muhammad-Mubashar516 Date: Sun, 28 Sep 2025 20:05:53 +0500 Subject: [PATCH 2/2] fix: added signup & login functionality, updated controllers and blogs.js --- client/src/App.js | 1 + client/src/componets/Blogs.js | 50 ++++++++++----- client/src/componets/Login.js | 58 +++++++++-------- server/controller/user-contoller.js | 97 +++++++++++++++-------------- 4 files changed, 118 insertions(+), 88 deletions(-) diff --git a/client/src/App.js b/client/src/App.js index e8d567a3..d6f9b6e3 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -28,6 +28,7 @@ function App() {
+ } /> }> }> }> diff --git a/client/src/componets/Blogs.js b/client/src/componets/Blogs.js index 959d98cb..91045dd9 100644 --- a/client/src/componets/Blogs.js +++ b/client/src/componets/Blogs.js @@ -4,32 +4,54 @@ import Blog from "./Blog"; import config from "../config"; const Blogs = () => { - const [blogs, setBlogs] = useState(); + const [blogs, setBlogs] = useState([]); + const [loading, setLoading] = useState(true); + const sendRequest = async () => { - const res = await axios - .get(`${config.BASE_URL}/api/blogs`) - .catch((err) => console.log(err)); - const data = await res.data; - return data; + try { + const res = await axios.get(`${config.BASE_URL}/api/blogs`); + return res.data; + } catch (err) { + console.error("API Error:", err.message); + return { blogs: [] }; + } }; + useEffect(() => { - sendRequest().then((data) => setBlogs(data.blogs)); + sendRequest().then((data) => { + if (data && data.blogs) { + setBlogs(data.blogs); + } else { + setBlogs([]); + } + setLoading(false); + }); }, []); - console.log(blogs); + + if (loading) { + return

Loading blogs...

; + } + return (
- {blogs && - blogs.map((blog, index) => ( + {blogs.length > 0 ? ( + blogs.map((blog) => ( - ))} + )) + ) : ( +

No blogs found.

+ )}
); }; diff --git a/client/src/componets/Login.js b/client/src/componets/Login.js index 8f06606b..378360d5 100644 --- a/client/src/componets/Login.js +++ b/client/src/componets/Login.js @@ -8,8 +8,8 @@ import config from "../config"; const Login = () => { const location = useLocation(); - const naviagte = useNavigate(); - const dispath = useDispatch(); + const navigate = useNavigate(); + const dispatch = useDispatch(); const { isSignupButtonPressed } = location.state || {}; const [inputs, setInputs] = useState({ @@ -18,47 +18,53 @@ const Login = () => { password: "", }); const [isSignup, setIsSignup] = useState(isSignupButtonPressed || false); + + useEffect(() => { + setIsSignup(isSignupButtonPressed); + }, [isSignupButtonPressed]); + const handleChange = (e) => { setInputs((prevState) => ({ ...prevState, [e.target.name]: e.target.value, })); }; - useEffect(() => { - setIsSignup(isSignupButtonPressed); - }, [isSignupButtonPressed]); + const sendRequest = async (type = "login") => { - console.log("inside send req"); - console.log(`${config.BASE_URL}/api/users/${type}`); - const res = await axios - .post(`${config.BASE_URL}/api/users/${type}`, { + try { + const res = await axios.post(`${config.BASE_URL}/api/users/${type}`, { name: inputs.name, email: inputs.email, password: inputs.password, - }) - .catch((err) => console.log(err)); - - const data = await res.data; - console.log("return"); - console.log(data); - return data; + }); + return res.data; + } catch (err) { + console.error("Error in request:", err.response?.data || err.message); + alert(err.response?.data?.message || "Invalid credentials or server error"); + } }; const handleSubmit = (e) => { e.preventDefault(); - console.log(inputs); if (isSignup) { - sendRequest("signup") - .then((data) => localStorage.setItem("userId", data.user._id)) - .then(() => dispath(authActions.login())) - .then(() => naviagte("/blogs")); + sendRequest("signup").then((data) => { + if (data?.user?._id) { + localStorage.setItem("userId", data.user._id); + dispatch(authActions.login()); + navigate("/blogs"); + } + }); } else { - sendRequest() - .then((data) => localStorage.setItem("userId", data.user._id)) - .then(() => dispath(authActions.login())) - .then(() => naviagte("/blogs")); + sendRequest("login").then((data) => { + if (data?.user?._id) { + localStorage.setItem("userId", data.user._id); + dispatch(authActions.login()); + navigate("/blogs"); + } + }); } }; + return (
@@ -85,7 +91,7 @@ const Login = () => { placeholder="Name" margin="normal" /> - )}{" "} + )} { - try { - const users = await User.find(); - if (!users || users.length === 0) { - return res.status(404).json(new ApiError(404, "Users not found")); - } - return res.status(200).json(new ApiResponse(200, { users }, "Users fetched successfully")); - } catch (err) { - console.error(err); - return res.status(500).json(new ApiError(500, "Server error while fetching users")); +// ✅ Get All Users +const getAllUser = async (req, res) => { + try { + const users = await User.find(); + if (!users || users.length === 0) { + return res.status(404).json({ message: "Users not found" }); } + return res.status(200).json({ users, message: "Users fetched successfully" }); + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Server error while fetching users" }); + } }; -const signUp = async (req, res, next) => { - const { name, email, password } = req.body; +// ✅ Signup +const signUp = async (req, res) => { + const { name, email, password } = req.body; - try { - const existingUser = await User.findOne({ email }); - if (existingUser) { - return res.status(400).json(new ApiError(400, "User already exists")); - } + try { + const existingUser = await User.findOne({ email }); + if (existingUser) { + return res.status(400).json({ message: "User already exists" }); + } - const hashedPassword = bcrypt.hashSync(password, 10); - const user = new User({ - name, - email, - password: hashedPassword, - blogs: [] - }); + const hashedPassword = bcrypt.hashSync(password, 10); + const user = new User({ + name, + email, + password: hashedPassword, + blogs: [] + }); - await user.save(); - return res.status(201).json(new ApiResponse(201, { user }, "User registered successfully")); - } catch (e) { - console.error(e); - return res.status(500).json(new ApiError(500, "Server error while signing up")); - } + await user.save(); + return res.status(201).json({ user, message: "User registered successfully" }); + } catch (e) { + console.error(e); + return res.status(500).json({ message: "Server error while signing up" }); + } }; -const logIn = async (req, res, next) => { - const { email, password } = req.body; - - try { - const existingUser = await User.findOne({ email }); - if (!existingUser) { - return res.status(404).json(new ApiError(404, "User not found")); - } +// ✅ Login +const logIn = async (req, res) => { + const { email, password } = req.body; - const isPasswordCorrect = bcrypt.compareSync(password, existingUser.password); - if (!isPasswordCorrect) { - return res.status(400).json(new ApiError(400, "Incorrect Password")); - } + try { + const existingUser = await User.findOne({ email }); + if (!existingUser) { + return res.status(404).json({ message: "User not found" }); + } - return res.status(200).json(new ApiResponse(200, { user: existingUser }, "Login successful")); - } catch (err) { - console.error(err); - return res.status(500).json(new ApiError(500, "Server error while logging in")); + const isPasswordCorrect = bcrypt.compareSync(password, existingUser.password); + if (!isPasswordCorrect) { + return res.status(400).json({ message: "Incorrect Password" }); } + + return res.status(200).json({ user: existingUser, message: "Login successful" }); + } catch (err) { + console.error(err); + return res.status(500).json({ message: "Server error while logging in" }); + } }; module.exports = { getAllUser, signUp, logIn };