1 |
|
2 | import fs from "fs";
|
3 | import path from "path";
|
4 |
|
5 | import Koa2 from "koa";
|
6 | import body from "koa-body";
|
7 | import compress from "koa-compress";
|
8 | import cors from "@koa/cors";
|
9 | import helmet from "koa-helmet";
|
10 | import koaLogger from "koa-logger";
|
11 | import koaPinoLogger from "koa-pino-logger";
|
12 | import jwt from "koa-jwt";
|
13 | import Router from "koa-tree-router";
|
14 | import health from "@36node/koa-health";
|
15 | import openapi from "@36node/koa-openapi";
|
16 |
|
17 | import logger from "./lib/log";
|
18 | import { BASE, NODE_ENV } from "./config";
|
19 | import { petService } from "./services";
|
20 | import pkg from "../package.json";
|
21 | import { errHandler } from "./middlewares";
|
22 |
|
23 | const app = new Koa2();
|
24 | const router = new Router({ prefix: BASE });
|
25 | const publicKey = fs.readFileSync(path.join(__dirname, "../ssl/rsa_jwt.pub"));
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | petService.bind(router);
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | if (NODE_ENV !== "production") {
|
36 |
|
37 | app.use(koaLogger());
|
38 | } else {
|
39 | app.use(koaPinoLogger({ logger }));
|
40 | }
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | app
|
46 | .use(errHandler())
|
47 | .use(helmet())
|
48 | .use(cors({ exposeHeaders: ["Link", "X-Total-Count"] }))
|
49 | .use(health({ url: `${BASE}/health`, version: pkg.version }))
|
50 | .use(
|
51 | openapi({
|
52 | url: `${BASE}/openapi.yml`,
|
53 | file: path.join(__dirname, "../openapi.yml"),
|
54 | })
|
55 | )
|
56 | .use(jwt({ secret: publicKey, key: "jwt" }))
|
57 | .use(body())
|
58 | .use(compress({ threshold: 2048 }))
|
59 | .use(router.routes());
|
60 |
|
61 | export default app;
|