This is a starter project to create Deno RESTful API using oak. oak is a middleware framework and router middleware for Deno, inspired by popular Node.js framework Koa and @koa/router.
This project covers
Router
, Service
& Repository
layersWe can run the project with/ without Docker.
Pre-Requisite
Configuration
env.example
to .env
.Run API
$ docker-compose up --build
$ deno run --allow-read --allow-net app.ts
API
API
at http://localhost:8000Adminer
at http://localhost:8080Swagger Open API
Doc at http://localhost:8105We use nessie to manage database migration.
nessie.config.ts
. Make sure to update this with the DB credentials.$ deno run --allow-net --allow-read --allow-write https://deno.land/x/nessie@v1.0.0-rc3/cli.ts migrate
With this, the user table would be created and the table would be seeded with fake data
deno run --allow-net --allow-read --allow-write https://deno.land/x/nessie@v1.0.0-rc3/cli.ts make create_product
Package | Purpose |
---|---|
oak@v5.0.0 | Deno middleware framework |
dotenv@v0.4.2 | Read env variables |
mysql@2.2.0 | MySQL driver for Deno |
nessie@v1.0.0-rc3 | DB migration tool for Deno |
validasaur@v0.7.0 | validation library |
djwt@v0.9.0 | JWT token encoding |
bcrypt@v0.2.1 | bcrypt encription lib |
.
├── .env (Make sure to create this file from given .env.example)
├── config/
| |── config.ts (configuration object)
├── db/
| |── migrations/
| |── seeds/
| ├── db.ts (DB connection object)
├── middlewares/
├── migrations/
├── services/
├── repositories/
├── helpers/
├── routes/
|── types/
|── types.ts (all types exported here)
├── app.ts (application server)
├── openapi.yml (Swagger open api definition)
└── nessie.config.ts (DB configuration for nessie migration)
Router hanlders are defined in routes
folder. For each entity there should be separate routes file. For example user related CRUD router handlers are defined in user.routes.ts
file.
All routes are bind with router handlers in routes.ts
file.
To create CRUD for cat
cat.routes.ts
//cat.routes.ts
import * as catService from "./../services/cat.service.ts";
/**
* get list of cats
*/
const getCats = [
async (ctx: Context) => {
const cats = await catService.getCats();
ctx.response.body = cats;
}
];
//export route handler methods
exports { getCats };
getCats
route handler with router in routes.ts
file -//routes.ts
import * as catRoutes from "./cat.routes.ts";
// ... router initialization codes
router
.get("/cats", ...catRoutes.getCats);
//auth.routes.ts
import {
required,
isEmail,
} from "https://deno.land/x/validasaur@v0.7.0/src/rules.ts";
import { requestValidator } from "./../middlewares/request-validator.middleware.ts";
/**
* request body schema
* for cat create/update
* */
const catSchema = {
name: [required],
email: [required, isEmail],
};
/**
* create cat
*/
const createCat = [
/** request validation middleware */
requestValidator({ bodyRules: catSchema }),
/** router handler */
async (ctx: Context) => {
// ... router handler code to create cat
},
];
.env
(copy from .env.example
).# Access token validity in ms
JWT_ACCESS_TOKEN_EXP=600000
# Refresh token validity in ms
JWT_REFRESH_TOKEN_EXP=3600000
# Secret secuirity string
JWT_TOKEN_SECRET=HEGbulKGDblAFYskBLml
Authorization
key.Authorization
header and decode the payload as ctx.user
.ctx.user
provided by JWTAuthMiddleware middleware.userGuard
middleware optionally takes allowed user’s roles as parameter. Otherwise, it will check only for the signed user.//user.routes.ts
/**
* get list of users
* user with ADMIN role only can access
*/
const getUsers = [
userGuard(UserRole.ADMIN),
async (ctx: Context) => {
// ... route handlers code
},
];
/**
* get signed user detail
* any authenticated user can access
*/
const getMe = [
userGuard(),
async (ctx: Context) => {
// ... route handlers code
},
];
Bug reports and pull requests are welcome on GitHub at https://github.com/asad-mlbd/deno-api-starter-oak.
Author: asad-mlbd
Source Code: https://github.com/asad-mlbd/deno-api-starter-oak
#deno #nodejs #node #javascript