feat: change to vigo

v3
veypi 10 months ago
parent 3b9cbe1c1b
commit 959e390126

@ -7,7 +7,7 @@
package access
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -24,7 +24,7 @@ type createOpts struct {
var _ = Router.Post("/", createAccess)
func createAccess(x *rest.X) (any, error) {
func createAccess(x *vigo.X) (any, error) {
// 解析请求参数
opts := &createOpts{}
if err := x.Parse(opts); err != nil {

@ -7,7 +7,7 @@
package access
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -18,7 +18,7 @@ type deleteOpts struct {
var _ = Router.Delete("/:id", deleteAccess)
func deleteAccess(x *rest.X) (any, error) {
func deleteAccess(x *vigo.X) (any, error) {
// 解析路径参数
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
@ -28,7 +28,7 @@ func deleteAccess(x *rest.X) (any, error) {
// 查找记录
var access models.Access
if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil {
return nil, rest.NewError("未找到资源").WithCode(404)
return nil, vigo.NewError("未找到资源").WithCode(404)
}
// 删除记录

@ -7,25 +7,25 @@
package access
import (
"github.com/veypi/OneBD/rest"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/vyes/vigo"
)
var _ = Router.Get("/:id", getAccess)
func getAccess(x *rest.X) (any, error) {
func getAccess(x *vigo.X) (any, error) {
// 获取路径参数
id := x.Params.Get("id")
if id == "" {
return nil, rest.NewError("ID不能为空").WithCode(400)
return nil, vigo.NewError("ID不能为空").WithCode(400)
}
// 查询数据库
var access models.Access
err := cfg.DB().Where("id = ?", id).First(&access).Error
if err != nil {
return nil, rest.NewError("未找到资源").WithCode(404)
return nil, vigo.NewError("未找到资源").WithCode(404)
}
return &access, nil

@ -8,7 +8,7 @@
package access
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()

@ -7,9 +7,9 @@
package access
import (
"github.com/veypi/OneBD/rest"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/vyes/vigo"
)
type listOpts struct {
@ -28,7 +28,7 @@ type listResponse struct {
var _ = Router.Get("/", listAccess)
func listAccess(x *rest.X) (any, error) {
func listAccess(x *vigo.X) (any, error) {
// 解析查询参数
opts := &listOpts{}
if err := x.Parse(opts); err != nil {

@ -9,7 +9,7 @@ package access
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
type updateOpts struct {
@ -21,7 +21,7 @@ type updateOpts struct {
var _ = Router.Patch("/:id", updateAccess)
func updateAccess(x *rest.X) (any, error) {
func updateAccess(x *vigo.X) (any, error) {
// 解析请求参数
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
@ -31,7 +31,7 @@ func updateAccess(x *rest.X) (any, error) {
// 查找记录
var access models.Access
if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil {
return nil, rest.NewError("未找到资源").WithCode(404)
return nil, vigo.NewError("未找到资源").WithCode(404)
}
// 更新字段

@ -7,18 +7,18 @@ import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/libs/utils"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/veypi/utils"
"github.com/vyes/vigo"
"gorm.io/gorm"
)
var _ = Router.Get("/:app_id/key", auth.Check("app", "app_id", auth.DoDelete), appKey)
func appKey(x *rest.X) (any, error) {
func appKey(x *vigo.X) (any, error) {
id := x.Params.Get("app_id")
if id == "" {
return nil, rest.ErrArgMissing.WithArgs("app_id")
return nil, vigo.ErrArgMissing.WithArgs("app_id")
}
data := &models.App{}
data.ID = id
@ -31,7 +31,7 @@ func appKey(x *rest.X) (any, error) {
var _ = Router.Delete("/:app_id", auth.Check("app", "app_id", auth.DoDelete), appDelete)
func appDelete(x *rest.X) (any, error) {
func appDelete(x *vigo.X) (any, error) {
data := &models.App{}
err := cfg.DB().Where("id = ?", x.Params.Get("app_id")).Delete(data).Error
@ -41,7 +41,7 @@ func appDelete(x *rest.X) (any, error) {
var _ = Router.Get("/:app_id", auth.Check("app", "app_id", auth.DoRead), appGet)
func appGet(x *rest.X) (any, error) {
func appGet(x *vigo.X) (any, error) {
data := &models.App{}
err := cfg.DB().Where("id = ?", x.Params.Get("app_id")).First(data).Error
@ -54,7 +54,7 @@ type listOpts struct {
var _ = Router.Get("/", appList)
func appList(x *rest.X) (any, error) {
func appList(x *vigo.X) (any, error) {
opts := &listOpts{}
err := x.Parse(opts)
if err != nil {
@ -92,7 +92,7 @@ type postOpts struct {
var _ = Router.Post("/", auth.Check("app", "", auth.DoCreate), appPost)
func appPost(x *rest.X) (any, error) {
func appPost(x *vigo.X) (any, error) {
opts := &postOpts{}
err := x.Parse(opts)
if err != nil {
@ -139,7 +139,7 @@ type patchOpts struct {
var _ = Router.Patch("/:app_id", auth.Check("app", "app_id", auth.DoUpdate), appPatch)
func appPatch(x *rest.X) (any, error) {
func appPatch(x *vigo.X) (any, error) {
opts := &patchOpts{}
err := x.Parse(opts)
if err != nil {

@ -1,9 +1,9 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/vyes/vigo"
)
type createOpts struct {
@ -14,7 +14,7 @@ type createOpts struct {
var _ = Router.Post("/", createAppUser)
func createAppUser(x *rest.X) (any, error) {
func createAppUser(x *vigo.X) (any, error) {
opts := &createOpts{}
if err := x.Parse(opts); err != nil {
return nil, err

@ -3,7 +3,7 @@ package app_user
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
type deleteOpts struct {
@ -13,7 +13,7 @@ type deleteOpts struct {
var _ = Router.Delete("/:user_id", deleteAppUser)
func deleteAppUser(x *rest.X) (any, error) {
func deleteAppUser(x *vigo.X) (any, error) {
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
@ -21,7 +21,7 @@ func deleteAppUser(x *rest.X) (any, error) {
appUser := &models.AppUser{}
if err := cfg.DB().Where("app_id = ? AND user_id = ?", opts.AppID, opts.UserID).First(appUser).Error; err != nil {
return nil, rest.NewError("app_user not found").WithCode(404)
return nil, vigo.NewError("app_user not found").WithCode(404)
}
if err := cfg.DB().Delete(appUser).Error; err != nil {

@ -3,23 +3,23 @@ package app_user
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Get("/:user_id", getAppUser)
func getAppUser(x *rest.X) (any, error) {
func getAppUser(x *vigo.X) (any, error) {
appID := x.Params.Get("app_id")
userID := x.Params.Get("user_id")
if appID == "" || userID == "" {
return nil, rest.NewError("app_id or user_id is empty").WithCode(400)
return nil, vigo.NewError("app_id or user_id is empty").WithCode(400)
}
appUser := &models.AppUser{}
err := cfg.DB().Where("app_id = ? AND user_id = ?", appID, userID).First(appUser).Error
if err != nil {
return nil, rest.NewError("app_user not found").WithCode(404)
return nil, vigo.NewError("app_user not found").WithCode(404)
}
return appUser, nil

@ -8,7 +8,7 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()

@ -1,7 +1,7 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -20,7 +20,7 @@ type listResponse struct {
var _ = Router.Get("/", listAppUsers)
func listAppUsers(x *rest.X) (any, error) {
func listAppUsers(x *vigo.X) (any, error) {
opts := &listOpts{}
if err := x.Parse(opts); err != nil {
return nil, err

@ -1,7 +1,7 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -14,7 +14,7 @@ type updateOpts struct {
var _ = Router.Patch("/:user_id", updateAppUser)
func updateAppUser(x *rest.X) (any, error) {
func updateAppUser(x *vigo.X) (any, error) {
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
@ -22,7 +22,7 @@ func updateAppUser(x *rest.X) (any, error) {
appUser := &models.AppUser{}
if err := cfg.DB().Where("app_id = ? AND user_id = ?", opts.AppID, opts.UserID).First(appUser).Error; err != nil {
return nil, rest.NewError("app_user not found").WithCode(404)
return nil, vigo.NewError("app_user not found").WithCode(404)
}
updates := map[string]interface{}{}

@ -12,14 +12,14 @@ import (
"github.com/veypi/OneAuth/api/app/app_user"
"github.com/veypi/OneAuth/api/app/resource"
"github.com/veypi/OneAuth/api/app/role"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()
var appRouter = Router.SubRouter(":app_id")
var (
_ = appRouter.Extend("resource",resource.Router)
_ = appRouter.Extend("user", app_user.Router)
_ = appRouter.Extend("role", role.Router)
_ =appRouter.Extend("access", access.Router)
_ = appRouter.Extend("resource", resource.Router)
_ = appRouter.Extend("user", app_user.Router)
_ = appRouter.Extend("role", role.Router)
_ = appRouter.Extend("access", access.Router)
)

@ -1,7 +1,7 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -14,7 +14,7 @@ type createOpts struct {
Des string `json:"des" parse:"json"`
}
func createResource(x *rest.X) (any, error) {
func createResource(x *vigo.X) (any, error) {
// 解析参数
opts := &createOpts{}
if err := x.Parse(opts); err != nil {
@ -30,7 +30,7 @@ func createResource(x *rest.X) (any, error) {
// 保存到数据库
if err := cfg.DB().Create(resource).Error; err != nil {
return nil, rest.NewError("failed to create resource").WithCode(500)
return nil, vigo.NewError("failed to create resource").WithCode(500)
}
return resource, nil

@ -1,7 +1,7 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -12,7 +12,7 @@ type deleteOpts struct {
ResourceID string `parse:"path"`
}
func deleteResource(x *rest.X) (any, error) {
func deleteResource(x *vigo.X) (any, error) {
// 解析参数
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
@ -22,12 +22,12 @@ func deleteResource(x *rest.X) (any, error) {
// 查找资源
resource := &models.Resource{}
if err := cfg.DB().Where("id = ?", opts.ResourceID).First(resource).Error; err != nil {
return nil, rest.NewError("resource not found").WithCode(404)
return nil, vigo.NewError("resource not found").WithCode(404)
}
// 删除资源
if err := cfg.DB().Delete(resource).Error; err != nil {
return nil, rest.NewError("failed to delete resource").WithCode(500)
return nil, vigo.NewError("failed to delete resource").WithCode(500)
}
return map[string]interface{}{

@ -1,25 +1,25 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
var _ = Router.Get("/:resource_id", getResource)
func getResource(x *rest.X) (any, error) {
func getResource(x *vigo.X) (any, error) {
// 获取路径参数
resourceID := x.Params.Get("resource_id")
if resourceID == "" {
return nil, rest.NewError("resource_id is required").WithCode(400)
return nil, vigo.NewError("resource_id is required").WithCode(400)
}
// 查询数据库
resource := &models.Resource{}
err := cfg.DB().Where("id = ?", resourceID).First(resource).Error
if err != nil {
return nil, rest.NewError("resource not found").WithCode(404)
return nil, vigo.NewError("resource not found").WithCode(404)
}
return resource, nil

@ -8,7 +8,7 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()

@ -1,7 +1,7 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -20,7 +20,7 @@ type listResponse struct {
var _ = Router.Get("/", listResources)
func listResources(x *rest.X) (any, error) {
func listResources(x *vigo.X) (any, error) {
// 解析参数
opts := &listOpts{}
if err := x.Parse(opts); err != nil {

@ -1,7 +1,7 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -14,7 +14,7 @@ type updateOpts struct {
Des *string `json:"des" parse:"json"`
}
func updateResource(x *rest.X) (any, error) {
func updateResource(x *vigo.X) (any, error) {
// 解析参数
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
@ -24,7 +24,7 @@ func updateResource(x *rest.X) (any, error) {
// 查找资源
resource := &models.Resource{}
if err := cfg.DB().Where("id = ?", opts.ResourceID).First(resource).Error; err != nil {
return nil, rest.NewError("resource not found").WithCode(404)
return nil, vigo.NewError("resource not found").WithCode(404)
}
// 更新字段
@ -39,7 +39,7 @@ func updateResource(x *rest.X) (any, error) {
// 执行更新
if len(updates) > 0 {
if err := cfg.DB().Model(resource).Updates(updates).Error; err != nil {
return nil, rest.NewError("failed to update resource").WithCode(500)
return nil, vigo.NewError("failed to update resource").WithCode(500)
}
}
return resource, nil

@ -3,7 +3,7 @@ package role
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Post("/", createRole)
@ -14,7 +14,7 @@ type createOpts struct {
Des string `json:"des"` // 角色描述
}
func createRole(x *rest.X) (any, error) {
func createRole(x *vigo.X) (any, error) {
// 解析参数
opts := &createOpts{}
if err := x.Parse(opts); err != nil {

@ -1,7 +1,7 @@
package role
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
@ -12,7 +12,7 @@ type deleteOpts struct {
RoleID string `parse:"path"` // 角色 ID
}
func deleteRole(x *rest.X) (any, error) {
func deleteRole(x *vigo.X) (any, error) {
// 解析参数
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
@ -22,7 +22,7 @@ func deleteRole(x *rest.X) (any, error) {
// 查找角色
role := &models.Role{}
if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil {
return nil, rest.NewError("role not found").WithCode(404)
return nil, vigo.NewError("role not found").WithCode(404)
}
// 执行删除操作

@ -1,25 +1,25 @@
package role
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
)
var _ = Router.Get("/:role_id", getRole)
func getRole(x *rest.X) (any, error) {
func getRole(x *vigo.X) (any, error) {
// 获取角色 ID
roleID := x.Params.Get("role_id")
if roleID == "" {
return nil, rest.NewError("role_id is required").WithCode(400)
return nil, vigo.NewError("role_id is required").WithCode(400)
}
// 查询数据库
role := &models.Role{}
err := cfg.DB().Where("id = ?", roleID).First(role).Error
if err != nil {
return nil, rest.NewError("role not found").WithCode(404)
return nil, vigo.NewError("role not found").WithCode(404)
}
return role, nil

@ -8,7 +8,7 @@
package role
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()

@ -3,7 +3,7 @@ package role
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Get("/", listRoles)
@ -21,7 +21,7 @@ type listResponse struct {
Items []*models.Role `json:"items"`
}
func listRoles(x *rest.X) (any, error) {
func listRoles(x *vigo.X) (any, error) {
// 解析参数
opts := &listOpts{}
if err := x.Parse(opts); err != nil {

@ -3,7 +3,7 @@ package role
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Patch("/:role_id", updateRole)
@ -14,7 +14,7 @@ type updateOpts struct {
Des *string `json:"des"` // 可选,角色描述
}
func updateRole(x *rest.X) (any, error) {
func updateRole(x *vigo.X) (any, error) {
// 解析参数
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
@ -24,7 +24,7 @@ func updateRole(x *rest.X) (any, error) {
// 查找角色
role := &models.Role{}
if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil {
return nil, rest.NewError("role not found").WithCode(404)
return nil, vigo.NewError("role not found").WithCode(404)
}
// 准备更新字段

@ -13,19 +13,18 @@ import (
"github.com/veypi/OneAuth/api/app"
"github.com/veypi/OneAuth/api/token"
"github.com/veypi/OneAuth/api/user"
"github.com/veypi/OneBD/rest"
"github.com/veypi/OneBD/rest/middlewares"
"github.com/vyes/vigo"
"github.com/vyes/vigo/middlewares/common"
)
var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse)
var Router = vigo.NewRouter().UseAfter(common.JsonResponse, common.JsonErrorResponse)
var (
_ = Router.Extend("user", user.Router,)
_ = Router.Extend("token", token.Router)
_ = Router.Extend("app", app.Router)
_ = Router.Extend("user", user.Router)
_ = Router.Extend("token", token.Router)
_ = Router.Extend("app", app.Router)
)
var _ = Router.Any("*", func(x *rest.X) error {
var _ = Router.Any("*", func(x *vigo.X) error {
return fmt.Errorf("404")
})

@ -5,7 +5,7 @@ import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Patch("/:token_id", tokenPatch)
@ -16,7 +16,7 @@ type patchOpts struct {
OverPerm *string `json:"over_perm" parse:"json"`
}
func tokenPatch(x *rest.X) (any, error) {
func tokenPatch(x *vigo.X) (any, error) {
opts := &patchOpts{}
err := x.Parse(opts)
if err != nil {
@ -42,7 +42,7 @@ func tokenPatch(x *rest.X) (any, error) {
var _ = Router.Delete("/:token_id", tokenDelete)
func tokenDelete(x *rest.X) (any, error) {
func tokenDelete(x *vigo.X) (any, error) {
data := &models.Token{}
err := cfg.DB().Where("id = ?", x.Params.Get("token_id")).Delete(data).Error
return data, err

@ -15,8 +15,8 @@ import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/veypi/utils/logv"
"github.com/vyes/vigo"
"github.com/vyes/vigo/logv"
)
type postOpts struct {
@ -33,7 +33,7 @@ type postOpts struct {
var _ = Router.Post("/", tokenPost)
// for user login app
func tokenPost(x *rest.X) (any, error) {
func tokenPost(x *vigo.X) (any, error) {
opts := &postOpts{}
err := x.Parse(opts)
if err != nil {
@ -58,7 +58,7 @@ func tokenPost(x *rest.X) (any, error) {
return nil, err
}
if refresh.ID == "" {
return nil, rest.ErrNotAuthorized
return nil, vigo.ErrNotAuthorized
}
err = cfg.DB().Where("id = ?", refresh.ID).First(data).Error
if err != nil {
@ -106,7 +106,7 @@ func tokenPost(x *rest.X) (any, error) {
claim.ExpiresAt = jwt.NewNumericDate(newToken.ExpiredAt)
return auth.GenJwt(claim)
} else {
return nil, rest.ErrNotPermitted
return nil, vigo.ErrNotPermitted
}
} else if typ == "ufs" {
claim.AID = refresh.AID
@ -130,9 +130,9 @@ func tokenPost(x *rest.X) (any, error) {
http.SetCookie(x, cookie)
return token, nil
} else {
return nil, rest.ErrArgInvalid
return nil, vigo.ErrArgInvalid
}
} else {
return nil, rest.ErrArgInvalid
return nil, vigo.ErrArgInvalid
}
}

@ -10,7 +10,7 @@ package token
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
type getOpts struct {
@ -19,7 +19,7 @@ type getOpts struct {
var _ = Router.Get("/:token_id", tokenGet)
func tokenGet(x *rest.X) (any, error) {
func tokenGet(x *vigo.X) (any, error) {
opts := &getOpts{}
err := x.Parse(opts)
if err != nil {
@ -38,7 +38,7 @@ type listOpts struct {
var _ = Router.Get("/", tokenList)
func tokenList(x *rest.X) (any, error) {
func tokenList(x *vigo.X) (any, error) {
opts := &listOpts{}
err := x.Parse(opts)
if err != nil {

@ -8,7 +8,7 @@
package token
import (
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()

@ -17,9 +17,9 @@ import (
"github.com/google/uuid"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/utils"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/veypi/utils"
"github.com/vyes/vigo"
"gorm.io/gorm"
)
@ -34,7 +34,7 @@ type postOpts struct {
Phone *string `json:"phone" gorm:"varchar(50);unique;default:null" parse:"json"`
}
func userPost(x *rest.X) (any, error) {
func userPost(x *vigo.X) (any, error) {
opts := &postOpts{}
err := x.Parse(opts)
if err != nil {
@ -47,20 +47,20 @@ func userPost(x *rest.X) (any, error) {
data.Code = opts.Code
data.Salt = utils.RandSeq(16)
if len(data.Username) < 2 {
return nil, rest.ErrArgInvalid.WithArgs("username length")
return nil, vigo.ErrArgInvalid.WithArgs("username length")
}
code, err := base64.URLEncoding.DecodeString(opts.Code)
if err != nil || len(code) < 8 {
return nil, rest.ErrArgInvalid.WithArgs("code")
return nil, vigo.ErrArgInvalid.WithArgs("code")
}
code = utils.PKCS7Padding(code, 32)
data.Code, err = utils.AesEncrypt([]byte(data.ID), code, []byte(data.Salt))
if err != nil {
return nil, rest.ErrArgInvalid.WithArgs("code")
return nil, vigo.ErrArgInvalid.WithArgs("code")
}
ncode, err := utils.AesDecrypt([]byte(data.Code), code, []byte(data.Salt))
if err != nil || ncode != data.ID {
return nil, rest.ErrInternalServer.WithString("code decrypt failed")
return nil, vigo.ErrInternalServer.WithString("code decrypt failed")
}
if opts.Nickname != nil {
data.Nickname = *opts.Nickname
@ -90,7 +90,7 @@ func userPost(x *rest.X) (any, error) {
status := "ok"
switch app.Typ {
case "private":
return rest.ErrNotPermitted.WithArgs("not enable register")
return vigo.ErrNotPermitted.WithArgs("not enable register")
case "apply":
status = "applying"
case "public":

@ -9,11 +9,11 @@ package user
import (
"github.com/veypi/OneAuth/api/user/role"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()
var (
_ = Router.Extend("/:user_id/user_role", role.Router)
_ = Router.Extend("/:user_id/user_role", role.Router)
)

@ -14,10 +14,10 @@ import (
"github.com/golang-jwt/jwt/v5"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/libs/utils"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/veypi/utils"
"github.com/veypi/utils/logv"
"github.com/vyes/vigo"
"github.com/vyes/vigo/logv"
)
var _ = Router.Post("/login", userLogin)
@ -32,7 +32,7 @@ type loginOpts struct {
Device *string `json:"device" parse:"json"`
}
func userLogin(x *rest.X) (any, error) {
func userLogin(x *vigo.X) (any, error) {
// Implement login logic here
// For example, validate user credentials and return a token
opts := &loginOpts{}
@ -61,14 +61,14 @@ func userLogin(x *rest.X) (any, error) {
logv.Info().Str("user", user.ID).Msg("login")
code, err := base64.URLEncoding.DecodeString(opts.Code)
if err != nil {
return nil, rest.ErrArgInvalid.WithArgs("code")
return nil, vigo.ErrArgInvalid.WithArgs("code")
}
logv.Warn().Msgf("code: %s", code)
ncode, err := utils.AesDecrypt([]byte(user.Code), utils.PKCS7Padding(code, 32), []byte(user.Salt))
logv.Warn().Msgf("id: %s\n%s", ncode, user.ID)
if err != nil || string(ncode) != user.ID {
return nil, rest.ErrNotAuthorized
return nil, vigo.ErrNotAuthorized
}
aid := cfg.Config.ID
if opts.AppID != nil && *opts.AppID != "" {

@ -10,7 +10,7 @@ package role
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Post("/", userRolePost)
@ -22,7 +22,7 @@ type postOpts struct {
Status string `json:"status" parse:"json"`
}
func userRolePost(x *rest.X) (any, error) {
func userRolePost(x *vigo.X) (any, error) {
opts := &postOpts{}
err := x.Parse(opts)
if err != nil {

@ -10,15 +10,15 @@ package role
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Delete("/:id", userRoleDelete)
func userRoleDelete(x *rest.X) (any, error) {
func userRoleDelete(x *vigo.X) (any, error) {
id := x.Params.Get("id")
if id == "" {
return nil, rest.ErrArgInvalid.WithArgs("id")
return nil, vigo.ErrArgInvalid.WithArgs("id")
}
data := &models.UserRole{}
err := cfg.DB().Where("id = ?", id).Delete(data).Error

@ -11,14 +11,14 @@ import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Get("/:id", `
get user role
`, userRoleGet)
func userRoleGet(x *rest.X) (any, error) {
func userRoleGet(x *vigo.X) (any, error) {
data := &models.UserRole{}
err := cfg.DB().Where("id = ?", x.Params.Get("id")).First(data).Error
return data, err
@ -35,7 +35,7 @@ type listOpts struct {
Status *string `json:"status" parse:"query"`
}
func userRoleList(x *rest.X) (any, error) {
func userRoleList(x *vigo.X) (any, error) {
opts := &listOpts{}
err := x.Parse(opts)
if err != nil {

@ -7,6 +7,6 @@
package role
import "github.com/veypi/OneBD/rest"
import "github.com/vyes/vigo"
var Router = rest.NewRouter()
var Router = vigo.NewRouter()

@ -10,7 +10,7 @@ package role
import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
type patchOpts struct {
@ -20,7 +20,7 @@ type patchOpts struct {
var _ = Router.Patch("/:id", userRolePatch)
func userRolePatch(x *rest.X) (any, error) {
func userRolePatch(x *vigo.X) (any, error) {
opts := &patchOpts{}
err := x.Parse(opts)
if err != nil {

@ -4,12 +4,12 @@ import (
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
var _ = Router.Delete("/:user_id", auth.Check("user", "user_id", auth.DoDelete), userDelete)
func userDelete(x *rest.X) (any, error) {
func userDelete(x *vigo.X) (any, error) {
data := &models.User{}
err := cfg.DB().Where("id = ?", x.Params.Get("user_id")).Delete(data).Error
return data, err
@ -21,7 +21,7 @@ type getOpts struct {
ID string `json:"id" parse:"path@user_id"`
}
func userGet(x *rest.X) (any, error) {
func userGet(x *vigo.X) (any, error) {
opts := &getOpts{}
err := x.Parse(opts)
if err != nil {
@ -44,7 +44,7 @@ type listOpts struct {
Status *uint `json:"status" parse:"query"`
}
func userList(x *rest.X) (any, error) {
func userList(x *vigo.X) (any, error) {
opts := &listOpts{}
err := x.Parse(opts)
if err != nil {
@ -85,7 +85,7 @@ type patchOpts struct {
Status *uint `json:"status" parse:"json"`
}
func userPatch(x *rest.X) (any, error) {
func userPatch(x *vigo.X) (any, error) {
opts := &patchOpts{}
err := x.Parse(opts)
if err != nil {

@ -18,7 +18,7 @@ type Options struct {
}
var Config = &Options{
TokenExpire: time.Minute / 2,
TokenExpire: time.Minute * 30,
ID: "test",
Key: "asdfghjklqwertyuiopzxcvbnm1234567890",
}

@ -21,11 +21,12 @@ func DB() *gorm.DB {
if db == nil {
var err error
var conn gorm.Dialector
if Config.DB == "mysql" {
switch Config.DB {
case "mysql":
conn = mysql.Open(Config.DSN)
} else if Config.DB == "postgres" {
case "postgres":
conn = postgres.Open(Config.DSN)
} else {
default:
conn = sqlite.Open(Config.DSN)
}
db, err = gorm.Open(conn,

@ -11,9 +11,9 @@ import (
"github.com/veypi/OneAuth"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/models"
"github.com/veypi/OneBD/rest"
"github.com/veypi/utils/flags"
"github.com/veypi/utils/logv"
"github.com/vyes/vigo"
"github.com/vyes/vigo/flags"
"github.com/vyes/vigo/logv"
)
var cmdMain = flags.New("app", "the backend server of app")
@ -61,7 +61,7 @@ func main() {
}
func runWeb() error {
server, err := rest.New(rest.WithHost(cliOpts.Host), rest.WithPort(cliOpts.Port))
server, err := vigo.New(vigo.WithHost(cliOpts.Host), vigo.WithPort(cliOpts.Port))
if err != nil {
return err
}

@ -7,12 +7,12 @@
package errs
import "github.com/veypi/OneBD/rest"
import "github.com/vyes/vigo"
var (
AuthNotFound = rest.NewError("auth not found").WithCode(40100)
AuthFailed = rest.NewError("auth failed").WithCode(40101)
AuthExpired = rest.NewError("auth expired").WithCode(40102)
AuthInvalid = rest.NewError("auth invalid").WithCode(40103)
AuthNoPerm = rest.NewError("auth no permission").WithCode(40104)
AuthNotFound = vigo.NewError("auth not found").WithCode(40100)
AuthFailed = vigo.NewError("auth failed").WithCode(40101)
AuthExpired = vigo.NewError("auth expired").WithCode(40102)
AuthInvalid = vigo.NewError("auth invalid").WithCode(40103)
AuthNoPerm = vigo.NewError("auth no permission").WithCode(40104)
)

@ -1,29 +1,26 @@
module github.com/veypi/OneAuth
go 1.23.2
go 1.24.1
replace github.com/veypi/vyes-ui => ../vyes-ui/
replace github.com/veypi/OneBD => ../OneBD/
replace github.com/veypi/utils => ../utils/
replace github.com/vyes/vigo => ../vigo/
require (
github.com/glebarez/sqlite v1.11.0
github.com/go-sql-driver/mysql v1.7.0
github.com/golang-jwt/jwt/v5 v5.2.2
github.com/google/uuid v1.6.0
github.com/veypi/OneBD v0.0.0-00010101000000-000000000000
github.com/veypi/utils v0.3.7
github.com/veypi/vyes-ui v0.0.0-00010101000000-000000000000
github.com/vyes/vigo v0.0.0-00010101000000-000000000000
gorm.io/driver/mysql v1.5.7
gorm.io/driver/postgres v1.5.11
gorm.io/gorm v1.25.12
gorm.io/gorm v1.30.0
)
require (
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/glebarez/go-sqlite v1.21.2 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/pgx/v5 v5.5.5 // indirect
@ -31,16 +28,17 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-isatty v0.0.17 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/rs/zerolog v1.17.2 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sync v0.1.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
github.com/rs/zerolog v1.34.0 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.22.5 // indirect
modernc.org/mathutil v1.5.0 // indirect

@ -1,6 +1,4 @@
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@ -13,6 +11,7 @@ github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GM
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
@ -35,9 +34,12 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@ -45,40 +47,34 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.17.2 h1:RMRHFw2+wF7LO0QqtELQwo8hqSmqISyCJeFeAAuWcRo=
github.com/rs/zerolog v1.17.2/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
github.com/veypi/utils v0.4.2 h1:utIQwkLRDssddbAcZz2Q9xPm3nfANPKsD5lmIGBa7CA=
github.com/veypi/utils v0.4.2/go.mod h1:GDeV3o1EE73dRrZ3cu/j97gPwXyzqtkWiM3D2I+e+6k=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@ -87,8 +83,8 @@ gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkD
gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE=
modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=

@ -9,12 +9,12 @@ package OneAuth
import (
"embed"
"github.com/veypi/OneAuth/api"
"github.com/veypi/OneBD/rest"
"github.com/veypi/OneBD/rest/middlewares/vyes"
"github.com/vyes/vigo"
"github.com/vyes/vigo/middlewares/vyes"
"github.com/veypi/vyes-ui"
)
var Router = rest.NewRouter()
var Router = vigo.NewRouter()
//go:embed ui/*
var uifs embed.FS

@ -16,7 +16,7 @@ import (
"github.com/golang-jwt/jwt/v5"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/errs"
"github.com/veypi/OneBD/rest"
"github.com/vyes/vigo"
)
func GenJwt(claim *Claims) (string, error) {
@ -49,7 +49,7 @@ func ParseJwt(tokenString string) (*Claims, error) {
return claims, nil
}
func checkJWT(x *rest.X) (*Claims, error) {
func checkJWT(x *vigo.X) (*Claims, error) {
authHeader := x.Request.Header.Get("Authorization")
if authHeader == "" {
authHeader = x.Request.URL.Query().Get("Authorization")
@ -70,12 +70,12 @@ func checkJWT(x *rest.X) (*Claims, error) {
return claims, nil
}
func CheckJWT(x *rest.X) (any, error) {
func CheckJWT(x *vigo.X) (any, error) {
return checkJWT(x)
}
func Check(target string, pid string, l AuthLevel) func(x *rest.X) (any, error) {
return func(x *rest.X) (any, error) {
func Check(target string, pid string, l AuthLevel) func(x *vigo.X) (any, error) {
return func(x *vigo.X) (any, error) {
claims, err := checkJWT(x)
if err != nil {
return nil, err

@ -1,25 +0,0 @@
//
// libs.go
// Copyright (C) 2024 veypi <i@veypi.com>
// 2024-11-04 21:50
// Distributed under terms of the GPL license.
//
package libs
import (
"net/http"
"github.com/veypi/OneBD/rest"
)
func CorsAllowAny(x *rest.X) {
origin := x.Request.Header.Get("Origin")
x.Header().Set("Access-Control-Allow-Origin", origin)
x.Header().Set("Access-Control-Allow-Credentials", "true")
x.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, PATCH, PROPFIND")
x.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, depth")
if x.Request.Method == http.MethodOptions && x.Request.Header.Get("Access-Control-Request-Method") != "" {
x.Stop()
}
}

@ -0,0 +1,173 @@
package utils
//
// crypto.go
// Copyright (C) 2020 light <light@1870499383@qq.com>
//
// Distributed under terms of the MIT license.
//
import (
"bytes"
"crypto"
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
)
// PKCS7Padding 添加 PKCS#7 填充
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
// PKCS7UnPadding 移除 PKCS#7 填充
func PKCS7UnPadding(origData []byte) ([]byte, bool) {
length := len(origData)
unpadding := int(origData[length-1])
if unpadding >= length {
return nil, false
}
return origData[:(length - unpadding)], true
}
// AesEncrypt 使用 AES-256-CBC 进行加密
// key 256 bit / 32 Byte
// iv 128 bit / 16 Byte
func AesEncrypt(plaintext, key, iv []byte) (string, error) {
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
plaintext = PKCS7Padding(plaintext, block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block, iv)
crypted := make([]byte, len(plaintext))
blockMode.CryptBlocks(crypted, plaintext)
return base64.StdEncoding.EncodeToString(crypted), nil
}
// AesDecrypt 使用 AES-256-CBC 进行解密
func AesDecrypt(encrypted, key, iv []byte) (string, error) {
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
encrypted, err = base64.StdEncoding.DecodeString(string(encrypted))
if err != nil {
return "", err
}
blockMode := cipher.NewCBCDecrypter(block, iv)
origData := make([]byte, len(encrypted))
blockMode.CryptBlocks(origData, encrypted)
origData, ok := PKCS7UnPadding(origData)
if !ok {
return "", errors.New("PKCS7UnPadding error")
}
return string(origData), nil
}
// rsa
func GetRsaKey(bits int) (public *rsa.PublicKey, private *rsa.PrivateKey, err error) {
private, err = rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return
}
public = &private.PublicKey
return
}
func GetPublicStr(key *rsa.PublicKey) (string, error) {
der, err := x509.MarshalPKIXPublicKey(key)
if err != nil {
return "", err
}
publicBlock := &pem.Block{
Type: "PUBLIC KEY",
Bytes: der,
}
return string(pem.EncodeToMemory(publicBlock)), nil
}
func GetPrivateStr(key *rsa.PrivateKey) (string, error) {
derStream := x509.MarshalPKCS1PrivateKey(key)
priBlock := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: derStream,
}
return string(pem.EncodeToMemory(priBlock)), nil
}
func GetPublicFromStr(key string) (*rsa.PublicKey, error) {
//解密pem格式的公钥
block, _ := pem.Decode([]byte(key))
if block == nil {
return nil, errors.New("public key error")
}
// 解析公钥
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
// 类型断言
pub := pubInterface.(*rsa.PublicKey)
return pub, nil
}
func GetPrivateFromStr(key string) (*rsa.PrivateKey, error) {
block, _ := pem.Decode([]byte(key))
if block == nil {
return nil, errors.New("private key error")
}
//解析PKCS1格式的私钥
return x509.ParsePKCS1PrivateKey(block.Bytes)
}
func RsaEncode(msg string, key *rsa.PublicKey) (string, error) {
encryptedBytes, err := rsa.EncryptOAEP(
sha256.New(),
rand.Reader,
key,
[]byte(msg),
nil)
if err != nil {
return "", err
}
return ToBase64(encryptedBytes), nil
}
func RsaDecode(msg string, key *rsa.PrivateKey) (string, error) {
raw, err := FromBase64(msg)
if err != nil {
return "", err
}
decryptedBytes, err := key.Decrypt(nil, raw, &rsa.OAEPOptions{Hash: crypto.SHA256})
return string(decryptedBytes), err
}
func RsaSign(msg string, key *rsa.PrivateKey) (string, error) {
signature, err := rsa.SignPSS(rand.Reader, key, crypto.SHA256, HashSha256Byte([]byte(msg)), nil)
if err != nil {
return "", err
}
return ToBase64(signature), nil
}
func RsaCheckSign(msg string, sign string, key *rsa.PublicKey) error {
raw, err := FromBase64(sign)
if err != nil {
return err
}
return rsa.VerifyPSS(key, crypto.SHA256, HashSha256Byte([]byte(msg)), raw, nil)
}

@ -0,0 +1,36 @@
package utils
import (
"crypto/md5"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
)
func HashMd5(s string) string {
h := md5.New()
h.Write([]byte(s))
return hex.EncodeToString(h.Sum(nil))
}
func HashSha256Byte(msg []byte) []byte {
msgHash := sha256.New()
_, err := msgHash.Write(msg)
if err != nil {
panic(err)
}
msgHashSum := msgHash.Sum(nil)
return msgHashSum
}
func HashSha256(msg string) string {
return hex.EncodeToString(HashSha256Byte([]byte(msg)))
}
func ToBase64(src []byte) string {
return base64.StdEncoding.EncodeToString(src)
}
func FromBase64(src string) ([]byte, error) {
return base64.StdEncoding.DecodeString(src)
}

@ -0,0 +1,33 @@
//
// utils.go
// Copyright (C) 2025 veypi <i@veypi.com>
// 2025-07-15 17:13
// Distributed under terms of the MIT license.
//
package utils
import (
"math/rand"
"time"
"unsafe"
)
var letters = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
var size = int32(len(letters))
var seed = rand.New(rand.NewSource(time.Now().UnixNano()))
// RandSeq produce random string seq
func RandSeq(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = letters[seed.Int31n(size)]
}
return *(*string)(unsafe.Pointer(&b))
}
func Rand(n int) []byte {
b := make([]byte, n)
seed.Read(b)
return b
}

@ -16,7 +16,7 @@ import (
"net/url"
"strings"
"github.com/veypi/utils/logv"
"github.com/vyes/vigo/logv"
)
type anyDirs interface {

@ -17,7 +17,7 @@ import (
"strings"
"time"
"github.com/veypi/utils/logv"
"github.com/vyes/vigo/logv"
)
func NewWebdav(p string) *Handler {

@ -1,7 +1,7 @@
package models
import (
"github.com/veypi/utils/logv"
"github.com/vyes/vigo/logv"
"gorm.io/gorm"
)

@ -12,8 +12,8 @@ import (
"time"
"github.com/google/uuid"
"github.com/veypi/OneBD/rest/middlewares/crud"
"github.com/veypi/utils/logv"
"github.com/vyes/vigo/logv"
"github.com/vyes/vigo/middlewares/dbmodels"
"gorm.io/gorm"
)
@ -31,23 +31,18 @@ func (m *BaseModel) BeforeCreate(tx *gorm.DB) error {
return nil
}
var AllModels = crud.New()
var AllModels = &dbmodels.ModelList{}
func init() {
AllModels.Append(User{}, AppUser{}, Resource{}, Access{}, Role{}, UserRole{}, Token{}, App{})
AllModels.One2Many(App{}, Resource{})
AllModels.One2Many(App{}, Role{})
AllModels.One2Many(App{}, Access{})
AllModels.Many2Many(AppUser{}, App{}, User{})
AllModels.Many2Many(UserRole{}, App{}, User{}, Role{})
}
func Migrate() error {
return crud.AutoMigrate(cfg.DB(), AllModels)
return AllModels.AutoMigrate(cfg.DB())
}
func Drop() error {
return crud.AutoDrop(cfg.DB(), AllModels)
return AllModels.AutoDrop(cfg.DB())
}
func InitDB() error {

@ -73,7 +73,7 @@
<div class="header-user ml-auto" v-if="user.name">
<img :src="user.icon" class="user-avatar" alt="用户头像">
<a href='/profile' class="user-name">{{ user.name }}</a>
<button @click="token.logout($env.root)" class="auth-btn logout-btn">
<button @click="token.logout()" class="auth-btn logout-btn">
退出
</button>
</div>

@ -111,14 +111,6 @@
</div>
</body>
<script setup>
import token from '/token.js'
await token.refreshToken($env.root)
if (token.isExpired()) {
token.logout()
}
user = token.body()
token.wrapAxios($axios)
$env.Guser = user
</script>
</html>

@ -399,8 +399,8 @@
username: signInForm.username,
code: btoa(signInForm.password),
});
localStorage.setItem('refresh', loginResponse)
if (loginResponse) {
localStorage.setItem('refresh', loginResponse)
window.location.href = redirect
}
} catch (error) {

@ -15,17 +15,5 @@
<page-404></page-404>
</vrouter>
</body>
<script setup>
if (typeof $node !== 'undefined') {
$axios.interceptors.response.use(function (response) {
if (response.data && response.data.code === 0) {
return response.data.data
}
return response;
}, function (error) {
return Promise.reject(error);
});
}
</script>
</html>

@ -0,0 +1,69 @@
/*
* routes.js
* Copyright (C) 2025 veypi <i@veypi.com>
*
* Distributed under terms of the MIT license.
*/
import token from './token.js'
function wrapAxios(axios) {
axios.interceptors.response.use(function(response) {
if (response.data && response.data.code === 0) {
return response.data.data
}
return response;
}, function(error) {
let data = error.response ? error.response.data : error.response
if (data.code >= 400) {
return Promise.reject(data.message)
}
return Promise.reject(data.message);
});
}
async function checkAuth(to, from, next) {
if (token.isExpired()) {
await token.refresh()
}
if (token.isExpired()) {
token.logout()
}
}
/**
* 定义路由
* @param{{$axios:Axios, $bus:EventBus, $router: VRouter, root:string}} env
* */
function setup(env) {
token.setRoot(env.root)
token.wrapAxios(env.$axios)
wrapAxios(env.$axios)
let user = token.body()
env.Guser = user
env.Gtoken = token.getToken()
// 添加路由
env.$router.addRoutes([
{
path: '/',
component: '/page/index.html',
name: 'home',
},
{
path: '/404',
component: '/page/404.html',
name: '404'
},
{
path: '*', // 通配符,匹配所有未定义的路由
component: (path) => {
if (path.endsWith('.html')) {
return path; // 如果是HTML文件直接返回
}
path = '/page' + path
return path + '.html'
},
}
])
}
export default setup

@ -23,6 +23,14 @@ class TokenService {
return localStorage.getItem(this.tokenKey);
}
toJSON() {
return this.getToken()
}
toString() {
return this.getToken()
}
setRefreshToken(refreshToken) {
localStorage.setItem(this.refreshTokenKey, refreshToken);
}
@ -56,17 +64,20 @@ class TokenService {
if (!this.__cache) {
this.__cache = this.parseToken(this.getToken());
}
if (!this.__cache) {
this.__cache = this.parseToken(this.getRefreshToken());
}
return this.__cache
}
logout() {
logout(to) {
this.clearToken();
location.href = this.__root + '/login?redirect=' + window.location.pathname;
location.href = this.__root + '/login?redirect=' + (to || window.location.pathname);
}
async refreshToken() {
async refresh() {
const refreshToken = this.getRefreshToken();
if (!refreshToken) {
this.logout()
// this.logout()
return;
}
try {
@ -141,13 +152,10 @@ class TokenService {
}, async function(error) {
// 任何超出 2xx 范围的状态码都会触发此函数
const originalRequest = error.config;
console.log(error)
// 检查错误响应状态码是否为 401 (未授权)
// 并且确保这不是一个已经重试过的请求 (通过 originalRequest._retry 标记)
if (error.response && error.response.status === 401 && !originalRequest._retry) {
// 标记此请求为已重试,避免无限循环
originalRequest._retry = true;
if (error.response && error.response.status === 401) {
// 统计该请求的重试次数
originalRequest.__retryCount = originalRequest.__retryCount || 0;
@ -183,7 +191,7 @@ class TokenService {
try {
// 发送请求来刷新令牌
await that.refreshToken();
await that.refresh();
const newToken = that.getToken();
// 更新原始请求的 Authorization 头为新的令牌
@ -195,10 +203,10 @@ class TokenService {
} catch (refreshError) {
// 如果刷新令牌本身也失败了 (例如refresh token 已过期)
// 清除本地令牌
that.clearToken();
// 拒绝等待队列中的所有请求
processQueue(refreshError);
that.logout();
// that.clearToken();
// that.logout();
// 拒绝原始请求的 Promise
return Promise.reject(refreshError);
} finally {

Loading…
Cancel
Save