package logic import ( "context" "encoding/json" "errors" "juwan-backend/app/users/rpc/internal/models" "juwan-backend/app/users/rpc/internal/models/users" "juwan-backend/app/users/rpc/internal/svc" "juwan-backend/app/users/rpc/pb" "github.com/jinzhu/copier" "github.com/zeromicro/go-zero/core/logx" ) type SearchUsersLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewSearchUsersLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SearchUsersLogic { return &SearchUsersLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } var SearUsersErr = errors.New("search users failed") func (l *SearchUsersLogic) SearchUsers(in *pb.SearchUsersReq) (out *pb.SearchUsersResp, err error) { if in.Page == nil || *in.Page < 0 { logx.Errorf("Invalid page number: %v", in.Page) return nil, errors.New("invalid page number") } if *in.Limit > 1000 { logx.Errorf("Limit exceeds max limit: %d", in.Limit) return nil, errors.New("limit exceeds max limit") } user, err := l.svcCtx.UsersModelRO.Query(). Where(users.Or( users.UsernameContainsFold(*in.Username), users.NicknameContainsFold(*in.Username), users.EmailContainsFold(*in.Username), users.CurrentRole(*in.CurrentRole), )). Offset(int(*in.Page * *in.Limit)). Limit(int(*in.Limit)). All(l.ctx) if err != nil { logx.Errorf("search users failed, err:%v.", err) return nil, SearUsersErr } out = &pb.SearchUsersResp{ Users: ConvertEntUsersToProto(user), } return } func ConvertEntUserToProto(entUser *models.Users) *pb.Users { if entUser == nil { return nil } out := &pb.Users{} err := copier.Copy(out, entUser) if err != nil { return out } out.CreatedAt = entUser.CreatedAt.Unix() out.UpdatedAt = entUser.UpdatedAt.Unix() if !entUser.DeletedAt.IsZero() { out.DeletedAt = entUser.DeletedAt.Unix() } verificationStatus, err := json.Marshal(entUser.VerificationStatus) if err != nil { return nil } out.VerificationStatus = string(verificationStatus) out.VerifiedRoles = entUser.VerifiedRoles out.PasswordHash = "" // 手动清空敏感字段 return out } func ConvertEntUsersToProto(users []*models.Users) []*pb.Users { list := make([]*pb.Users, 0, len(users)) for _, u := range users { list = append(list, ConvertEntUserToProto(u)) } return list }