这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
接下来几篇文章我们介绍handler中函数的实现。
首先是GetUserMethod()
该api传入id,name或者email中的一个或者多个参数,按UserInfo返回用户的信息。
这里对字段进行校验,限制名字长度为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
}
每天更新一点点,下一篇接着介绍。