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