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

44 阅读2分钟

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

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

CreateUserMethod()

由于逻辑也不是很复杂,感觉目前没有必要在数据层和api层之间再整一层service,所以这里直接在逻辑里面使用gorm-gen生成的query来做数据库操作。首先对可选字段进行检查,我们这里的api提供了注册时提供邮箱的能力。然后构建model.User类型,然后交由Create去创建用户。

这里有一个需要注意的点,由于我们设置了用户名为唯一索引,所以当重复创建用户名一样的用户时,会无法创建,且mysql中默认会占用掉一个id,即下次创建时使用的是下一个id,当前id号被跳过了。

image.png

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。

image.png

查询到用户后,检查可选字段是否存在,如果存在则对字段进行更新。注意我们的密码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微服务。