- 新增 Dockerfile 和 .dockerignore 文件 - 添加 Gitea 持续集成工作流,用于构建和推送 Docker 镜像 - 新增 .gitignore 文件,忽略构建和配置文件 - 添加项目结构和规范文档,包括 TypeScript、模块化、API、数据库等规范 - 新增前端和后端的基础代码结构
137 lines
5.5 KiB
TypeScript
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 |