package roleservicelogic import ( ers "code.30cm.net/wanderland/library-go/errors" "context" "fmt" "github.com/zeromicro/go-zero/core/stores/sqlx" "ark-permission/gen_result/pb/permission" "ark-permission/internal/svc" "github.com/zeromicro/go-zero/core/logx" ) type UpdateRoleLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateRoleLogic { return &UpdateRoleLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } // UpdateRole 更新角色 func (l *UpdateRoleLogic) UpdateRole(in *permission.UpdateRoleReq) (*permission.RoleResp, error) { if in.GetRoleId() == "" { return nil, ers.InvalidFormat("failed to get role id") } // 暴露出 transaction 的統包,可以實現跨表跟同表 err := l.svcCtx.Conn.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error { if in.GetStatus() != 0 { if in.GetStatus() == permission.PermissionStatus_PERMISSION_STATUS_NONE { return fmt.Errorf("failed to get role id") } err := l.svcCtx.RoleRepo.TransUpdateStatusByRoleID( ctx, session, int64(in.GetStatus().Number()), in.GetRoleId()) if err != nil { return err } } if in.GetDisplayName() != "" { err := l.svcCtx.RoleRepo.TransUpdateDisplayNameByRoleID( ctx, session, in.GetDisplayName(), in.GetRoleId()) if err != nil { return err } } return nil }) if err != nil { return nil, ers.DBError(err.Error()) } result, err := l.svcCtx.RoleRepo.FindOneByRoleId(l.ctx, in.GetRoleId()) if err != nil { return nil, ers.DBError(err.Error()) } return &permission.RoleResp{ Id: result.Id, Status: permission.PermissionStatus(result.Status), DisplayName: result.DisplayName, RoleId: result.RoleId, CreateTime: result.CreateTime, UpdateTime: result.UpdateTime, }, nil }