// Copyright (C) 2024 veypi // 2025-03-04 16:08:06 // Distributed under terms of the MIT license. package role import ( "github.com/veypi/vbase/cfg" "github.com/veypi/vbase/models" "github.com/veypi/vigo" ) type CreateRequest struct { OrgID string `json:"org_id" src:"json" desc:"组织ID"` Name string `json:"name" src:"json" desc:"角色名称"` Code string `json:"code" src:"json" desc:"角色代码"` Description string `json:"description,omitempty" src:"json" desc:"描述"` PolicyIDs []string `json:"policy_ids,omitempty" src:"json" desc:"策略ID列表"` } func create(x *vigo.X, req *CreateRequest) (*models.Role, error) { // 检查同一组织内代码是否已存在 var count int64 cfg.DB().Model(&models.Role{}).Where("org_id = ? AND code = ?", req.OrgID, req.Code).Count(&count) if count > 0 { return nil, vigo.ErrArgInvalid.WithString("role code already exists in this organization") } // 转换策略ID列表为字符串 policyIDsStr := "" for i, id := range req.PolicyIDs { if i > 0 { policyIDsStr += "," } policyIDsStr += id } role := &models.Role{ OrgID: req.OrgID, Name: req.Name, Code: req.Code, Description: req.Description, PolicyIDs: policyIDsStr, Scope: models.PolicyScopeOrg, } if err := cfg.DB().Create(role).Error; err != nil { return nil, vigo.ErrInternalServer.WithError(err) } return role, nil }