package roleservicelogic import ( "ark-permission/internal/model" ers "code.30cm.net/wanderland/library-go/errors" "context" "fmt" "time" "ark-permission/gen_result/pb/permission" "ark-permission/internal/svc" "github.com/zeromicro/go-zero/core/logx" ) type CreateRoleLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewCreateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateRoleLogic { return &CreateRoleLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } type createRoleReq struct { Status string `json:"status" binding:"required"` RoleID string `json:"role_id"` DisplayName string `json:"display_name" binding:"required"` } // CreateRole 建立角色 func (l *CreateRoleLogic) CreateRole(in *permission.CreateRoleReq) (*permission.RoleResp, error) { // 驗證所需 if err := l.svcCtx.Validate.ValidateAll(&createRoleReq{ Status: in.GetStatus().String(), DisplayName: in.GetDisplayName(), }); err != nil { return nil, ers.InvalidFormat(err.Error()) } // 有操作失敗風險,因為如果並行狀態下有可能撞到產生的 role_id 一樣,不過此時有在表當中,擋 UK ,發生機率小,請使用者重試即可 roleID, err := l.svcCtx.RoleRepo.IncrementID(l.ctx) if err != nil { return nil, ers.DBError("[permission.CreateRole] failed to get IncrementID", err.Error()) } rid := in.GetRoleId() if rid == "" { rid = fmt.Sprintf("AM%06d", roleID) } now := time.Now().UTC() data := model.Role{ RoleId: rid, DisplayName: in.GetDisplayName(), Status: int64(in.GetStatus().Number()), CreateTime: now.Unix(), UpdateTime: now.Unix(), } res, err := l.svcCtx.RoleRepo.Insert(l.ctx, &data) if err != nil { return nil, ers.DBError("[RoleRepo.Insert] failed to insert role data", err.Error()) } lastID, err := res.LastInsertId() if err != nil { lastID = 0 } return &permission.RoleResp{ Id: lastID, DisplayName: data.DisplayName, RoleId: data.RoleId, Status: permission.PermissionStatus(data.Status), CreateTime: data.CreateTime, UpdateTime: data.UpdateTime, }, nil }