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