Files
webapp-starter/src/server/api.ts
D8D Developer 71aaeb9424 ci: 添加 Docker 构建和推送工作流
- 新增 Dockerfile 和 .dockerignore 文件
- 添加 Gitea 持续集成工作流,用于构建和推送 Docker 镜像
- 新增 .gitignore 文件,忽略构建和配置文件
- 添加项目结构和规范文档,包括 TypeScript、模块化、API、数据库等规范
- 新增前端和后端的基础代码结构
2025-06-11 09:35:39 +00:00

137 lines
5.5 KiB
TypeScript

import { OpenAPIHono } from '@hono/zod-openapi'
import { errorHandler } from './utils/errorHandler'
import base from './api/base'
import usersRouter from './api/users/index'
import { initConfigRouter, initStatusRouter } from './api/init'
import paymentRouter from './api/payment'
import workspacesRouter from './api/workspaces/index'
import workspacesProjectsRouter from './api/workspaces.projects/index'
import workspacesTemplatesRouter from './api/workspaces.templates/index'
import workspacesContainersRouter from './api/workspaces.containers/index'
import workspacesCollaboratorsRouter from './api/workspaces.collaborations/index'
import workspacesProjectCollaboratorsRouter from './api/workspaces.project-collaborators/index'
import workspacesTemplateCollaboratorsRouter from './api/workspaces.template-collaborators/index'
import templateMarketplaceRouter from './api/marketplace/index'
import authRoute from './api/auth/index'
import aliBillsRoute from './api/ali-bills/index'
import { AuthContext } from './types/context'
import { AppDataSource } from './data-source'
const api = new OpenAPIHono<AuthContext>()
api.onError(errorHandler)
// Rate limiting
api.use('/api/v1/*', async (c, next) => {
const ip = c.req.header('x-forwarded-for') || c.req.header('cf-connecting-ip')
// 实现速率限制逻辑
await next()
})
// 数据库初始化中间件
api.use('/api/v1/*', async (c, next) => {
if(!AppDataSource.isInitialized) await AppDataSource.initialize();
await next()
})
// 注册Bearer认证方案
api.openAPIRegistry.registerComponent('securitySchemes','bearerAuth',{
type:'http',
scheme:'bearer',
bearerFormat:'JWT',
description:'使用JWT进行认证'
})
// OpenAPI documentation endpoint
api.doc31('/doc', {
openapi: '3.1.0',
info: {
title: 'API Documentation',
version: '1.0.0'
},
security: [{
bearerAuth: []
}]
// servers: [{ url: '/api/v1' }]
})
// const bindRoute = (api:OpenAPIHono, path: string, routes: Array<OpenAPIHono>) => {
// routes.forEach(route => {
// api = api.route(path, route)
// })
// return api
// }
// Register routes
let routes = api
.route('/api/v1/init', initConfigRouter)
.route('/api/v1/init', initStatusRouter)
.route('/api/v1/base', base)
.route('/api/v1/users', usersRouter.createRoute)
.route('/api/v1/users', usersRouter.listRoute)
.route('/api/v1/users', usersRouter.getRoute)
.route('/api/v1/users', usersRouter.updateRoute)
.route('/api/v1/users', usersRouter.deleteRoute)
.route('/api/v1/auth', authRoute.loginRoute.passwordRoute)
.route('/api/v1/auth', authRoute.loginRoute.smsRoute)
.route('/api/v1/auth', authRoute.logoutRoute)
.route('/api/v1/auth', authRoute.meRoute.meRoute)
.route('/api/v1/auth', authRoute.phoneCode.fixed)
.route('/api/v1/auth', authRoute.phoneCode.sms)
.route('/api/v1/auth', authRoute.registerRoute.registerRoute)
.route('/api/auth', authRoute.ssoVerify)
.route('/api/v1/payments', paymentRouter.notifyApi)
.route('/api/v1/payments', paymentRouter.queryApi)
.route('/api/v1/payments', paymentRouter.paymentApi)
.route('/api/v1/marketplace', templateMarketplaceRouter.listRoute)
.route('/api/v1/marketplace', templateMarketplaceRouter.detailRoute)
.route('/api/v1/marketplace', templateMarketplaceRouter.deleteRoute)
.route('/api/v1/workspaces', workspacesRouter.createRoutes)
.route('/api/v1/workspaces', workspacesRouter.deleteRoutes)
.route('/api/v1/workspaces', workspacesRouter.listRoutes)
.route('/api/v1/workspaces', workspacesRouter.getRoutes)
.route('/api/v1/workspaces', workspacesRouter.updateRoutes)
.route('/api/v1/workspaces', workspacesProjectsRouter.createRoutes)
.route('/api/v1/workspaces', workspacesProjectsRouter.deleteRoutes)
.route('/api/v1/workspaces', workspacesProjectsRouter.listRoutes)
.route('/api/v1/workspaces', workspacesProjectsRouter.getRoutes)
.route('/api/v1/workspaces', workspacesProjectsRouter.updateRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.createRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.deleteRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.listRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.getRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.updateRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.publishRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.useTemplateRoutes)
.route('/api/v1/workspaces', workspacesTemplatesRouter.getBlankTemplateRoute)
.route('/api/v1/workspaces', workspacesTemplatesRouter.listBlankTemplatesRoute)
.route('/api/v1/workspaces', workspacesContainersRouter.startRoutes)
.route('/api/v1/workspaces', workspacesContainersRouter.stopRoutes)
.route('/api/v1/workspaces', workspacesCollaboratorsRouter.repositoriesApp)
.route('/api/v1/workspaces', workspacesProjectCollaboratorsRouter.listRoutes)
.route('/api/v1/workspaces', workspacesProjectCollaboratorsRouter.createRoutes)
.route('/api/v1/workspaces', workspacesProjectCollaboratorsRouter.deleteRoutes)
.route('/api/v1/workspaces', workspacesProjectCollaboratorsRouter.checkRoutes)
.route('/api/v1/workspaces', workspacesTemplateCollaboratorsRouter.listRoutes)
.route('/api/v1/workspaces', workspacesTemplateCollaboratorsRouter.createRoutes)
.route('/api/v1/workspaces', workspacesTemplateCollaboratorsRouter.deleteRoutes)
.route('/api/v1/workspaces', workspacesTemplateCollaboratorsRouter.checkRoutes)
.route('/api/v1/ali-bills', aliBillsRoute.getRoute)
.route('/api/v1/ali-bills', aliBillsRoute.syncRoute)
export type ApiRoutes = typeof routes
export default routes