express-easy-curd
Version:
A lightweight helper library for building Express.js routes, controllers, and Redis-enhanced middleware with optional Redis support.
241 lines (173 loc) • 6.73 kB
Markdown
# 🚀 express-easy-curd
A lightweight helper library for building Express.js routes, controllers, and Redis-enhanced middleware. Simplify your CURD operations with flexible APIs, built-in helpers, and optional caching.
> ⚡ Build scalable REST APIs in minutes with Express and Mongoose.
<h2 id="table-of-contents">📚 Table of Contents</h2>
- [Installation](#installation)
- [Tutorials](#tutorials)
- [Features](#features)
- [Usage](#usage)
- [1. Controller Example](#1-controller-example)
- [2. Router Example](#2-router-example)
- [3. With Redis Caching (Optional)](#3-with-redis-caching-optional)
- [Helpers](#helpers)
- [Query Operators](#query-operators)
- [TypeScript Support](#typescript-support)
- [Contributing](#contributing)
- [License](#license)
- [Links](#links)
<h2 id="tutorials">🎥 Tutorials</h2>
[](https://www.youtube.com/watch?v=oPjdKeG4ppE)
<h2 id="features">✨ Features</h2>
- ✅ Generic CURD controller for Mongoose models
- ✅ Auto-generated Express routes
- ✅ Optional Redis caching via `ioredis`
- ✅ Query filtering and pagination helpers
- ✅ TypeScript support with included types
- ✅ Partial search and dynamic filtering
<h2 id="installation">📦 Installation</h2>
```bash
npm install express-easy-curd
# or
yarn add express-easy-curd
```
> **Peer dependencies:**
> You must install compatible versions of `express`, `mongoose`, and optionally `ioredis`.
```bash
npm install express mongoose ioredis
```
<h2 id="usage">🚀 Usage</h2>
### <h3 id="1-controller-example">1. Controller Example</h3>
```ts
import express from "express";
import mongoose from "mongoose";
import { generatecurdController } from "express-easy-curd";
const UserModel = mongoose.model("User", new mongoose.Schema({ name: String }));
const userController = generatecurdController(UserModel, "User");
const app = express();
app.use(express.json());
app.get("/users", userController.getAll);
app.post("/users", userController.create);
app.put("/users", userController.updateMany);
app.patch("/users/update-many", userController.updateMany);
app.delete("/users/delete-many", userController.removeMany);
app.get("/users/:id", userController.getSingle);
app.put("/users/:id", userController.update);
app.patch("/users/:id", userController.update);
app.delete("/users/:id", userController.remove);
app.listen(3000, () => {
console.log("Server running on port 3000");
});
```
> ⚠️ **Warning:** Use proper validation for `removeMany` and `updateMany` to avoid unintended data loss.
---
### <h3 id="2-router-example">2. Router Example</h3>
```ts
import express from "express";
import mongoose from "mongoose";
import { generatecurdRoutes } from "express-easy-curd";
const UserModel = mongoose.model("User", new mongoose.Schema({ name: String, age: Number }));
const curdRouter = generatecurdRoutes({
mongooseModel: UserModel,
name: "User",
basePath: "/users",
middlewares: {
getAll: [...middlewares],
create: [...middlewares],
removeMany: [...middlewares],
updateMany: [...middlewares],
getSingle: [...middlewares],
update: [...middlewares],
remove: [...middlewares],
},
});
const app = express();
app.use(express.json());
app.use("/api", curdRouter);
```
**Generated Routes:**
| Method | Path | Description |
| ------ | ----------------------------------------- | ----------------- |
| GET | `/api/users` | Get all users |
| POST | `/api/users` | Create user |
| PUT | `/api/users?name=suronjit797` | Update many users |
| PATCH | `/api/users/update-many?name=suronjit797` | Update many users |
| DELETE | `/api/users/delete-many?name=suronjit797` | Delete many users |
| GET | `/api/users/:id` | Get user by ID |
| PUT | `/api/users/:id` | Update user by ID |
| PATCH | `/api/users/:id` | Update user by ID |
| DELETE | `/api/users/:id` | Delete user by ID |
### <h3 id="3-with-redis-caching-optional">3. With Redis Caching (Optional)</h3>
```ts
import Redis from "ioredis";
const redisClient = new Redis();
const userController = generatecurdController(UserModel, "User", redisClient, 600);
const curdRouter = generatecurdRoutes({
mongooseModel: UserModel,
name: "User",
basePath: "/users",
ioredis: redisClient,
cachedTime: 600, // in seconds (default: 600 = 10 minutes)
});
```
<h2 id="helpers">🧰 Helpers</h2>
- `filterHelper(req.query, partialKeys, model)` – Builds MongoDB filters from query params
- `paginationHelper(req.query)` – Handles pagination and sorting
- `sendResponse(res, data)` – Standardizes API responses
- `ApiError` – Custom error class
- `partialFilterMiddlewares(keys)` – Enables partial search on string fields
```ts
const pagination = paginationHelper(req.query);
const filter = filterHelper(req.query, req.partialFilter || [], new UserModel());
const UserRouter = generatecurdRoutes({
mongooseModel: UserModel,
name: "User",
middlewares: {
getAll: [partialFilterMiddlewares(["name", "email"])],
},
});
```
<h2 id="query-operators">🔍 Query Operators</h2>
Use Mongoose-style operators in query strings:
| Operator | Query Param |
| --------- | ----------- |
| `$gt` | `_gt` |
| `$lt` | `_lt` |
| `$gte` | `_gte` |
| `$lte` | `_lte` |
| `$ne` | `_ne` |
| `$in` | `_in` |
| `$nin` | `_nin` |
| `$regex` | `_regex` |
| `$exists` | `_exists` |
Example:
```
GET /users?age_gt=10&name=suronjit797&search=item
```
<h2 id="typescript-support">🧑💻 TypeScript Support</h2>
Type definitions are included:
```ts
import { IMeta } from "express-easy-curd/dist/Types/types";
```
<h2 id="contributing">🤝 Contributing</h2>
Pull requests and issues are welcome!
<!-- See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. -->
<h2 id="license">📜 License</h2>
MIT © Suronjit Pal ([@suronjit797](https://github.com/suronjit797))
<h2 id="links">🔗 Links</h2>
- [GitHub Repository](https://github.com/suronjit797/express-easy-curd)
- [Report Issues](https://github.com/suronjit797/express-easy-curd/issues)
- [YouTube Tutorial](https://www.youtube.com/watch?v=oPjdKeG4ppE)
```
```