feat: update app resouce

v3
veypi 6 months ago
parent 7e7e6ed506
commit 6277ab0c4c

@ -6,7 +6,7 @@ import (
"oa/cfg"
"oa/errs"
"oa/libs/auth"
M "oa/models"
"oa/models"
"time"
"github.com/veypi/OneBD/rest"
@ -14,20 +14,14 @@ import (
"gorm.io/gorm"
)
func useApp(r rest.Router) {
r.Delete("/:app_id", auth.Check("app", "app_id", auth.DoDelete), appDelete)
r.Get("/:app_id", auth.Check("app", "app_id", auth.DoRead), appGet)
r.Get("/:app_id/key", auth.Check("app", "app_id", auth.DoDelete), appKey)
r.Get("/", appList)
r.Patch("/:app_id", auth.Check("app", "app_id", auth.DoUpdate), appPatch)
r.Post("/", auth.Check("app", "", auth.DoCreate), appPost)
}
var _ = Router.Get("/:app_id/key", auth.Check("app", "app_id", auth.DoDelete), appKey)
func appKey(x *rest.X) (any, error) {
id := x.Params.Get("app_id")
if id == "" {
return nil, errs.ArgsInvalid.WithStr("missing app_id")
}
data := &M.App{}
data := &models.App{}
data.ID = id
key := utils.RandSeq(32)
// err := cfg.DB().Where("id = ?", x.Params.GetStr("app_id")).First(data).Error
@ -35,38 +29,40 @@ func appKey(x *rest.X) (any, error) {
return key, err
}
var _ = Router.Delete("/:app_id", auth.Check("app", "app_id", auth.DoDelete), appDelete)
func appDelete(x *rest.X) (any, error) {
opts := &M.AppDelete{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.App{}
data := &models.App{}
err = cfg.DB().Where("id = ?", opts.ID).Delete(data).Error
err := cfg.DB().Where("id = ?", x.Params.Get("app_id")).Delete(data).Error
return data, err
}
func appGet(x *rest.X) (any, error) {
opts := &M.AppGet{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.App{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
var _ = Router.Get("/:app_id", auth.Check("app", "app_id", auth.DoRead), appGet)
func appGet(x *rest.X) (any, error) {
data := &models.App{}
err := cfg.DB().Where("id = ?", x.Params.Get("app_id")).First(data).Error
return data, err
}
type listOpts struct {
Name *string `json:"name" parse:"query"`
}
var _ = Router.Get("/", appList)
func appList(x *rest.X) (any, error) {
opts := &M.AppList{}
opts := &listOpts{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := make([]*struct {
M.App
models.App
UserStatus string `json:"user_status"`
}, 0, 10)
token, err := auth.CheckJWT(x)
@ -82,21 +78,27 @@ func appList(x *rest.X) (any, error) {
} else {
err = cfg.DB().Table("apps").Select("id", "name", "icon").Find(&data).Error
}
// logv.AssertError(cfg.DB().Table("accesses a").
// Select("a.name, a.t_id, a.level").
// Joins("INNER JOIN user_roles ur ON ur.role_id = a.role_id AND ur.user_id = ?", refresh.UID).
// Scan(&acList).Error)
return data, err
}
type postOpts struct {
Name string `json:"name" parse:"json"`
Icon string `json:"icon" parse:"json"`
Des *string `json:"des" parse:"json"`
Typ string `json:"typ" parse:"json"`
Status string `json:"status" parse:"json"`
InitUrl string `json:"init_url" parse:"json"`
}
var _ = Router.Post("/", auth.Check("app", "", auth.DoCreate), appPost)
func appPost(x *rest.X) (any, error) {
opts := &M.AppPost{}
opts := &postOpts{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.App{}
data := &models.App{}
data.Name = opts.Name
data.Icon = opts.Icon
@ -113,23 +115,37 @@ func appPost(x *rest.X) (any, error) {
if err != nil {
return err
}
au := &M.AppUser{
au := &models.AppUser{
AppID: data.ID,
UserID: x.Request.Context().Value("uid").(string),
Status: M.AUSTATUS_OK,
Status: models.AUSTATUS_OK,
}
return tx.Create(au).Error
})
return data, err
}
type patchOpts struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_id"`
Name *string `json:"name" parse:"json"`
Icon *string `json:"icon" parse:"json"`
Des *string `json:"des" parse:"json"`
Typ *string `json:"typ" gorm:"default:auto" parse:"json"`
InitRoleID *string `json:"init_role_id" gorm:"index;type:varchar(32)" parse:"json"`
Status *string `json:"status" gorm:"default:ok" parse:"json"`
InitUrl *string `json:"init_url" parse:"json"`
}
var _ = Router.Patch("/:app_id", auth.Check("app", "app_id", auth.DoUpdate), appPatch)
func appPatch(x *rest.X) (any, error) {
opts := &M.AppPatch{}
opts := &patchOpts{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.App{}
data := &models.App{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
if err != nil {

@ -1,100 +0,0 @@
package app
import (
"oa/cfg"
M "oa/models"
"strings"
"github.com/google/uuid"
"github.com/veypi/OneBD/rest"
)
func useAppUser(r rest.Router) {
r.Post("/", appUserPost)
r.Delete("/:user_id", appUserDelete)
r.Get("/:user_id", appUserGet)
r.Get("/", appUserList)
r.Patch("/:user_id", appUserPatch)
}
func appUserPost(x *rest.X) (any, error) {
opts := &M.AppUserPost{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.AppUser{}
data.ID = strings.ReplaceAll(uuid.New().String(), "-", "")
data.AppID = opts.AppID
data.UserID = opts.UserID
data.Status = opts.Status
err = cfg.DB().Create(data).Error
return data, err
}
func appUserDelete(x *rest.X) (any, error) {
opts := &M.AppUserDelete{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.AppUser{}
err = cfg.DB().Where("id = ?", opts.ID).Delete(data).Error
return data, err
}
func appUserGet(x *rest.X) (any, error) {
opts := &M.AppUserGet{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.AppUser{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
return data, err
}
func appUserList(x *rest.X) (any, error) {
opts := &M.AppUserList{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := make([]*M.AppUser, 0, 10)
query := cfg.DB()
if opts.AppID != nil {
query = query.Where("app_id LIKE ?", opts.AppID)
}
if opts.UserID != nil {
query = query.Where("user_id LIKE ?", opts.UserID)
}
if opts.Status != nil {
query = query.Where("status LIKE ?", opts.Status)
}
err = query.Find(&data).Error
return data, err
}
func appUserPatch(x *rest.X) (any, error) {
opts := &M.AppUserPatch{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.AppUser{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
if err != nil {
return nil, err
}
optsMap := make(map[string]interface{})
if opts.Status != nil {
optsMap["status"] = opts.Status
}
err = cfg.DB().Model(data).Updates(optsMap).Error
return data, err
}

@ -0,0 +1,34 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
type createOpts struct {
AppID string `parse:"path"`
UserID string `json:"user_id"`
Status string `json:"status" default:"ok"`
}
var _ = Router.Post("/", createAppUser)
func createAppUser(x *rest.X) (any, error) {
opts := &createOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
appUser := &models.AppUser{
AppID: opts.AppID,
UserID: opts.UserID,
Status: opts.Status,
}
if err := cfg.DB().Create(appUser).Error; err != nil {
return nil, err
}
return appUser, nil
}

@ -0,0 +1,36 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
type deleteOpts struct {
AppID string `parse:"path"`
UserID string `parse:"path"`
}
var _ = Router.Delete("/:user_id", deleteAppUser)
func deleteAppUser(x *rest.X) (any, error) {
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
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)
}
if err := cfg.DB().Delete(appUser).Error; err != nil {
return nil, err
}
return map[string]interface{}{
"message": "app_user deleted successfully",
"app_id": opts.AppID,
"user_id": opts.UserID,
}, nil
}

@ -0,0 +1,26 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Get("/:user_id", getAppUser)
func getAppUser(x *rest.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)
}
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 appUser, nil
}

@ -0,0 +1,14 @@
//
// init.go
// Copyright (C) 2025 veypi <i@veypi.com>
// 2025-05-13 16:47
// Distributed under terms of the MIT license.
//
package app_user
import (
"github.com/veypi/OneBD/rest"
)
var Router = rest.NewRouter()

@ -0,0 +1,52 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
type listOpts struct {
AppID string `parse:"path"`
Page int `parse:"query" default:"1"`
PageSize int `parse:"query" default:"20"`
Status string `parse:"query" default:""`
}
type listResponse struct {
Total int64 `json:"total"`
Items []*models.AppUser `json:"items"`
}
var _ = Router.Get("/", listAppUsers)
func listAppUsers(x *rest.X) (any, error) {
opts := &listOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
query := cfg.DB().Model(&models.AppUser{}).Where("app_id = ?", opts.AppID)
if opts.Status != "" {
query = query.Where("status = ?", opts.Status)
}
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, err
}
offset := (opts.Page - 1) * opts.PageSize
query = query.Offset(offset).Limit(opts.PageSize)
var users []*models.AppUser
if err := query.Find(&users).Error; err != nil {
return nil, err
}
return &listResponse{
Total: total,
Items: users,
}, nil
}

@ -0,0 +1,40 @@
package app_user
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
type updateOpts struct {
AppID string `parse:"path"`
UserID string `parse:"path"`
Status *string `json:"status"`
}
var _ = Router.Patch("/:user_id", updateAppUser)
func updateAppUser(x *rest.X) (any, error) {
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
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)
}
updates := map[string]interface{}{}
if opts.Status != nil {
updates["status"] = *opts.Status
}
if len(updates) > 0 {
if err := cfg.DB().Model(appUser).Updates(updates).Error; err != nil {
return nil, err
}
}
return appUser, nil
}

@ -8,14 +8,17 @@
package app
import (
"oa/api/app/app_user"
"oa/api/app/resource"
"oa/api/user/role"
"github.com/veypi/OneBD/rest"
)
var Router = rest.NewRouter()
func init() {
r := Router
useApp(r)
useAppUser(r.SubRouter(":app_id/user"))
useResource(r.SubRouter(":app_id/resource"))
useRole(r.SubRouter(":app_id/role"))
}
var appRouter = Router.SubRouter(":app_id")
var (
_ = appRouter.Extend("resource",resource.Router)
_ = appRouter.Extend("user", app_user.Router)
_ = appRouter.Extend("role", role.Router)
)

@ -1,91 +0,0 @@
package app
import (
"github.com/veypi/OneBD/rest"
"oa/cfg"
M "oa/models"
)
func useResource(r rest.Router) {
r.Post("/", resourcePost)
r.Delete("/", resourceDelete)
r.Get("/", resourceList)
r.Delete("/:resource_id", resourceDelete)
r.Get("/:resource_id", resourceGet)
r.Patch("/:resource_id", resourcePatch)
}
func resourceGet(x *rest.X) (any, error) {
opts := &M.ResourceGet{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Resource{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
return data, err
}
func resourcePatch(x *rest.X) (any, error) {
opts := &M.ResourcePatch{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Resource{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
if err != nil {
return nil, err
}
optsMap := make(map[string]interface{})
if opts.Des != nil {
optsMap["des"] = opts.Des
}
err = cfg.DB().Model(data).Updates(optsMap).Error
return data, err
}
func resourceDelete(x *rest.X) (any, error) {
opts := &M.ResourceDelete{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Resource{}
err = cfg.DB().Where("id = ?", opts.ID).Delete(data).Error
return data, err
}
func resourceList(x *rest.X) (any, error) {
opts := &M.ResourceList{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := make([]*M.Resource, 0, 10)
query := cfg.DB()
if opts.AppID != nil {
query = query.Where("app_id LIKE ?", opts.AppID)
}
err = query.Find(&data).Error
return data, err
}
func resourcePost(x *rest.X) (any, error) {
opts := &M.ResourcePost{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Resource{}
data.AppID = opts.AppID
data.Name = opts.Name
data.Des = opts.Des
err = cfg.DB().Create(data).Error
return data, err
}

@ -0,0 +1,37 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Post("/", createResource)
type createOpts struct {
AppID string `json:"app_id" parse:"path"`
Name string `json:"name" parse:"json"`
Des string `json:"des" parse:"json"`
}
func createResource(x *rest.X) (any, error) {
// 解析参数
opts := &createOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 创建资源对象
resource := &models.Resource{
AppID: opts.AppID,
Name: opts.Name,
Des: opts.Des,
}
// 保存到数据库
if err := cfg.DB().Create(resource).Error; err != nil {
return nil, rest.NewError("failed to create resource").WithCode(500)
}
return resource, nil
}

@ -0,0 +1,37 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Delete("/:resource_id", deleteResource)
type deleteOpts struct {
ResourceID string `parse:"path"`
}
func deleteResource(x *rest.X) (any, error) {
// 解析参数
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 查找资源
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)
}
// 删除资源
if err := cfg.DB().Delete(resource).Error; err != nil {
return nil, rest.NewError("failed to delete resource").WithCode(500)
}
return map[string]interface{}{
"message": "resource deleted successfully",
"id": opts.ResourceID,
}, nil
}

@ -0,0 +1,26 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Get("/:resource_id", getResource)
func getResource(x *rest.X) (any, error) {
// 获取路径参数
resourceID := x.Params.Get("resource_id")
if resourceID == "" {
return nil, rest.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 resource, nil
}

@ -0,0 +1,14 @@
//
// init.go
// Copyright (C) 2025 veypi <i@veypi.com>
// 2025-05-13 16:45
// Distributed under terms of the MIT license.
//
package resource
import (
"github.com/veypi/OneBD/rest"
)
var Router = rest.NewRouter()

@ -0,0 +1,56 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
type listOpts struct {
Page int `parse:"query" default:"1"`
PageSize int `parse:"query" default:"20"`
AppID string `parse:"query"`
Name string `parse:"query"`
}
type listResponse struct {
Total int64 `json:"total"`
Items []*models.Resource `json:"items"`
}
var _ = Router.Get("/", listResources)
func listResources(x *rest.X) (any, error) {
// 解析参数
opts := &listOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 构建查询
db := cfg.DB().Model(&models.Resource{})
if opts.AppID != "" {
db = db.Where("app_id = ?", opts.AppID)
}
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 resources []*models.Resource
if err := db.Offset(offset).Limit(opts.PageSize).Find(&resources).Error; err != nil {
return nil, err
}
return &listResponse{
Total: total,
Items: resources,
}, nil
}

@ -0,0 +1,47 @@
package resource
import (
"github.com/veypi/OneBD/rest"
"oa/cfg"
"oa/models"
)
var _ = Router.Patch("/:resource_id", updateResource)
type updateOpts struct {
ResourceID string `parse:"path"`
Name *string `json:"name" parse:"json"`
Des *string `json:"des" parse:"json"`
}
func updateResource(x *rest.X) (any, error) {
// 解析参数
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 查找资源
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)
}
// 更新字段
updates := map[string]interface{}{}
if opts.Name != nil {
updates["name"] = *opts.Name
}
if opts.Des != nil {
updates["des"] = *opts.Des
}
// 执行更新
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 resource, nil
}

@ -1,96 +0,0 @@
package app
import (
"github.com/veypi/OneBD/rest"
"oa/cfg"
M "oa/models"
)
func useRole(r rest.Router) {
r.Delete("/:role_id", roleDelete)
r.Get("/", roleList)
r.Post("/", rolePost)
r.Get("/:role_id", roleGet)
r.Patch("/:role_id", rolePatch)
}
func roleDelete(x *rest.X) (any, error) {
opts := &M.RoleDelete{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Role{}
err = cfg.DB().Where("id = ?", opts.ID).Delete(data).Error
return data, err
}
func roleList(x *rest.X) (any, error) {
opts := &M.RoleList{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := make([]*M.Role, 0, 10)
query := cfg.DB()
if opts.AppID != nil {
query = query.Where("app_id LIKE ?", opts.AppID)
}
if opts.Name != nil {
query = query.Where("name LIKE ?", opts.Name)
}
err = query.Find(&data).Error
return data, err
}
func rolePost(x *rest.X) (any, error) {
opts := &M.RolePost{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Role{}
data.AppID = opts.AppID
data.Name = opts.Name
data.Des = opts.Des
err = cfg.DB().Create(data).Error
return data, err
}
func roleGet(x *rest.X) (any, error) {
opts := &M.RoleGet{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Role{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
return data, err
}
func rolePatch(x *rest.X) (any, error) {
opts := &M.RolePatch{}
err := x.Parse(opts)
if err != nil {
return nil, err
}
data := &M.Role{}
err = cfg.DB().Where("id = ?", opts.ID).First(data).Error
if err != nil {
return nil, err
}
optsMap := make(map[string]interface{})
if opts.Name != nil {
optsMap["name"] = opts.Name
}
if opts.Des != nil {
optsMap["des"] = opts.Des
}
err = cfg.DB().Model(data).Updates(optsMap).Error
return data, err
}

@ -0,0 +1,37 @@
package role
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Post("/", createRole)
type createOpts struct {
AppID string `parse:"path"` // 应用 ID
Name string `json:"name"` // 角色名称
Des string `json:"des"` // 角色描述
}
func createRole(x *rest.X) (any, error) {
// 解析参数
opts := &createOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 创建角色
role := &models.Role{
AppID: opts.AppID,
Name: opts.Name,
Des: opts.Des,
}
// 保存到数据库
if err := cfg.DB().Create(role).Error; err != nil {
return nil, err
}
return role, nil
}

@ -0,0 +1,38 @@
package role
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Delete("/:role_id", deleteRole)
type deleteOpts struct {
RoleID string `parse:"path"` // 角色 ID
}
func deleteRole(x *rest.X) (any, error) {
// 解析参数
opts := &deleteOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 查找角色
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)
}
// 执行删除操作
if err := cfg.DB().Delete(role).Error; err != nil {
return nil, err
}
// 返回成功消息
return map[string]interface{}{
"message": "role deleted successfully",
"id": opts.RoleID,
}, nil
}

@ -0,0 +1,26 @@
package role
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Get("/:role_id", getRole)
func getRole(x *rest.X) (any, error) {
// 获取角色 ID
roleID := x.Params.Get("role_id")
if roleID == "" {
return nil, rest.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 role, nil
}

@ -0,0 +1,14 @@
//
// init.go
// Copyright (C) 2025 veypi <i@veypi.com>
// 2025-05-13 16:49
// Distributed under terms of the MIT license.
//
package role
import (
"github.com/veypi/OneBD/rest"
)
var Router = rest.NewRouter()

@ -0,0 +1,62 @@
package role
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Get("/", listRoles)
type listOpts struct {
Page int `parse:"query" default:"1"`
PageSize int `parse:"query" default:"20"`
Keyword string `parse:"query" default:""`
SortBy string `parse:"query" default:"created_at"`
Order string `parse:"query" default:"desc"`
}
type listResponse struct {
Total int64 `json:"total"`
Items []*models.Role `json:"items"`
}
func listRoles(x *rest.X) (any, error) {
// 解析参数
opts := &listOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 构建查询
db := cfg.DB().Model(&models.Role{})
query := db
// 应用关键词搜索
if opts.Keyword != "" {
query = query.Where("name LIKE ? OR des LIKE ?", "%"+opts.Keyword+"%", "%"+opts.Keyword+"%")
}
// 计算总数
var total int64
if err := query.Count(&total).Error; err != nil {
return nil, err
}
// 分页和排序
offset := (opts.Page - 1) * opts.PageSize
query = query.Order(opts.SortBy + " " + opts.Order)
query = query.Offset(offset).Limit(opts.PageSize)
// 查询数据
var roles []*models.Role
if err := query.Find(&roles).Error; err != nil {
return nil, err
}
// 返回结果
return &listResponse{
Total: total,
Items: roles,
}, nil
}

@ -0,0 +1,57 @@
package role
import (
"github.com/veypi/OneBD/rest"
"oa/models"
"oa/cfg"
)
var _ = Router.Patch("/:role_id", updateRole)
type updateOpts struct {
RoleID string `parse:"path"` // 角色 ID
Name *string `json:"name"` // 可选,角色名称
Des *string `json:"des"` // 可选,角色描述
}
func updateRole(x *rest.X) (any, error) {
// 解析参数
opts := &updateOpts{}
if err := x.Parse(opts); err != nil {
return nil, err
}
// 查找角色
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)
}
// 准备更新字段
updates := map[string]interface{}{}
if opts.Name != nil {
updates["name"] = *opts.Name
}
if opts.Des != nil {
updates["des"] = *opts.Des
}
// 如果没有更新字段,直接返回
if len(updates) == 0 {
return role, nil
}
// 执行更新
if err := cfg.DB().Model(role).Updates(updates).Error; err != nil {
return nil, err
}
// 重新查询以获取最新数据
if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil {
return nil, err
}
return role, nil
}

@ -1,110 +0,0 @@
package models
type AppGet struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_id"`
}
type AppPatch struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_id"`
Name *string `json:"name" parse:"json"`
Icon *string `json:"icon" parse:"json"`
Des *string `json:"des" parse:"json"`
Typ *string `json:"typ" gorm:"default:auto" parse:"json"`
InitRoleID *string `json:"init_role_id" gorm:"index;type:varchar(32)" parse:"json"`
Status *string `json:"status" gorm:"default:ok" parse:"json"`
InitUrl *string `json:"init_url" parse:"json"`
}
type AppDelete struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_id"`
}
type AppPost struct {
Name string `json:"name" parse:"json"`
Icon string `json:"icon" parse:"json"`
Des *string `json:"des" parse:"json"`
Typ string `json:"typ" gorm:"default:auto" parse:"json"`
Status string `json:"status" gorm:"default:ok" parse:"json"`
InitUrl string `json:"init_url" methods:"*patch" parse:"json"`
}
type AppList struct {
Name *string `json:"name" parse:"query"`
}
type AppUserGet struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_user_id"`
AppID string `json:"app_id" parse:"path"`
UserID string `json:"user_id" parse:"query"`
}
type AppUserPatch struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_user_id"`
Status *string `json:"status" parse:"json"`
AppID string `json:"app_id" parse:"path"`
}
type AppUserDelete struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@app_user_id"`
AppID string `json:"app_id" parse:"path"`
}
type AppUserList struct {
AppID *string `json:"app_id" parse:"path"`
UserID *string `json:"user_id" parse:"query"`
Status *string `json:"status" parse:"query"`
}
type AppUserPost struct {
Status string `json:"status" parse:"json"`
UserID string `json:"user_id" parse:"json"`
AppID string `json:"app_id" parse:"path"`
}
type ResourceGet struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@resource_id"`
}
type ResourcePatch struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@resource_id"`
Des *string `json:"des" parse:"json"`
}
type ResourceDelete struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@resource_id"`
}
type ResourceList struct {
AppID *string `json:"app_id" parse:"path"`
}
type ResourcePost struct {
AppID string `json:"app_id" parse:"path"`
Name string `json:"name" parse:"json"`
Des string `json:"des" parse:"json"`
}
type RoleGet struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@role_id"`
}
type RolePatch struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@role_id"`
Name *string `json:"name" parse:"json"`
Des *string `json:"des" parse:"json"`
}
type RoleDelete struct {
ID string `json:"id" gorm:"primaryKey;type:varchar(32)" parse:"path@role_id"`
}
type RoleList struct {
AppID *string `json:"app_id" parse:"path"`
Name *string `json:"name" parse:"query"`
}
type RolePost struct {
AppID string `json:"app_id" parse:"path"`
Name string `json:"name" parse:"json"`
Des string `json:"des" parse:"json"`
}
Loading…
Cancel
Save