这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
这几篇文章我们介绍handler中函数的实现。
CreateUserMethod()
由于逻辑也不是很复杂,感觉目前没有必要在数据层和api层之间再整一层service,所以这里直接在逻辑里面使用gorm-gen生成的query来做数据库操作。首先对可选字段进行检查,我们这里的api提供了注册时提供邮箱的能力。然后构建model.User类型,然后交由Create去创建用户。
这里有一个需要注意的点,由于我们设置了用户名为唯一索引,所以当重复创建用户名一样的用户时,会无法创建,且mysql中默认会占用掉一个id,即下次创建时使用的是下一个id,当前id号被跳过了。
func (s *UserServiceImpl) CreateUserMethod(ctx context.Context, request *usermicro.CreateUserReq) (resp *usermicro.CreateUserResp, err error) {
// TODO: Your code here...
u := query.User
var email string
if request.Email != nil {
email = *request.Email
}
user1 := &model.User{
Name: request.Name,
Email: email,
Password: MD5(request.Password),
Follow_count: 0,
Follower_count: 0,
}
err = u.Create(user1)
if err != nil {
return &usermicro.CreateUserResp{
Status: false,
User: &usermicro.UserInfo{},
}, err
}
return &usermicro.CreateUserResp{
Status: true,
User: &usermicro.UserInfo{
Id: int64(user1.ID),
Name: user1.Name,
Email: &user1.Email,
FollowCount: user1.Follow_count,
FollowerCount: user1.Follower_count,
},
}, nil
}
ps:这里如果用户创建失败,resp其实可以不返回空对象。
CreateUserMethod()
该方法用于用户通过id或者用户名来更新用户信息。同getuser的方法类似,我们构造单独的函数使用id或者name可选字段来查询用户,优先级仍是id高于name。
查询到用户后,检查可选字段是否存在,如果存在则对字段进行更新。注意我们的密码MD5是微服务提供,所以在更新密码的时候也要对传入的明文做MD5。
func (s *UserServiceImpl) UpdateUserMethod(ctx context.Context, request *usermicro.UpdateUserReq) (resp *usermicro.UpdateUserResp, err error) {
// TODO: Your code here...
u := query.User
user, err := service.QueryUserByIdOrName(request.Id, request.Name)
if err != nil {
return &usermicro.UpdateUserResp{
Status: false,
}, err
}
if request.Email != nil {
user.Update(u.Email, request.Email)
}
if request.Password != nil {
user.Update(u.Password, MD5(*request.Password))
}
userinstance, err := user.First()
if err != nil {
return &usermicro.UpdateUserResp{
Status: false,
}, err
}
return &usermicro.UpdateUserResp{
Status: true,
User: &usermicro.UserInfo{
Id: int64(userinstance.ID),
Name: userinstance.Name,
Email: &userinstance.Email,
FollowCount: userinstance.Follow_count,
FollowerCount: userinstance.Follower_count,
},
}, nil
}
下一篇我们介绍hertz如何调用写好的user微服务。