guard/internal/logic/roleservice/create_role_logic.go

85 lines
2.1 KiB
Go

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
}