Compare commits
9 Commits
dd445a22c0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
c999b4a8f6
|
|||
|
7a2c3dec97
|
|||
|
9ef8db077f
|
|||
|
da0235c0b3
|
|||
| 0378f270fc | |||
|
03458fe00c
|
|||
|
c41002a96b
|
|||
| 00eedce6ea | |||
|
|
84656ec61a |
@@ -11,6 +11,4 @@ steps:
|
||||
image: d.ctdn.net/node
|
||||
commands:
|
||||
- yarn config set registry https://r.ctdn.net
|
||||
- cd packages/ts-common && yarn && yarn build
|
||||
- cd ../../ && yarn
|
||||
- yarn build
|
||||
- yarn && yarn build
|
||||
|
||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
||||
[submodule "packages/ts-common"]
|
||||
path = packages/ts-common
|
||||
url = https://git.cubetiqs.com/CUBETIQ/ts-common.git
|
||||
[submodule "packages/cubetiq-express-server"]
|
||||
path = packages/cubetiq-express-server
|
||||
url = https://git.cubetiqs.com/CUBETIQ/cubetiq-express-server.git
|
||||
|
||||
@@ -14,9 +14,7 @@ WORKDIR /app
|
||||
COPY . /app
|
||||
|
||||
RUN yarn config set registry https://r.ctdn.net
|
||||
RUN cd packages/ts-common && yarn && yarn build
|
||||
RUN cd ../../ && yarn
|
||||
RUN yarn build
|
||||
RUN yarn && yarn build
|
||||
|
||||
EXPOSE 3000
|
||||
CMD [ "yarn" , "serve"]
|
||||
17
README.md
17
README.md
@@ -27,13 +27,13 @@ git submodule update --init --remote
|
||||
- Add Packages
|
||||
|
||||
```shell
|
||||
mkdir packages && git submodule add https://git.cubetiqs.com/CUBETIQ/ts-common.git packages/ts-common
|
||||
mkdir packages && git submodule add https://git.cubetiqs.com/CUBETIQ/ts-common.git packages/ts-common && git submodule add https://git.cubetiqs.com/CUBETIQ/cubetiq-express-server.git packages/cubetiq-express-server
|
||||
```
|
||||
|
||||
- Install
|
||||
- Install and Build Packages
|
||||
|
||||
```shell
|
||||
yarn
|
||||
yarn && npx lerna run build
|
||||
```
|
||||
|
||||
- Start
|
||||
@@ -58,14 +58,19 @@ curl http://localhost:3000/info
|
||||
}
|
||||
```
|
||||
|
||||
# Build application
|
||||
|
||||
```shell
|
||||
yarn build
|
||||
```
|
||||
|
||||
# Quick Register Controller
|
||||
|
||||
- Add new controller `src/controller/home.controller.ts`
|
||||
|
||||
```typescript
|
||||
import { Request, Response } from "express"
|
||||
import Controller from "../decorators/controller.decorator"
|
||||
import { Get, Post, Delete } from "../decorators/handlers.decorator"
|
||||
import { Controller, Get, Post, Delete } from "../decorators"
|
||||
|
||||
const data: any[] = []
|
||||
|
||||
@@ -131,4 +136,4 @@ export const controllers = [IndexController, PersonController, HomeController]
|
||||
|
||||
### Contributors
|
||||
|
||||
- Sambo Chea <sombochea@cubetiqs.com>
|
||||
- Sambo Chea <sombochea@cubetiqs.com> [4099C19544D3FF79]
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "ts-node-dev --respawn --transpile-only src/app.ts",
|
||||
"build": "rm -rf dist && tsc",
|
||||
"build": "lerna run build && rm -rf dist && tsc",
|
||||
"serve": "yarn build && node dist/app.js",
|
||||
"bootstrap": "lerna bootstrap",
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
@@ -18,7 +18,8 @@
|
||||
},
|
||||
"keywords": [
|
||||
"Express",
|
||||
"Nodejs"
|
||||
"Nodejs",
|
||||
"Typescript"
|
||||
],
|
||||
"author": "Sambo Chea <sombochea@cubetiqs.com>",
|
||||
"license": "ISC",
|
||||
@@ -41,8 +42,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@cubetiq/ts-common": "1.0.0",
|
||||
"express": "^4.17.1",
|
||||
"reflect-metadata": "^0.1.13"
|
||||
"@cubetiq/express-server": "1.0.0",
|
||||
"express": "^4.17.1"
|
||||
},
|
||||
"lint-staged": {
|
||||
"**/*": "prettier --write --ignore-unknown"
|
||||
|
||||
1
packages/cubetiq-express-server
Submodule
1
packages/cubetiq-express-server
Submodule
Submodule packages/cubetiq-express-server added at b03dd8ad39
Submodule packages/ts-common updated: c42964407e...e26ee50faf
28
src/app.ts
28
src/app.ts
@@ -1,8 +1,28 @@
|
||||
// app config
|
||||
import "./dotenv"
|
||||
|
||||
// reflection metadata for decorator
|
||||
import "reflect-metadata"
|
||||
import { createServer } from "http"
|
||||
import { SERVER_PORT } from "./app.config"
|
||||
import { info } from "@cubetiq/ts-common/dist/log"
|
||||
import application from "./server"
|
||||
|
||||
// core app
|
||||
import "./server"
|
||||
// get current host id
|
||||
const hostId = `${require("os").hostname()}#${process.pid}`
|
||||
const startedAt = new Date()
|
||||
|
||||
const app = application.instance
|
||||
const httpServer = createServer(app)
|
||||
|
||||
info(
|
||||
`Application server running on: ${hostId} at port: ${SERVER_PORT} and started at: ${startedAt}`
|
||||
)
|
||||
httpServer.listen(SERVER_PORT)
|
||||
|
||||
app.get("/info", (req, res) => {
|
||||
res.type("json")
|
||||
res.send({
|
||||
startedAt,
|
||||
message: `Instance id: ${hostId}`,
|
||||
status: "OK",
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
import express, { Application as ExpressApp, Handler } from "express"
|
||||
import { controllers } from "./controller"
|
||||
import { RouteHandler } from "./decorators/handlers.decorator"
|
||||
import { MetadataKeys } from "./constants/metadata.keys"
|
||||
|
||||
class Application {
|
||||
private readonly _instance: ExpressApp
|
||||
|
||||
get instance(): ExpressApp {
|
||||
return this._instance
|
||||
}
|
||||
|
||||
constructor() {
|
||||
this._instance = express()
|
||||
this._instance.use(express.json())
|
||||
this._instance.use(express.urlencoded({ extended: false }))
|
||||
this.registerRoutes()
|
||||
}
|
||||
|
||||
private registerRoutes(): void {
|
||||
const info: Array<{ api: string; handler: string }> = []
|
||||
|
||||
controllers.forEach((controller) => {
|
||||
const controllerInstance: { [handlerName: string]: Handler } =
|
||||
new controller() as any
|
||||
const basePath: string = Reflect.getMetadata(
|
||||
MetadataKeys.BASE_PATH,
|
||||
controller
|
||||
)
|
||||
const routers: RouteHandler[] = Reflect.getMetadata(
|
||||
MetadataKeys.ROUTERS,
|
||||
controller
|
||||
)
|
||||
const exRouter = express.Router()
|
||||
|
||||
routers.forEach(({ method, path, handlerName }) => {
|
||||
exRouter[method](
|
||||
path,
|
||||
controllerInstance[String(handlerName)]
|
||||
).bind(controllerInstance)
|
||||
info.push({
|
||||
api: `${method.toLocaleUpperCase()} ${basePath + path}`,
|
||||
handler: `${controller.name}.${String(handlerName)}`,
|
||||
})
|
||||
})
|
||||
|
||||
this._instance.use(basePath, exRouter)
|
||||
})
|
||||
|
||||
console.table(info)
|
||||
}
|
||||
}
|
||||
|
||||
export default new Application()
|
||||
@@ -1,4 +0,0 @@
|
||||
export enum MetadataKeys {
|
||||
BASE_PATH = "base_path",
|
||||
ROUTERS = "routers",
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Request, Response } from "express"
|
||||
import { Controller, Get } from "../decorators"
|
||||
import { Controller, Get } from "@cubetiq/express-server/dist/decorators"
|
||||
|
||||
@Controller("/hello")
|
||||
export default class IndexController {
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
import { Request, Response } from "express"
|
||||
import { Controller, Delete, Get, Post } from "../decorators"
|
||||
import {
|
||||
Controller,
|
||||
Delete,
|
||||
Get,
|
||||
Post,
|
||||
} from "@cubetiq/express-server/dist/decorators"
|
||||
|
||||
const persons: Array<any> = [
|
||||
{
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
import { MetadataKeys } from "../constants/metadata.keys"
|
||||
|
||||
export const Controller = (basePath: string): ClassDecorator => {
|
||||
return (target: any) => {
|
||||
Reflect.defineMetadata(MetadataKeys.BASE_PATH, basePath, target)
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
import { MetadataKeys } from "../constants/metadata.keys"
|
||||
|
||||
export enum Method {
|
||||
GET = "get",
|
||||
POST = "post",
|
||||
PUT = "put",
|
||||
DELETE = "delete",
|
||||
PATCH = "patch",
|
||||
}
|
||||
|
||||
export interface RouteHandler {
|
||||
method: Method
|
||||
path: string
|
||||
handlerName: string | symbol
|
||||
}
|
||||
|
||||
const methodDecoratorFactory = (method: Method) => {
|
||||
return (path: string = ""): MethodDecorator => {
|
||||
return (target: any, propertyKey: string | symbol): void => {
|
||||
const controllerClass = target.constructor
|
||||
const routers: RouteHandler[] = Reflect.hasMetadata(
|
||||
MetadataKeys.ROUTERS,
|
||||
controllerClass
|
||||
)
|
||||
? Reflect.getMetadata(MetadataKeys.ROUTERS, controllerClass)
|
||||
: []
|
||||
|
||||
routers.push({
|
||||
method,
|
||||
path,
|
||||
handlerName: propertyKey,
|
||||
})
|
||||
|
||||
Reflect.defineMetadata(
|
||||
MetadataKeys.ROUTERS,
|
||||
routers,
|
||||
controllerClass
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const Get = methodDecoratorFactory(Method.GET)
|
||||
export const Post = methodDecoratorFactory(Method.POST)
|
||||
export const Put = methodDecoratorFactory(Method.PUT)
|
||||
export const Delete = methodDecoratorFactory(Method.DELETE)
|
||||
export const Patch = methodDecoratorFactory(Method.PATCH)
|
||||
@@ -1,2 +0,0 @@
|
||||
export * from "./controller.decorator"
|
||||
export * from "./handlers.decorator"
|
||||
@@ -1,25 +1,9 @@
|
||||
import { createServer } from "http"
|
||||
import { SERVER_PORT } from "./app.config"
|
||||
import { info } from "@cubetiq/ts-common/dist/log"
|
||||
import application from "./application"
|
||||
import Application from "@cubetiq/express-server/dist"
|
||||
import { controllers as AllControllers } from "./controller"
|
||||
class Server extends Application {
|
||||
get controllers(): any[] {
|
||||
return AllControllers
|
||||
}
|
||||
}
|
||||
|
||||
// get current host id
|
||||
const hostId = `${require("os").hostname()}#${process.pid}`
|
||||
const startedAt = new Date()
|
||||
|
||||
const app = application.instance
|
||||
const httpServer = createServer(app)
|
||||
|
||||
info(
|
||||
`Application server running on: ${hostId} at port: ${SERVER_PORT} and started at: ${startedAt}`
|
||||
)
|
||||
httpServer.listen(SERVER_PORT)
|
||||
|
||||
app.get("/info", (req, res) => {
|
||||
res.type("json")
|
||||
res.send({
|
||||
startedAt,
|
||||
message: `Instance id: ${hostId}`,
|
||||
status: "OK",
|
||||
})
|
||||
})
|
||||
export default new Server()
|
||||
|
||||
Reference in New Issue
Block a user