使用kitex与gorm开发微服务-4 | 青训营笔记

76 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天

接下来几篇文章我们介绍handler中函数的实现。

首先是GetUserMethod()

image.png

该api传入id,name或者email中的一个或者多个参数,按UserInfo返回用户的信息。

image.png

这里对字段进行校验,限制名字长度为6-30个字符,在go中对应2-10个汉字。

对email的正则校验,目前存在bug,暂时还无法使用。(2/13/2023)

来看下GetUserMethod()的实现: 根据给出的可选参数查询用户,查询成功则返回model.UserInfo类型的用户数据,查询失败则返回错误信息。

// GetUserMethod implements the UserServiceImpl interface.
func (s *UserServiceImpl) GetUserMethod(ctx context.Context, request *usermicro.GetUserReq) (resp *usermicro.GetUserResp, err error) {
	// TODO: Your code here...
        
	user, err := service.QueryUserByIdOrNameOrEmail(request.Id, request.Name, request.Email)
	if err != nil {
		return &usermicro.GetUserResp{
			Status: false,
		}, err
	}

	userinstance, err := user.First()
	if err != nil {
		return &usermicro.GetUserResp{
			Status: false,
		}, err
	}

	return &usermicro.GetUserResp{
		Status: true,
		User: &usermicro.UserInfo{
			Id:            int64(userinstance.ID),
			Name:          userinstance.Name,
			Email:         &userinstance.Email,
			FollowCount:   userinstance.Follow_count,
			FollowerCount: userinstance.Follower_count,
		},
	}, nil
}

这里我们把查用户这个功能单独拆分成了一个方法,传入id,name和emil中的至少一个进行用户查询。查询按照id,name,email优先级降低进行,即有id优先按照id进行查询。

func QueryUserByIdOrNameOrEmail(id *int64, name *string, email *string) (query.IUserDo, error) {
	// by ID prioritily
	if id == nil && name == nil && email == nil {
		return nil, errors.New("needs valid id or name or email")
	}

	u := query.User

	var user query.IUserDo
	// use id to search user prioritily
	if id != nil {
		findeduser := u.Where(u.ID.Eq(uint(*id)))
		user = findeduser
	} else if name != nil {
		findeduser := u.Where(u.Name.Eq(*name))
		user = findeduser
	} else if email != nil {
		findeduser := u.Where(u.Email.Eq(*email))
		user = findeduser
	}
	return user, nil
}

LoginUserMethod()

该函数用于验证用户的是否可以登录。为支持不同的登录方式,采用了和GetUserMethod类似的查询方式。查询到用户后,检查用户输入的密码是否正确。

在这个微服务中,我们把对用户密码做MD5的操作做到了微服务层,而不是提供给业务层处理,这样的好处是,即使业务层出现疏漏,也能保证数据库中存储的不是明文密码。

func (s *UserServiceImpl) LoginUserMethod(ctx context.Context, request *usermicro.LoginUserReq) (resp *usermicro.LoginUserResp, err error) {
	// TODO: Your code here...
	user, err := service.QueryUserByIdOrNameOrEmail(nil, request.Name, request.Email)
	if err != nil {
		return &usermicro.LoginUserResp{
			Status: false,
			User:   &usermicro.UserInfo{},
		}, err
	}

	userinstance, err := user.First()
	if err != nil {
		return &usermicro.LoginUserResp{
			Status: false,
			User:   &usermicro.UserInfo{},
		}, err
	}

	if MD5(request.Password) == userinstance.Password {
		return &usermicro.LoginUserResp{ // succeed
			Status: true,
			User: &usermicro.UserInfo{
				Id:            int64(userinstance.ID),
				Name:          userinstance.Name,
				Email:         &userinstance.Email,
				FollowCount:   userinstance.Follow_count,
				FollowerCount: userinstance.Follower_count,
			},
		}, err
	}

	return &usermicro.LoginUserResp{
		Status: false,
		User:   &usermicro.UserInfo{},
	}, err
}

每天更新一点点,下一篇接着介绍。