update access

v3
veypi 6 months ago
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
}

@ -12,6 +12,3 @@ import (
) )
var Router = rest.NewRouter() var Router = rest.NewRouter()
func init() {
useAccess(Router)
}

@ -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
}

@ -8,6 +8,7 @@
package app package app
import ( import (
"oa/api/app/access"
"oa/api/app/app_user" "oa/api/app/app_user"
"oa/api/app/resource" "oa/api/app/resource"
"oa/api/user/role" "oa/api/user/role"
@ -21,4 +22,5 @@ var (
_ = appRouter.Extend("resource",resource.Router) _ = appRouter.Extend("resource",resource.Router)
_ = appRouter.Extend("user", app_user.Router) _ = appRouter.Extend("user", app_user.Router)
_ = appRouter.Extend("role", role.Router) _ = appRouter.Extend("role", role.Router)
_ =appRouter.Extend("access", access.Router)
) )

@ -9,7 +9,6 @@ package api
import ( import (
"fmt" "fmt"
"oa/api/access"
"oa/api/app" "oa/api/app"
"oa/api/token" "oa/api/token"
"oa/api/user" "oa/api/user"
@ -20,21 +19,13 @@ import (
var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse) var Router = rest.NewRouter().UseAfter(middlewares.JsonResponse, middlewares.JsonErrorResponse)
var _ = Router.Get("hello", hello)
var ( var (
_ = Router.Extend("user", user.Router) _ = Router.Extend("user", user.Router)
_ = Router.Extend("token", token.Router) _ = Router.Extend("token", token.Router)
_ = Router.Extend("app", app.Router) _ = Router.Extend("app", app.Router)
_ = Router.Extend("access", access.Router)
) )
func hello(x *rest.X) any { var _ = Router.Any("*", func(x *rest.X) error {
return "hello"
}
var _ = Router.Any("*", api404)
func api404(x *rest.X) error {
return fmt.Errorf("404") return fmt.Errorf("404")
} })

@ -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"`
}

@ -84,3 +84,23 @@ type Role struct {
UserCount uint `json:"user_count"` UserCount uint `json:"user_count"`
Access []*Access `json:"-"` 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"`
}

Loading…
Cancel
Save