api.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { OpenAPIHono } from '@hono/zod-openapi'
  2. import { swaggerUI } from '@hono/swagger-ui'
  3. import { errorHandler } from './utils/errorHandler'
  4. import usersRouter from './api/users/index'
  5. import authRoute from './api/auth/index'
  6. import rolesRoute from './api/roles/index'
  7. import { AuthContext } from './types/context'
  8. import { AppDataSource } from './data-source'
  9. import { Hono } from 'hono'
  10. import { databaseBackup } from './utils/backup'
  11. if(!AppDataSource.isInitialized) {
  12. await AppDataSource.initialize();
  13. console.log('数据库初始化完成')
  14. // 启动数据库备份调度
  15. databaseBackup.startScheduledBackups();
  16. console.log('数据库备份调度已启动');
  17. }
  18. const app = new Hono();
  19. const api = new OpenAPIHono<AuthContext>()
  20. api.onError(errorHandler)
  21. // Rate limiting
  22. api.use('/api/v1/*', async (c, next) => {
  23. const ip = c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip')
  24. // 实现速率限制逻辑
  25. await next()
  26. })
  27. // // 数据库初始化中间件
  28. // api.use('/api/v1/*', async (c, next) => {
  29. // await next();
  30. // })
  31. // 注册Bearer认证方案
  32. api.openAPIRegistry.registerComponent('securitySchemes','bearerAuth',{
  33. type:'http',
  34. scheme:'bearer',
  35. bearerFormat:'JWT',
  36. description:'使用JWT进行认证'
  37. })
  38. // OpenAPI documentation endpoint
  39. // !import.meta.env.PROD
  40. if(1){
  41. api.doc31('/doc', {
  42. openapi: '3.1.0',
  43. info: {
  44. title: 'API Documentation',
  45. version: '1.0.0'
  46. },
  47. security: [{
  48. bearerAuth: []
  49. }]
  50. // servers: [{ url: '/api/v1' }]
  51. })
  52. app.get('/ui', swaggerUI({
  53. url: '/doc',
  54. persistAuthorization: true,
  55. manuallySwaggerUIHtml: (asset) => `
  56. <div>
  57. <div id="swagger-ui"></div>
  58. <link rel="stylesheet" href="https://ai-oss.d8d.fun/swagger-ui-dist/swagger-ui.css" />
  59. <script src="https://ai-oss.d8d.fun/swagger-ui-dist/swagger-ui-bundle.js" crossorigin="anonymous"></script>
  60. <script>
  61. window.onload = () => {
  62. window.ui = SwaggerUIBundle({
  63. dom_id: '#swagger-ui',
  64. url: '/doc',
  65. persistAuthorization: true
  66. })
  67. }
  68. </script>
  69. </div>
  70. `
  71. }))
  72. }
  73. export const userRoutes = api.route('/api/v1/users', usersRouter)
  74. export const authRoutes = api.route('/api/v1/auth', authRoute)
  75. export const roleRoutes = api.route('/api/v1/roles', rolesRoute)
  76. export type AuthRoutes = typeof authRoutes
  77. export type UserRoutes = typeof userRoutes
  78. export type RoleRoutes = typeof roleRoutes
  79. app.route('/', api)
  80. export default app