diff --git a/api/access/access.go b/api/access/access.go deleted file mode 100644 index 39e6a24..0000000 --- a/api/access/access.go +++ /dev/null @@ -1,109 +0,0 @@ -package access - -import ( - "github.com/veypi/OneBD/rest" - "oa/cfg" - M "oa/models" -) - -func useAccess(r rest.Router) { - r.Get("/", accessList) - r.Post("/", accessPost) - r.Get("/:access_id", accessGet) - r.Patch("/:access_id", accessPatch) - r.Delete("/:access_id", accessDelete) -} -func accessList(x *rest.X) (any, error) { - opts := &M.AccessList{} - err := x.Parse(opts) - if err != nil { - return nil, err - } - data := make([]*M.Access, 0, 10) - - query := cfg.DB() - if opts.CreatedAt != nil { - query = query.Where("created_at > ?", opts.CreatedAt) - } - if opts.UpdatedAt != nil { - query = query.Where("updated_at > ?", opts.UpdatedAt) - } - query = query.Where("app_id LIKE ?", opts.AppID) - if opts.UserID != nil { - query = query.Where("user_id LIKE ?", opts.UserID) - } - if opts.RoleID != nil { - query = query.Where("role_id LIKE ?", opts.RoleID) - } - if opts.Name != nil { - query = query.Where("name LIKE ?", opts.Name) - } - err = query.Find(&data).Error - - return data, err -} -func accessPost(x *rest.X) (any, error) { - opts := &M.AccessPost{} - err := x.Parse(opts) - if err != nil { - return nil, err - } - data := &M.Access{} - - data.AppID = opts.AppID - data.UserID = opts.UserID - data.RoleID = opts.RoleID - data.Name = opts.Name - data.TID = opts.TID - data.Level = opts.Level - err = cfg.DB().Create(data).Error - - return data, err -} -func accessGet(x *rest.X) (any, error) { - opts := &M.AccessGet{} - err := x.Parse(opts) - if err != nil { - return nil, err - } - data := &M.Access{} - - err = cfg.DB().Where("id = ?", opts.ID).First(data).Error - - return data, err -} -func accessDelete(x *rest.X) (any, error) { - opts := &M.AccessDelete{} - err := x.Parse(opts) - if err != nil { - return nil, err - } - data := &M.Access{} - - err = cfg.DB().Where("id = ?", opts.ID).Delete(data).Error - - return data, err -} -func accessPatch(x *rest.X) (any, error) { - opts := &M.AccessPatch{} - err := x.Parse(opts) - if err != nil { - return nil, err - } - data := &M.Access{} - - err = cfg.DB().Where("id = ?", opts.ID).First(data).Error - if err != nil { - return nil, err - } - optsMap := make(map[string]interface{}) - if opts.TID != nil { - optsMap["tid"] = opts.TID - } - if opts.Level != nil { - optsMap["level"] = opts.Level - } - err = cfg.DB().Model(data).Updates(optsMap).Error - - return data, err -} diff --git a/api/app/access/create.go b/api/app/access/create.go new file mode 100644 index 0000000..cde807e --- /dev/null +++ b/api/app/access/create.go @@ -0,0 +1,51 @@ +// +// create.go +// Copyright (C) 2024 veypi +// Distributed under terms of the MIT license. +// + +package access + +import ( + "github.com/veypi/OneBD/rest" + "oa/cfg" + "oa/models" +) + +type createOpts struct { + AppID string `json:"app_id"` + UserID *string `json:"user_id"` + RoleID *string `json:"role_id"` + ResourceID *string `json:"resource_id"` + Name string `json:"name"` + TID string `json:"tid"` + Level uint `json:"level"` +} + +var _ = Router.Post("/", createAccess) + +func createAccess(x *rest.X) (any, error) { + // 解析请求参数 + opts := &createOpts{} + if err := x.Parse(opts); err != nil { + return nil, err + } + + // 创建新记录 + access := models.Access{ + AppID: opts.AppID, + UserID: opts.UserID, + RoleID: opts.RoleID, + ResourceID: opts.ResourceID, + Name: opts.Name, + TID: opts.TID, + Level: opts.Level, + } + + // 保存到数据库 + if err := cfg.DB().Create(&access).Error; err != nil { + return nil, err + } + + return &access, nil +} diff --git a/api/app/access/del.go b/api/app/access/del.go new file mode 100644 index 0000000..97346ed --- /dev/null +++ b/api/app/access/del.go @@ -0,0 +1,40 @@ +// +// del.go +// Copyright (C) 2024 veypi +// Distributed under terms of the MIT license. +// + +package access + +import ( + "github.com/veypi/OneBD/rest" + "oa/cfg" + "oa/models" +) + +type deleteOpts struct { + ID string `parse:"path"` +} + +var _ = Router.Delete("/:id", deleteAccess) + +func deleteAccess(x *rest.X) (any, error) { + // 解析路径参数 + opts := &deleteOpts{} + if err := x.Parse(opts); err != nil { + return nil, err + } + + // 查找记录 + var access models.Access + if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil { + return nil, rest.NewError("未找到资源").WithCode(404) + } + + // 删除记录 + if err := cfg.DB().Delete(&access).Error; err != nil { + return nil, err + } + + return map[string]string{"message": "删除成功"}, nil +} diff --git a/api/app/access/get.go b/api/app/access/get.go new file mode 100644 index 0000000..a4752c0 --- /dev/null +++ b/api/app/access/get.go @@ -0,0 +1,32 @@ +// +// get.go +// Copyright (C) 2024 veypi +// Distributed under terms of the MIT license. +// + +package access + +import ( + "github.com/veypi/OneBD/rest" + "oa/cfg" + "oa/models" +) + +var _ = Router.Get("/:id", getAccess) + +func getAccess(x *rest.X) (any, error) { + // 获取路径参数 + id := x.Params.Get("id") + if id == "" { + return nil, rest.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 &access, nil +} diff --git a/api/access/init.go b/api/app/access/init.go similarity index 87% rename from api/access/init.go rename to api/app/access/init.go index f78e569..a6b5044 100644 --- a/api/access/init.go +++ b/api/app/access/init.go @@ -12,6 +12,3 @@ import ( ) var Router = rest.NewRouter() -func init() { - useAccess(Router) -} diff --git a/api/app/access/list.go b/api/app/access/list.go new file mode 100644 index 0000000..62dea35 --- /dev/null +++ b/api/app/access/list.go @@ -0,0 +1,70 @@ +// +// list.go +// Copyright (C) 2024 veypi +// Distributed under terms of the MIT license. +// + +package access + +import ( + "github.com/veypi/OneBD/rest" + "oa/cfg" + "oa/models" +) + +type listOpts struct { + Page int `parse:"query" default:"1"` + PageSize int `parse:"query" default:"20"` + AppID string `parse:"query"` + UserID string `parse:"query"` + RoleID string `parse:"query"` + Name string `parse:"query"` +} + +type listResponse struct { + Total int64 `json:"total"` + Items []models.Access `json:"items"` +} + +var _ = Router.Get("/", listAccess) + +func listAccess(x *rest.X) (any, error) { + // 解析查询参数 + opts := &listOpts{} + if err := x.Parse(opts); err != nil { + return nil, err + } + + // 构建查询 + db := cfg.DB().Model(&models.Access{}) + if opts.AppID != "" { + db = db.Where("app_id = ?", opts.AppID) + } + if opts.UserID != "" { + db = db.Where("user_id = ?", opts.UserID) + } + if opts.RoleID != "" { + db = db.Where("role_id = ?", opts.RoleID) + } + if opts.Name != "" { + db = db.Where("name LIKE ?", "%"+opts.Name+"%") + } + + // 计算总数 + var total int64 + if err := db.Count(&total).Error; err != nil { + return nil, err + } + + // 分页查询 + offset := (opts.Page - 1) * opts.PageSize + var items []models.Access + if err := db.Offset(offset).Limit(opts.PageSize).Find(&items).Error; err != nil { + return nil, err + } + + return &listResponse{ + Total: total, + Items: items, + }, nil +} diff --git a/api/app/access/patch.go b/api/app/access/patch.go new file mode 100644 index 0000000..b31053e --- /dev/null +++ b/api/app/access/patch.go @@ -0,0 +1,62 @@ +// +// patch.go +// Copyright (C) 2024 veypi +// Distributed under terms of the MIT license. +// + +package access + +import ( + "github.com/veypi/OneBD/rest" + "oa/cfg" + "oa/models" +) + +type updateOpts struct { + ID string `parse:"path"` + Name *string `json:"name"` + TID *string `json:"tid"` + Level *uint `json:"level"` +} + +var _ = Router.Patch("/:id", updateAccess) + +func updateAccess(x *rest.X) (any, error) { + // 解析请求参数 + opts := &updateOpts{} + if err := x.Parse(opts); err != nil { + return nil, err + } + + // 查找记录 + var access models.Access + if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil { + return nil, rest.NewError("未找到资源").WithCode(404) + } + + // 更新字段 + updates := map[string]interface{}{} + if opts.Name != nil { + updates["name"] = *opts.Name + } + if opts.TID != nil { + updates["tid"] = *opts.TID + } + if opts.Level != nil { + updates["level"] = *opts.Level + } + + // 执行更新 + if len(updates) > 0 { + if err := cfg.DB().Model(&access).Updates(updates).Error; err != nil { + return nil, err + } + } + + // 返回更新后的记录 + if err := cfg.DB().Where("id = ?", opts.ID).First(&access).Error; err != nil { + return nil, err + } + + return &access, nil +} diff --git a/api/app/init.go b/api/app/init.go index 4078265..a76f8b1 100644 --- a/api/app/init.go +++ b/api/app/init.go @@ -8,6 +8,7 @@ package app import ( + "oa/api/app/access" "oa/api/app/app_user" "oa/api/app/resource" "oa/api/user/role" @@ -21,4 +22,5 @@ var ( _ = appRouter.Extend("resource",resource.Router) _ = appRouter.Extend("user", app_user.Router) _ = appRouter.Extend("role", role.Router) + _ =appRouter.Extend("access", access.Router) ) diff --git a/api/init.go b/api/init.go index d2dc26c..efbea07 100644 --- a/api/init.go +++ b/api/init.go @@ -9,7 +9,6 @@ package api import ( "fmt" - "oa/api/access" "oa/api/app" "oa/api/token" "oa/api/user" @@ -20,21 +19,13 @@ import ( var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse) -var _ = Router.Get("hello", hello) - var ( _ = Router.Extend("user", user.Router) _ = Router.Extend("token", token.Router) _ = Router.Extend("app", app.Router) - _ = Router.Extend("access", access.Router) ) -func hello(x *rest.X) any { - return "hello" -} - -var _ = Router.Any("*", api404) - -func api404(x *rest.X) error { +var _ = Router.Any("*", func(x *rest.X) error { return fmt.Errorf("404") -} +}) + diff --git a/models/access.gen.go b/models/access.gen.go deleted file mode 100644 index 52c7fa3..0000000 --- a/models/access.gen.go +++ /dev/null @@ -1,37 +0,0 @@ -package models - -import "time" - -type AccessList struct { - CreatedAt *time.Time `json:"created_at" parse:"query"` - UpdatedAt *time.Time `json:"updated_at" parse:"query"` - AppID string `json:"app_id" gorm:"index;type:varchar(32)" parse:"query"` - UserID *string `json:"user_id" gorm:"index;type:varchar(32);default: null" parse:"query"` - RoleID *string `json:"role_id" gorm:"index;type:varchar(32);default: null" parse:"query"` - ResourceID *string `json:"resource_id" gorm:"index;type:varchar(32);default: null" parse:"query"` - Name *string `json:"name" parse:"query"` -} - -type AccessPost struct { - AppID string `json:"app_id" gorm:"index;type:varchar(32)" parse:"json"` - UserID *string `json:"user_id" gorm:"index;type:varchar(32);default: null" parse:"json"` - RoleID *string `json:"role_id" gorm:"index;type:varchar(32);default: null" parse:"json"` - Name string `json:"name" parse:"json"` - TID string `json:"tid" parse:"json"` - Level uint `json:"level" parse:"json"` - ResourceID *string `json:"resource_id" gorm:"index;type:varchar(32);default: null" parse:"json"` -} - -type AccessGet struct { - ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@access_id"` -} - -type AccessPatch struct { - ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@access_id"` - TID *string `json:"tid" parse:"json"` - Level *uint `json:"level" parse:"json"` -} - -type AccessDelete struct { - ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@access_id"` -} diff --git a/models/access.go b/models/access.go deleted file mode 100644 index 6e7b3a3..0000000 --- a/models/access.go +++ /dev/null @@ -1,28 +0,0 @@ -// -// access.go -// Copyright (C) 2024 veypi -// 2024-09-23 16:21 -// Distributed under terms of the MIT license. -// - -package models - -type Access struct { - BaseModel - AppID string `json:"app_id" gorm:"index;type:varchar(32)" methods:"post,list" parse:"json"` - App *App `json:"-" gorm:"foreignKey:AppID;references:ID"` - - UserID *string `json:"user_id" gorm:"index;type:varchar(32);default: null" methods:"post,list" parse:"json"` - User *User `json:"-" gorm:"foreignKey:UserID;references:ID"` - - RoleID *string `json:"role_id" gorm:"index;type:varchar(32);default: null" methods:"post,list" parse:"json"` - Role *Role `json:"-" gorm:"foreignKey:RoleID;references:ID"` - - ResourceID *string `json:"resource_id" gorm:"index;type:varchar(32);default: null" methods:"post,list" parse:"json"` - Resource *Resource `json:"-" gorm:"foreignKey:ResourceID;references:ID"` - - Name string `json:"name" methods:"post,*list" parse:"json"` - - TID string `json:"tid" methods:"post,*patch" parse:"json"` - Level uint `json:"level" methods:"post,*patch" parse:"json"` -} diff --git a/models/app.go b/models/app.go index f0fc9b3..4497ecd 100644 --- a/models/app.go +++ b/models/app.go @@ -84,3 +84,23 @@ type Role struct { UserCount uint `json:"user_count"` Access []*Access `json:"-"` } + +type Access struct { + BaseModel + AppID string `json:"app_id" gorm:"index;type:varchar(32)" methods:"post,list" parse:"json"` + App *App `json:"-" gorm:"foreignKey:AppID;references:ID"` + + UserID *string `json:"user_id" gorm:"index;type:varchar(32);default: null" methods:"post,list" parse:"json"` + User *User `json:"-" gorm:"foreignKey:UserID;references:ID"` + + RoleID *string `json:"role_id" gorm:"index;type:varchar(32);default: null" methods:"post,list" parse:"json"` + Role *Role `json:"-" gorm:"foreignKey:RoleID;references:ID"` + + ResourceID *string `json:"resource_id" gorm:"index;type:varchar(32);default: null" methods:"post,list" parse:"json"` + Resource *Resource `json:"-" gorm:"foreignKey:ResourceID;references:ID"` + + Name string `json:"name" methods:"post,*list" parse:"json"` + + TID string `json:"tid" methods:"post,*patch" parse:"json"` + Level uint `json:"level" methods:"post,*patch" parse:"json"` +}