package router import ( "chat/pkg/opencatd/db" "errors" "net/http" "time" "github.com/Sakurasan/to" "github.com/gin-gonic/gin" "github.com/google/uuid" "gorm.io/gorm" ) var ( rootToken string ) type User struct { IsDelete bool `json:"IsDelete,omitempty"` ID int `json:"id,omitempty"` UpdatedAt string `json:"updatedAt,omitempty"` Name string `json:"name,omitempty"` Token string `json:"token,omitempty"` CreatedAt string `json:"createdAt,omitempty"` } type Key struct { ID int `json:"id,omitempty"` Key string `json:"key,omitempty"` UpdatedAt string `json:"updatedAt,omitempty"` Name string `json:"name,omitempty"` CreatedAt string `json:"createdAt,omitempty"` } func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { if rootToken == "" { u, err := db.GetUserByID(uint(1)) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) c.Abort() return } rootToken = u.Token } token := c.GetHeader("Authorization") if token == "" || token[:7] != "Bearer " || token[7:] != rootToken { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) c.Abort() return } // 可以在这里对 token 进行验证并检查权限 c.Next() } } func Handleinit(c *gin.Context) { user, err := db.GetUserByID(1) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { u := db.User{Name: "root", Token: uuid.NewString()} u.ID = 1 if err := db.CreateUser(&u); err != nil { c.JSON(http.StatusOK, gin.H{ "error": err.Error(), }) return } else { rootToken = u.Token resJSON := User{ false, int(u.ID), u.UpdatedAt.Format(time.RFC3339), u.Name, u.Token, u.CreatedAt.Format(time.RFC3339), } c.JSON(http.StatusOK, resJSON) return } } c.JSON(http.StatusOK, gin.H{ "error": err.Error(), }) return } if user.ID == uint(1) { c.JSON(http.StatusOK, gin.H{ "error": "super user already exists, use cli to reset password", }) } } func HandleMe(c *gin.Context) { u, err := db.GetUserByID(1) if err != nil { c.JSON(http.StatusOK, gin.H{ "error": err.Error(), }) } resJSON := User{ false, int(u.ID), u.UpdatedAt.Format(time.RFC3339), u.Name, u.Token, u.CreatedAt.Format(time.RFC3339), } c.JSON(http.StatusOK, resJSON) } func HandleKeys(c *gin.Context) { keys, err := db.GetAllKeys() if err != nil { c.JSON(http.StatusOK, gin.H{ "error": err.Error(), }) } c.JSON(http.StatusOK, keys) } func HandleUsers(c *gin.Context) { users, err := db.GetAllUsers() if err != nil { c.JSON(http.StatusOK, gin.H{ "error": err.Error(), }) } c.JSON(http.StatusOK, users) } func HandleAddKey(c *gin.Context) { var body Key if err := c.BindJSON(&body); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } if err := db.AddKey(body.Key, body.Name); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } k, err := db.GetKeyrByName(body.Name) if err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, k) } func HandleDelKey(c *gin.Context) { id := to.Int(c.Param("id")) if id < 1 { c.JSON(http.StatusOK, gin.H{"error": "invalid key id"}) return } if err := db.DeleteKey(uint(id)); err != nil { c.JSON(http.StatusOK, gin.H{"error": "invalid key id"}) return } c.JSON(http.StatusOK, gin.H{"message": "ok"}) } func HandleAddUser(c *gin.Context) { var body User if err := c.BindJSON(&body); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } // if len(body.Name) == 0 { // c.JSON(http.StatusOK, gin.H{"error": "invalid user name"}) // return // } if err := db.AddUser(body.Name, uuid.NewString()); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } u, err := db.GetUserByName(body.Name) if err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, u) } func HandleDelUser(c *gin.Context) { id := to.Int(c.Param("id")) if id <= 1 { c.JSON(http.StatusOK, gin.H{"error": "invalid user id"}) return } if err := db.DeleteUser(uint(id)); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "ok"}) } func HandleResetUserToken(c *gin.Context) { id := to.Int(c.Param("id")) if err := db.UpdateUser(uint(id), uuid.NewString()); err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } u, err := db.GetUserByID(uint(id)) if err != nil { c.JSON(http.StatusOK, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, u) } func GenerateToken() string { token := uuid.New() return token.String() }