Files
go-gin-api/internal/api/controller/user_handler/user.go
T
2021-01-17 18:37:43 +08:00

181 lines
4.9 KiB
Go

package user_handler
import (
"github.com/xinliangnote/go-gin-api/configs"
"github.com/xinliangnote/go-gin-api/internal/api/code"
"github.com/xinliangnote/go-gin-api/internal/api/model/user_model"
"github.com/xinliangnote/go-gin-api/internal/api/repository/cache_repo"
"github.com/xinliangnote/go-gin-api/internal/api/repository/db_repo"
"github.com/xinliangnote/go-gin-api/internal/api/service/user_service"
"github.com/xinliangnote/go-gin-api/internal/pkg/core"
"github.com/xinliangnote/go-gin-api/pkg/token"
"go.uber.org/zap"
)
var _ UserDemo = (*userDemo)(nil)
type UserDemo interface {
// i 为了避免被其他包实现
i()
// 创建用户
Create() core.HandlerFunc
// 通过用户主键ID更新用户昵称
UpdateNickNameByID() core.HandlerFunc
// 用户登录
Login() core.HandlerFunc
// 用户详情
Detail() core.HandlerFunc
}
type userDemo struct {
logger *zap.Logger
userService user_service.UserService
}
func NewUserDemo(logger *zap.Logger, db db_repo.Repo, cache cache_repo.Repo) UserDemo {
return &userDemo{
logger: logger,
userService: user_service.NewUserService(db, cache),
}
}
func (u *userDemo) i() {}
// 创建用户
// @Summary 创建用户
// @Description 创建用户
// @Tags Demo
// @Accept json
// @Produce json
// @Param RequestInfo body user_model.CreateRequest true "请求信息"
// @Success 200 {object} user_model.CreateResponse "返回信息"
// @Router /user/create [post]
func (u *userDemo) Create() core.HandlerFunc {
return func(c core.Context) {
req := new(user_model.CreateRequest)
res := new(user_model.CreateResponse)
if err := c.ShouldBindJSON(req); err != nil {
u.logger.Error("[user] should bind json err", zap.Error(err))
c.AbortWithError(code.ErrParamBind)
return
}
id, err := u.userService.Create(c, req)
if err != nil {
u.logger.Error("[user] Create err", zap.Error(err))
c.AbortWithError(code.ErrUserCreate)
return
}
res.Id = id
c.SetPayload(code.OK.WithData(res))
}
}
// 更新用户名称
// @Summary 更新用户名称
// @Description 更新用户名称
// @Tags Demo
// @Accept json
// @Produce json
// @Param RequestInfo body user_model.UpdateNickNameByIDRequest true "请求信息"
// @Success 200 {object} user_model.UpdateNickNameByIDResponse "返回信息"
// @Router /user/update [post]
func (u *userDemo) UpdateNickNameByID() core.HandlerFunc {
return func(c core.Context) {
req := new(user_model.UpdateNickNameByIDRequest)
res := new(user_model.UpdateNickNameByIDResponse)
if err := c.ShouldBindJSON(req); err != nil {
u.logger.Error("[user] should bind json err", zap.Error(err))
c.AbortWithError(code.ErrParamBind)
return
}
err := u.userService.UpdateNickNameByID(c, req.Id, req.NickName)
if err != nil {
u.logger.Error("[user] UpdateNickNameByID err", zap.Error(err))
c.AbortWithError(code.ErrUserUpdate)
return
}
res.Id = req.Id
c.SetPayload(code.OK.WithData(res))
}
}
// 用户登录
// @Summary 用户登录
// @Description 用户登录
// @Tags Demo
// @Accept json
// @Produce json
// @Param RequestInfo body user_model.LoginRequest true "请求信息"
// @Success 200 {object} user_model.LoginResponse "返回信息"
// @Router /user/login [post]
func (u *userDemo) Login() core.HandlerFunc {
return func(c core.Context) {
req := new(user_model.LoginRequest)
res := new(user_model.LoginResponse)
if err := c.ShouldBindJSON(req); err != nil {
u.logger.Error("should bind json err", zap.Error(err))
c.AbortWithError(code.ErrParamBind)
return
}
cfg := configs.Get().JWT
tokenString, err := token.New(cfg.Secret).Sign(req.UserID, req.UserName)
if err != nil {
u.logger.Error("token sign err", zap.Error(err))
c.AbortWithError(code.ErrAuthorization)
return
}
claims, err := token.New(cfg.Secret).Parse(tokenString)
if err != nil {
u.logger.Error("token parse err", zap.Error(err))
c.AbortWithError(code.ErrAuthorization)
return
}
res.Authorization = tokenString
res.ExpireTime = claims.ExpiresAt
c.SetPayload(code.OK.WithData(res))
}
}
// 用户详情
// @Summary 用户详情
// @Description 用户详情
// @Tags Demo
// @Accept json
// @Produce json
// @Param username path string true "用户名"
// @Success 200 {object} user_model.DetailResponse "返回信息"
// @Router /user/info/{username} [get]
func (u *userDemo) Detail() core.HandlerFunc {
return func(c core.Context) {
req := new(user_model.DetailRequest)
res := new(user_model.DetailResponse)
if err := c.ShouldBindURI(req); err != nil {
u.logger.Error("should bind uri err", zap.Error(err))
c.AbortWithError(code.ErrParamBind)
return
}
user, err := u.userService.GetUserByUserName(c, req.UserName)
if err != nil {
u.logger.Error("[user] GetUserByUserName err", zap.Error(err))
c.AbortWithError(code.ErrUserSearch)
return
}
res.Id = user.Id
res.UserName = user.UserName
res.NickName = user.NickName
res.Mobile = user.Mobile
c.SetPayload(code.OK.WithData(res))
}
}