feat(bookmark): 添加文件夹树结构导入导出接口 新增 `/bookmarks/v1/folder/serial` 接口,支持文件夹树结构的压缩导出与解压导入。 同时完善了相关响应结构体定义,如 ImportResponse 等。 refactor(bookmark): 重命名配置文件并调整字段命名 将 `config/api.yaml` 重命名为 `config/bookmark.yaml`,并统一将 parent_path_id 字段 更名为 parent_id。此外,更新 API 鉴权头名称为 X-BookMark-Token。 feat(bookmark): 实现文件夹挂载管理功能 新增以下三个接口用于管理文件夹挂载: - GET `/bookmarks/v1/folder/{id}/mount` 获取挂载信息 - POST `/bookmarks/v1/folder/{id}/mount` 挂载文件夹 - DELETE `/bookmarks/v1/folder/{id}/mount` 取消挂载 新增相关结构体定义:MountResponse、MountInfo。 feat(vfs): 初始化虚拟文件系统 API 配置 新增 `config/vfs.yaml` 和 `config/vfs_cfg.yaml` 配置文件,定义 VFS 相关接口和代码生成规则。 接口包括文件/目录的创建、读取、更新和删除操作,并引入新的安全头 X-VFS-Token。 chore(config): 忽略 data 目录并更新生成路径 .gitignore 中新增忽略 data/ 目录。同时更新 bookmark 和 vfs 的代码生成输出路径分别为 `./gen/bookmarks/gen.go` 和 `./gen/vfs/gen.go`。 chore(deps): 引入 casbin、gopsutil 等依赖库 go.mod 中新增 casbin 权限控制、gopsutil 系统监控等相关依赖。 ```
69 lines
2.0 KiB
Go
69 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"log"
|
|
"net/http"
|
|
|
|
bookmarks "git.zzyxyz.com/zzy/zzyxyz_go_api/gen/bookmarks"
|
|
"git.zzyxyz.com/zzy/zzyxyz_go_api/internal/handlers"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
//go:generate go tool oapi-codegen -config config/bookmark_cfg.yaml config/bookmark.yaml
|
|
//go:generate go tool oapi-codegen -config config/vfs_cfg.yaml config/vfs.yaml
|
|
//go:embed config/* dist/*
|
|
var staticFiles embed.FS
|
|
|
|
func main() {
|
|
gin.SetMode(gin.ReleaseMode)
|
|
router := gin.Default()
|
|
|
|
router.GET("/ping", func(c *gin.Context) {
|
|
c.JSON(200, gin.H{
|
|
"message": "pong",
|
|
})
|
|
})
|
|
|
|
api_router := router.Group("/api")
|
|
{
|
|
// create a type that satisfies the `api.ServerInterface`,
|
|
// which contains an implementation of every operation from the generated code
|
|
if server, err := handlers.NewBookMarks("./data/bookmark.sqlite3"); err != nil {
|
|
log.Fatal("Failed to create bookmarks server:", err)
|
|
} else if permission, err := handlers.NewBookMarkPermission(); err != nil || permission == nil {
|
|
log.Fatal("Failed to create bookmarks permission:", err)
|
|
} else {
|
|
bookmarks.RegisterHandlersWithOptions(api_router, server, *permission)
|
|
}
|
|
|
|
handlers.TodoHandler(api_router)
|
|
}
|
|
|
|
// FIXME 可能有更好的方式实现这个代码
|
|
// 提供嵌入的静态文件访问 - OpenAPI YAML 文件和 dist 目录
|
|
router.GET("/config/*filepath", func(ctx *gin.Context) {
|
|
fs := http.FileServer(http.FS(staticFiles))
|
|
fs.ServeHTTP(ctx.Writer, ctx.Request)
|
|
})
|
|
router.GET("/swagger/*filepath", func(ctx *gin.Context) {
|
|
// 直接修改请求路径实现映射
|
|
r := ctx.Request
|
|
originalPath := r.URL.Path
|
|
// 将 /swagger/* 映射为 /dist/*
|
|
r.URL.Path = "/dist" + ctx.Param("filepath")
|
|
|
|
fs := http.FileServer(http.FS(staticFiles))
|
|
fs.ServeHTTP(ctx.Writer, r)
|
|
|
|
// 恢复原始路径
|
|
r.URL.Path = originalPath
|
|
})
|
|
|
|
var listener = "localhost:8080"
|
|
log.Printf("Starting server at http://%s", listener)
|
|
log.Printf("Swagger UI: http://%s/swagger/index.html", listener)
|
|
log.Fatal(router.Run(listener))
|
|
}
|