Skip to content

rkumwt/express-rest-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

9 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Express Rest API

REST API package for Express.js. Get full CRUD with filtering, sorting, pagination, validation, and hooks β€” in minutes.

npm version npm downloads license GitHub stars visitors

Documentation: https://express-rest-api.rajesh-kumawat.in

Features

  • Zero boilerplate CRUD β€” Define a controller, get 6 REST endpoints
  • Filtering, sorting, pagination β€” Built-in query parameter parsing
  • Default adapter β€” Configure once, use in every controller
  • Multi-ORM support β€” Prisma, Sequelize, Mongoose, Knex, Drizzle
  • Lifecycle hooks β€” beforeStore, afterStore, beforeUpdate, etc.
  • Validation β€” Zod, Joi, or custom functions (auto-detected)
  • Hidden fields β€” Automatically strip sensitive data from responses

Installation

npm install @rkumwt/express-rest-api

Install your ORM of choice:

npm install @prisma/client    # Prisma
npm install sequelize          # Sequelize
npm install mongoose           # Mongoose
npm install knex               # Knex
npm install drizzle-orm        # Drizzle

Quick Start (Step by Step)

This guide uses Prisma + SQLite. The steps are the same for any ORM β€” only the adapter changes.

1. Set up Prisma

npm install express @prisma/client
npm install -D prisma

Create prisma/schema.prisma:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  role      String   @default("user")
  createdAt DateTime @default(now())
}

Push the schema to create your database:

npx prisma db push

2. Create Config Files

// config/database.js β€” Database connection (shared singleton)
const { PrismaClient } = require('@prisma/client');
const db = new PrismaClient();
module.exports = db;
// config/api.js β€” Set the adapter factory once for all controllers
const { configure, createPrismaAdapter } = require('@rkumwt/express-rest-api');

configure({
  adapter: createPrismaAdapter,
});

3. Create a Controller

// controllers/UserController.js
const { ApiController } = require('@rkumwt/express-rest-api');
const db = require('../config/database');

class UserController extends ApiController {
  // Adapter is auto-created from the factory set in config/api.js
  model = db.user;

  // Fields returned by default when client doesn't specify ?fields=
  defaultFields = ['id', 'name', 'email', 'role', 'createdAt'];

  // Fields allowed in ?filters=
  filterableFields = ['id', 'name', 'email', 'role'];

  // Fields allowed in ?order=
  sortableFields = ['id', 'name', 'email', 'createdAt'];
}

module.exports = UserController;

4. Register Routes

// routes/api.js
const { createApiRouter } = require('@rkumwt/express-rest-api');
const UserController = require('../controllers/UserController');

const api = createApiRouter({ prefix: '/api', version: 'v1' });

// Registers: GET, POST /api/v1/users + GET, PUT, PATCH, DELETE /api/v1/users/:id
api.apiResource('users', UserController);

module.exports = api;

5. Set up Express

// server.js
const express = require('express');
const { apiErrorHandler } = require('@rkumwt/express-rest-api');

require('./config/api'); // Load adapter + global settings
const api = require('./routes/api');

const app = express();

app.use(express.json());
app.use(api.getRouter());
app.use(apiErrorHandler); // Handles 404, validation, and other API errors

app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

6. Test It

node server.js
# Create a user
curl -X POST http://localhost:3000/api/v1/users \
  -H "Content-Type: application/json" \
  -d '{"name": "John", "email": "john@example.com"}'

# List all users
curl http://localhost:3000/api/v1/users

# Get a single user
curl http://localhost:3000/api/v1/users/1

# Update a user
curl -X PUT http://localhost:3000/api/v1/users/1 \
  -H "Content-Type: application/json" \
  -d '{"name": "John Doe"}'

# Delete a user
curl -X DELETE http://localhost:3000/api/v1/users/1

That's it! You have a full REST API with filtering, sorting, and pagination built in.

Query Parameters

# Select specific fields
GET /api/v1/users?fields=id,name,email

# Include relations
GET /api/v1/users?fields=id,name,posts{id,title}

# Filter
GET /api/v1/users?filters=(role eq admin)
GET /api/v1/users?filters=(role eq admin and status eq active)
GET /api/v1/users?filters=(name lk john)

# Sort
GET /api/v1/users?order=name asc
GET /api/v1/users?order=name asc, id desc

# Paginate
GET /api/v1/users?limit=10&offset=20

Filter operators: eq ne gt ge lt le lk

Response Format

// GET /api/v1/users
{
  "data": [
    { "id": 1, "name": "John", "email": "john@example.com" }
  ],
  "meta": {
    "paging": {
      "total": 87,
      "limit": 10,
      "offset": 0,
      "previous": null,
      "next": "/api/v1/users?limit=10&offset=10"
    },
    "timing": "5ms"
  }
}

// GET /api/v1/users/1
{ "data": { "id": 1, "name": "John", "email": "john@example.com" } }

// POST /api/v1/users β†’ 201
{ "data": { "id": 42, "name": "John" }, "message": "Resource created successfully" }

// DELETE /api/v1/users/1 β†’ 200
{ "message": "Resource deleted successfully" }

Switching Adapters

Change one line in config β€” all controllers stay the same:

// Prisma
configure({ adapter: createPrismaAdapter });

// Sequelize
configure({ adapter: createSequelizeAdapter });

// Mongoose
configure({ adapter: createMongooseAdapter });

You can also set the adapter explicitly per controller (overrides config):

class UserController extends ApiController {
  adapter = createPrismaAdapter(db.user); // Explicit β€” overrides config
}

Documentation

Full documentation with examples, hooks, validation, and API reference:

https://express-rest-api.rajesh-kumawat.in

Support

If you find this package useful, please consider supporting it:

  • Star this repo β€” It helps others discover the project
  • Fork it β€” Contribute features, fixes, or improvements
  • Share it β€” Tell other developers about it

GitHub Repository

License

MIT

About

πŸš€ Production-ready REST API package for Express.js β€” CRUD, filtering, sorting, pagination & hooks with multi-ORM support

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors