mirror of https://github.com/veypi/OneAuth.git
update access
parent
6277ab0c4c
commit
71924315b4
@ -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
|
||||
}
|
||||
@ -0,0 +1,51 @@
|
||||
//
|
||||
// create.go
|
||||
// Copyright (C) 2024 veypi <i@veypi.com>
|
||||
// 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
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
//
|
||||
// del.go
|
||||
// Copyright (C) 2024 veypi <i@veypi.com>
|
||||
// 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
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
//
|
||||
// get.go
|
||||
// Copyright (C) 2024 veypi <i@veypi.com>
|
||||
// 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
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
//
|
||||
// list.go
|
||||
// Copyright (C) 2024 veypi <i@veypi.com>
|
||||
// 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
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
//
|
||||
// patch.go
|
||||
// Copyright (C) 2024 veypi <i@veypi.com>
|
||||
// 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
|
||||
}
|
||||
@ -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"`
|
||||
}
|
||||
@ -1,28 +0,0 @@
|
||||
//
|
||||
// access.go
|
||||
// Copyright (C) 2024 veypi <i@veypi.com>
|
||||
// 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"`
|
||||
}
|
||||
Loading…
Reference in New Issue