Skip to content

Instantly share code, notes, and snippets.

@suhailroushan13
Created December 10, 2025 13:54
Show Gist options
  • Select an option

  • Save suhailroushan13/005fbe3db458dd06f14c0d0fa0783b5c to your computer and use it in GitHub Desktop.

Select an option

Save suhailroushan13/005fbe3db458dd06f14c0d0fa0783b5c to your computer and use it in GitHub Desktop.
ALL Methods API's
import express from "express";
import bcrypt from "bcrypt";
import userModel from "../../models/User/User.js";
const router = express.Router();
/*
=============================================================================
GET ALL USERS → find()
-----------------------------------------------------------------------------
filter = {} → empty means get everything
projection = null → show all fields
options = extra controls like sort, limit (not needed for basic)
=============================================================================
*/
router.get("/find", async (req, res) => {
try {
const users = await userModel.find({}, null, {});
res.json(users);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
GET ONE USER BY ID → findById(id)
-----------------------------------------------------------------------------
id = req.params.id → MongoDB unique primary key
projection = null → return all fields
=============================================================================
*/
router.get("/findById/:id", async (req, res) => {
try {
const user = await userModel.findById(req.params.id, null, {});
res.json(user);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
GET ONE USER BY EMAIL → findOne(filter)
-----------------------------------------------------------------------------
filter = {email: ...} → find first matching document
=============================================================================
*/
router.get("/findByEmail/:email", async (req, res) => {
try {
const user = await userModel.findOne({ email: req.params.email });
res.json(user);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
REGISTER USER → create(document)
-----------------------------------------------------------------------------
Creates + saves new document into DB
=============================================================================
*/
router.post("/create", async (req, res) => {
try {
const hashedPassword = await bcrypt.hash(req.body.password, 10);
await userModel.create({
fullName: req.body.fullName,
email: req.body.email,
phone: req.body.phone,
password: hashedPassword,
});
res.json({ msg: "User Created" });
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
FULL UPDATE (PUT) by ID → findByIdAndUpdate(id, update, options)
-----------------------------------------------------------------------------
update = what to update using $set operator
options:
- new: true → return UPDATED document not OLD one
- runValidators: true → validate schema before update
=============================================================================
*/
router.put("/updateById/:id", async (req, res) => {
try {
const updatedUser = await userModel.findByIdAndUpdate(
req.params.id,
{ $set: req.body },
{
new: true,
runValidators: true,
}
);
res.json(updatedUser);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
UPDATE FIRST MATCH → findOneAndUpdate(filter, update, options)
Used when we don't have ID but want update
=============================================================================
*/
router.put("/updateByEmail/:email", async (req, res) => {
try {
const updatedUser = await userModel.findOneAndUpdate(
{ email: req.params.email }, // filter
{ $set: req.body }, // update only provided fields
{
new: true, // return updated doc
runValidators: true // enforce schema rules
}
);
res.json(updatedUser);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
PATCH (Partial Update) → updateOne(filter, update)
-----------------------------------------------------------------------------
Only update specific field → Doesn’t replace entire document
filter = {_id: ...}
update = { $set: req.body } → apply only given fields
=============================================================================
*/
router.patch("/patch/:id", async (req, res) => {
try {
const patchedUser = await userModel.updateOne(
{ _id: req.params.id },
{ $set: req.body }
);
res.json(patchedUser);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
DELETE BY ID → findByIdAndDelete(id)
-----------------------------------------------------------------------------
Returns deleted object also (useful for logging)
=============================================================================
*/
router.delete("/deleteById/:id", async (req, res) => {
try {
const deletedUser = await userModel.findByIdAndDelete(req.params.id);
res.json({ msg: "Deleted", deletedUser });
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
DELETE FIRST USER MATCHING FILTER → deleteOne(filter)
-----------------------------------------------------------------------------
Does NOT return deleted object (just count)
=============================================================================
*/
router.delete("/deleteByEmail/:email", async (req, res) => {
try {
const result = await userModel.deleteOne({ email: req.params.email });
res.json(result);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
DELETE MANY → deleteMany(filter)
-----------------------------------------------------------------------------
filter = {} → delete all users 🧨 BE CAREFUL!
=============================================================================
*/
router.delete("/deleteAll", async (req, res) => {
try {
const result = await userModel.deleteMany({});
res.json(result);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
COUNT DOCS → countDocuments(filter)
-----------------------------------------------------------------------------
filter → count all matching users, not fetch them
=============================================================================
*/
router.get("/count", async (req, res) => {
try {
const count = await userModel.countDocuments({});
res.json({ totalUsers: count });
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
/*
=============================================================================
REPLACE ENTIRE DOCUMENT → replaceOne(filter, newDoc)
-----------------------------------------------------------------------------
Replaces completely → delete old one, insert new one
Use carefully (like updating full profile)
=============================================================================
*/
router.put("/replace/:email", async (req, res) => {
try {
const result = await userModel.replaceOne(
{ email: req.params.email }, // which doc to replace
req.body // full new doc
);
res.json(result);
} catch (err) {
res.status(500).json({ msg: err.message });
}
});
export default router;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment