https://github.com/skmdev/koa-decorator-ts
koa decorator
https://github.com/skmdev/koa-decorator-ts
graphql koa koa-decorator koa-jwt koa-router typescript
Last synced: 11 days ago
JSON representation
koa decorator
- Host: GitHub
- URL: https://github.com/skmdev/koa-decorator-ts
- Owner: skmdev
- License: mit
- Created: 2018-04-11T02:26:13.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-01-23T22:22:22.000Z (over 2 years ago)
- Last Synced: 2025-04-18T12:21:14.331Z (15 days ago)
- Topics: graphql, koa, koa-decorator, koa-jwt, koa-router, typescript
- Language: TypeScript
- Size: 775 KB
- Stars: 9
- Watchers: 1
- Forks: 4
- Open Issues: 27
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# koa-decorator-ts
Koa Decorator (with TypeScript)
# Installation
```
npm i koa-decorator-ts --save
/* or */
yarn add koa-decorator-ts
```# Introduction
This package is a decorator for koa, including the koa-router, graohql.
You can use decorators to define the path of routing or create a graphql resolver using existing koa controller# Usage
> app.js
```javascript
import Koa from 'koa';
// 1. Import Router
import Router from 'koa-decorator-ts/router';const app = new Koa();
// 2. Create router
const router = new Router({
dir: `${__dirname}/controllers` // The controllers directory
});// [Optional] Graphql inital
const graphqlServer = new ApolloServer({ schema });
graphqlServer.applyMiddleware({ app });// 3. Register the routers
app.use(router.routes());
app.use(router.allowedMethods());...
app.listen(8080);
```> /controllers/user.ts
```javascript
import Koa from 'koa';
import {
Controller,
Route,
Middleware,
Required,
Graphql,
Priority,
Meta,
} from 'koa-decorator-ts';
import { IsString } from 'class-validator';async function middlewareLog(ctx: Koa.Context, next: Function) {
await next();
}//use a class with decorators (class-validator) for validation
class PatchUserRequest{
@IsString()
userNickName!:string
@IsString()
userAddress!:string
}// Prefix of api path
@Controller('/user')
class UserController {
@Priority(-1000)
@Route.all('*')
async handleAll(ctx: Koa.Context, next: any) {
ctx.body = 'haha';
}// Post /user/login
@Route.post('/login')
@Required({
// Require { userEmail, password } in the body
body: {
type: 'object',
properties: {
userEmail: {
type: 'string',
},
password: {
type: 'string',
},
},
required: ['userEmail', 'password'],
},
})
async login(ctx: Koa.Context) {
ctx.body = true;
}// Get /user/:userId
@Route.get('/:userId')
@Middleware(middlewareLog) // Add Middleware
async getUserInfo(ctx: Koa.Context) {
ctx.body = { userName: 'skm', userEmail: '[email protected]' };
}// Get /user?top=10&star=1000000
@Route.get('/')
@Required({
query: {
type: 'object',
properties: {
top: { type: 'string' },
star: { type: 'string' },
},
required: ['top', 'star'],
},
}) // Require for "top", "star" in the query
@Middleware(middlewareLog)
async getUsers(ctx: Koa.Context) {
ctx.body = { userName: 'skm', userEmail: '[email protected]' };
}// Patch /user/:userId
@Route.patch('/:userId')
@RequiredBody(PatchUserRequest) //do the same for query using @RequiredQuery
async updateUserInfo(ctx: Koa.Context) {
ctx.body = true;
}// Put /user/:userId/follow
@Route.put('/:userId/follow')
async followUser(ctx: Koa.Context) {
ctx.body = true;
}// Delete /user/:userId/follow
@Route.del('/:userId/follow')
async unfollowUser(ctx: Koa.Context) {
ctx.body = true;
}@Meta({ test: 'cc' })
@Route.get('/meta')
async metaTest(ctx: Koa.Context) {
ctx.body = ctx.meta;
}@Graphql
@Middleware(middlewareLog)
static async getUser(ctx: Koa.Context) {
const { args } = ctx.graphql!;const users = [
{ username: 'skmdev', role: 'admin', userEmail: '[email protected]' },
{ username: 'foo', role: 'user', userEmail: 'bar' },
];ctx.body = users.find((user) => user.username === args.username);
}@Graphql // transfrom to graphql resolver
@Middleware(middlewareLog)
static async getUsersGraph(ctx: Koa.Context) {
/**
* const { root, args, info } = ctx.graphql;
*
* root is representing rootObject
*
* args is representing the arguments of request
*
* info is representing the graphql info
*
*/
const { args } = ctx.graphql!;const users = [
{ username: 'skmdev', role: 'admin', userEmail: '[email protected]' },
{ username: 'foo', role: 'user', userEmail: 'bar' },
];// ctx.body is response data;
ctx.body = users.filter((user) => user.role === args.role);
}
}export default UserController;
```