mirror of https://github.com/veypi/OneAuth.git
feat: update app resouce
parent
7e7e6ed506
commit
6277ab0c4c
@ -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
|
||||
}
|
||||
@ -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…
Reference in New Issue