برنامه نویسی
TODO – جامعه dev

npm i bcryptjs cors dotenv express joi jsonwebtoken mongoose nodemon
ساخت پوشه
کنترل کننده
- Controllers/AuthController.js
const User = require("../models/User");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const { registerSchema, loginSchema } = require("../utils/authValidation");
const generateToken = (userId) => {
return jwt.sign({ userId }, process.env.JWT_SECRET, { expiresIn: "7d" });
};
const registerUser = async (req, res) => {
const { error } = registerSchema.validate(req.body);
if (error) return res.status(400).json({ msg: error.details[0].message });
try {
let user = await User.findOne({ email: req.body.email });
if (user) return res.status(400).json({ msg: "User already exists" });
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(req.body.password, salt);
user = new User({ ...req.body, password: hashedPassword });
await user.save();
res.status(201).json({
msg: "User registered successfully",
token: generateToken(user.id),
user: { id: user.id, name: user.name, email: user.email },
});
} catch (error) {
res.status(500).json({ msg: "Server error" });
}
};
const loginUser = async (req, res) => {
const { error } = loginSchema.validate(req.body);
if (error) return res.status(400).json({ msg: error.details[0].message });
try {
const user = await User.findOne({ email: req.body.email });
if (!user) return res.status(400).json({ msg: "Invalid credentials" });
const isMatch = await bcrypt.compare(req.body.password, user.password);
if (!isMatch) return res.status(400).json({ msg: "Invalid credentials" });
res.json({
msg: "User login successfully",
token: generateToken(user.id),
user: { id: user.id, name: user.name, email: user.email },
});
} catch (error) {
res.status(500).json({ msg: "Server error" });
}
};
module.exports = { registerUser, loginUser };
کنترل کننده ها/TodoController.js
const Todo = require("../models/Todo");
const { todoSchema } = require("../utils/todoValidation");
const createTodo = async (req, res) => {
const { error } = todoSchema.validate(req.body);
if (error) return res.status(400).json({ msg: error.details[0].message });
try {
const todo = new Todo({ ...req.body, user: req.user });
await todo.save();
res.status(201).json(todo);
} catch (error) {
res.status(500).json({ msg: "Server error" });
}
};
const getTodos = async (req, res) => {
try {
const todos = await Todo.find({ user: req.user }).sort({ createdAt: -1 });
res.json(todos);
} catch (error) {
res.status(500).json({ msg: "Server error" });
}
};
const updateTodo = async (req, res) => {
const { error } = todoSchema.validate(req.body);
if (error) return res.status(400).json({ msg: error.details[0].message });
try {
const todo = await Todo.findOneAndUpdate(
{ _id: req.params.id, user: req.user },
req.body,
{ new: true }
);
if (!todo) return res.status(404).json({ msg: "Todo not found" });
res.json(todo);
} catch (error) {
res.status(500).json({ msg: "Server error" });
}
};
const deleteTodo = async (req, res) => {
try {
const todo = await Todo.findOneAndDelete({
_id: req.params.id,
user: req.user,
});
if (!todo) return res.status(404).json({ msg: "Todo not found" });
res.json({ msg: "Todo deleted successfully" });
} catch (error) {
res.status(500).json({ msg: "Server error" });
}
};
module.exports = { createTodo, getTodos, updateTodo, deleteTodo };
وسط نرم افزار:-
middleware/authmiddleware.js
const jwt = require("jsonwebtoken");
const protect = (req, res, next) => {
const authHeader = req.header("Authorization");
if (!authHeader || !authHeader.startsWith("Bearer ")) {
return res.status(401).json({ msg: "No token, authorization denied" });
}
const token = authHeader.split(" ")[1]; // Extract token after "Bearer "
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded.userId;
next();
} catch (error) {
res.status(401).json({ msg: "Invalid token" });
}
};
module.exports = protect;
**models:-**
مدل ها/all.js
const mongoose = require("mongoose");
const todoSchema = new mongoose.Schema(
{
user: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
title: { type: String, required: true },
description: { type: String },
priority: {
type: String,
enum: ["low", "medium", "high"],
default: "medium",
},
status: {
type: String,
enum: ["pending", "completed"],
default: "pending",
},
dueDate: { type: Date, required: true },
},
{ timestamps: true }
);
module.exports = mongoose.model("Todo", todoSchema);
مدل ها/user.js
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema(
{
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
},
{ timestamps: true }
);
module.exports = mongoose.model("User", userSchema);
مسیرها:-
مسیرها/authroutes.js
const express = require("express");
const { registerUser, loginUser } = require("../controllers/authController");
const router = express.Router();
router.post("/register", registerUser);
router.post("/login", loginUser);
module.exports = router;
مسیرها/todoroutes.js
const express = require("express");
const {
createTodo,
getTodos,
updateTodo,
deleteTodo,
} = require("../controllers/todoController");
const protect = require("../middleware/authMiddleware");
const router = express.Router();
router.post("https://dev.to/", protect, createTodo);
router.get("https://dev.to/", protect, getTodos);
router.put("/:id", protect, updateTodo);
router.delete("/:id", protect, deleteTodo);
module.exports = router;
استفاده:-
UTILS/AUTHVALIDATION.JS
const Joi = require("joi");
const registerSchema = Joi.object({
name: Joi.string().min(3).max(30).required(),
email: Joi.string().email().required(),
password: Joi.string().min(6).required(),
});
const loginSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(6).required(),
});
module.exports = { registerSchema, loginSchema };
UTILS/JWT.JS
const generateToken = (userId) => {
return jwt.sign({ id: userId }, process.env.JWT_SECRET, {
expiresIn: "1d",
});
};
const verifyToken = (token) => {
return jwt.verify(token, process.env.JWT_SECRET);
};
use/todovalidation.js
const Joi = require("joi");
const todoSchema = Joi.object({
title: Joi.string().min(3).max(100).required(),
description: Joi.string().max(500).allow(""),
priority: Joi.string().valid("low", "medium", "high").default("medium"),
status: Joi.string().valid("pending", "completed").default("pending"),
dueDate: Joi.date().greater("now").required(),
});
module.exports = { todoSchema };
.env
PORT=5000
MONGO_URI=
JWT_SECRET=i-am-utsav-ioopen-source
config.js
const mongoose = require("mongoose");
require("dotenv").config();
const connectDB = async () => {
try {
await mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log("MongoDB Connected...");
} catch (error) {
console.error("MongoDB Connection Failed:", error);
process.exit(1);
}
};
module.exports = connectDB;
server.js
const express = require("express");
const dotenv = require("dotenv");
const cors = require("cors");
const connectDB = require("./config");
const authRoutes = require("./routes/authRoutes");
const todoRoutes = require("./routes/todoRoutes");
dotenv.config();
connectDB();
const app = express();
app.use(express.json());
app.use(cors());
app.use("/api/auth", authRoutes);
app.use("/api/todos", todoRoutes);
app.get("https://dev.to/", (req, res) => {
res.send("API is running...");
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
بسته
{
"name": "backend",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js",
"dev": "nodemon server.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"bcryptjs": "^3.0.2",
"cors": "^2.8.5",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"express-validator": "^7.2.1",
"joi": "^17.13.3",
"jsonwebtoken": "^9.0.2",
"mongoose": "^8.10.1"
},
"devDependencies": {
"nodemon": "^3.1.9"
}
}