package logic import ( "context" "strconv" "lone-services/pkg/modelbase" "lone-services/pkg/utils" "lone-services/pkg/validate" user "lone-services/rpc/user/pb" "lone-services/services/user/internal/dao" "lone-services/services/user/internal/model" "lone-services/services/user/internal/svc" "lone-services/services/user/validator" "github.com/zeromicro/go-zero/core/logx" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "gorm.io/gorm" ) type InternalDeleteUserLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewInternalDeleteUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *InternalDeleteUserLogic { return &InternalDeleteUserLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *InternalDeleteUserLogic) InternalDeleteUser(in *user.InternalDeleteUserReq) (*user.InternalDeleteUserData, error) { var req validator.InternalDeleteUserValidator if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty { return nil, status.Error(codes.InvalidArgument, msg) } userModel := model.UserModel{}.Init() var row dao.UserRow if err := userModel.GetOne(modelbase.Params{ Eq: map[string]string{"id": strconv.FormatInt(req.UserId, utils.NumberTen)}, }, &row); err != nil { l.Errorf("internal delete user get: %v", err) return nil, status.Error(codes.Internal, utils.Fail.Msg) } if row.Id < utils.NumberOne { return nil, status.Error(codes.NotFound, utils.ErrorNotFund.Msg) } clientModel := model.UserClientModel{}.Init() var clients []dao.UserClient if err := clientModel.Items(modelbase.Params{ Eq: map[string]string{"user_id": strconv.FormatInt(req.UserId, utils.NumberTen)}, }, &clients); err != nil { l.Errorf("internal delete user clients: %v", err) return nil, status.Error(codes.Internal, utils.Fail.Msg) } outClients := make([]*user.InternalDeleteUserClient, 0, len(clients)) for _, c := range clients { outClients = append(outClients, &user.InternalDeleteUserClient{ ClientCode: c.ClientCode, BizId: c.BizId, }) } txErr := l.svcCtx.DB.WithContext(l.ctx).Transaction(func(tx *gorm.DB) error { credModel := model.UserCredentialModel{}.Init() credModel.Base = credModel.Base.WithTX(tx) if _, err := credModel.Del(modelbase.Params{ Eq: map[string]string{"user_id": strconv.FormatInt(req.UserId, utils.NumberTen)}, }, &dao.UserCredential{}); err != nil { return err } ucModel := model.UserClientModel{}.Init() ucModel.Base = ucModel.Base.WithTX(tx) if _, err := ucModel.Del(modelbase.Params{ Eq: map[string]string{"user_id": strconv.FormatInt(req.UserId, utils.NumberTen)}, }, &dao.UserClient{}); err != nil { return err } if err := deleteUserDetail(tx, req.UserId); err != nil { return err } return deleteUser(tx, req.UserId) }) if txErr != nil { l.Errorf("internal delete user tx: %v", txErr) return nil, status.Error(codes.Internal, utils.Fail.Msg) } return &user.InternalDeleteUserData{ Ok: true, Clients: outClients, }, nil }