account-server/internal/controller/api/user.go

301 lines
8.3 KiB
Go

package api
import (
"github.com/gin-gonic/gin"
"github.com/viletyy/yolk/convert"
"gitlink.org.cn/Gitlink/account-server/global"
"gitlink.org.cn/Gitlink/account-server/internal/service"
"gitlink.org.cn/Gitlink/account-server/pkg/app"
"gitlink.org.cn/Gitlink/account-server/pkg/errcode"
"gorm.io/gorm"
)
// @Summary 用户注册
// @Description
// @Accept mpfd
// @Produce json
// @Param username formData string true "用户名"
// @Param password formData string true "密码"
// @Param nickname formData string false "昵称"
// @Success 200 {object} errcode.Error "请求成功"
// @Router /register [post]
func Register(c *gin.Context) {
param := service.UserRegisterRequest{}
response := app.NewResponse(c)
valid, errs := app.BindAndValid(c, &param)
if !valid {
global.GO_LOG.Sugar().Errorf("app.BindAndValid errs: %v", errs)
response.ToResponseErrors(errs.Errors())
return
}
svc := service.New(c.Request.Context())
dbUser, err := svc.RegisterUser(&param)
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.RegisterUser err: %v", err)
response.ToErrorResponse(errcode.ErrorRegisterError)
return
}
response.ToResponse(dbUser)
}
// @Summary 用户登录
// @Description
// @Accept mpfd
// @Produce json
// @Param username formData string true "用户名"
// @Param password formData string true "密码"
// @Success 200 {object} errcode.Error "请求成功"
// @Router /login [post]
func Login(c *gin.Context) {
param := service.UserLoginRequest{}
response := app.NewResponse(c)
valid, errs := app.BindAndValid(c, &param)
if !valid {
global.GO_LOG.Sugar().Errorf("app.BindAndValid errs: %v", errs)
response.ToResponseErrors(errs.Errors())
return
}
svc := service.New(c.Request.Context())
dbUser, err := svc.LoginUser(&param)
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.LoginUser err: %v", err)
response.ToErrorResponse(errcode.ErrorLoginError)
return
}
token, err := app.GenerateUserToken(app.UserInfo{UserID: dbUser.ID, Username: dbUser.Username, Nickname: dbUser.Nickname, IsAdmin: dbUser.IsAdmin})
if err != nil {
global.GO_LOG.Sugar().Errorf("app.GenerateUserToken err: %v", err)
response.ToErrorResponse(errcode.UnauthorizedTokenGenerate)
return
}
response.ToResponse(gin.H{
"user": dbUser,
"token": token,
})
}
type User struct{}
func NewUser() User {
return User{}
}
// @Summary 获取用户信息
// @Description
// @Accept json
// @Produce json
// @Success 200 {object} model.User "请求成功"
// @Security ApiKeyAuth
// @Router /get_user_info [get]
func (user User) GetUserInfo(c *gin.Context) {
response := app.NewResponse(c)
userID := response.UserID
param := service.UserRequest{ID: userID}
svc := service.New(c.Request.Context())
dbUser, err := svc.GetUser(&param)
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.GetUser err: %v", err)
response.ToErrorResponse(errcode.ErrorGetFail)
return
}
response.ToResponse(dbUser)
}
// @Summary 用户列表
// @Tags users
// @Description
// @Accept json
// @Produce json
// @Param page query int false "页码"
// @Param page_size query int false "每页数量"
// @Param username query string false "用户名" maxlength(30)
// @Param nickname query string false "昵称" maxlength(30)
// @Success 200 {object} model.User "请求成功"
// @Security ApiKeyAuth
// @Router /users [get]
func (user User) List(c *gin.Context) {
param := service.UserListRequest{}
response := app.NewResponse(c)
valid, errs := app.BindAndValid(c, &param)
if !valid {
global.GO_LOG.Sugar().Errorf("app.BindAndValid errs: %v", errs)
response.ToResponseErrors(errs.Errors())
return
}
svc := service.New(c.Request.Context())
paper := app.Pager{Page: app.GetPage(c), PageSize: app.GetPageSize(c)}
total, err := svc.CountUser(&service.CountUserRequest{Username: param.Username, Nickname: param.Nickname})
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.CountUser err: %v", err)
response.ToErrorResponse(errcode.ErrorCountFail)
return
}
users, err := svc.GetUserList(&param, &paper)
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.GetUserList err: %v", err)
response.ToErrorResponse(errcode.ErrorGetListFail)
return
}
response.ToResponseList(users, total)
}
// @Summary 用户
// @Tags users
// @Description
// @Accept json
// @Produce json
// @Param id path int true "用户 ID"
// @Success 200 {object} model.User "请求成功"
// @Security ApiKeyAuth
// @Router /users/{id} [get]
func (user User) Get(c *gin.Context) {
userID, err := convert.StrTo(c.Param("id")).Int64()
response := app.NewResponse(c)
if err != nil {
global.GO_LOG.Sugar().Errorf("convert.StrTo err: %v", err)
response.ToErrorResponse(errcode.InvalidParams)
return
}
param := service.UserRequest{ID: userID}
valid, errs := app.BindAndValid(c, &param)
if !valid {
global.GO_LOG.Sugar().Errorf("app.BindAndValid errs: %v", errs)
response.ToResponseErrors(errs.Errors())
return
}
svc := service.New(c.Request.Context())
dbUser, err := svc.GetUser(&param)
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.GetUser err: %v", err)
response.ToErrorResponse(errcode.ErrorGetFail)
return
}
response.ToResponse(dbUser)
}
// @Summary 新增用户
// @Tags users
// @Description
// @Accept mpfd
// @Produce json
// @Param username formData string true "用户名" minlength(1) maxlength(30)
// @Param password formData string true "密码" minlength(1) maxlength(18)
// @param nickname formData string false "昵称" maxlength(30)
// @Success 200 {object} model.User "请求成功"
// @Security ApiKeyAuth
// @Router /users [post]
func (user User) Create(c *gin.Context) {
param := service.CreateUserRequest{}
response := app.NewResponse(c)
valid, errs := app.BindAndValid(c, &param)
if !valid {
global.GO_LOG.Sugar().Errorf("app.BindAndValid errs: %v", errs)
response.ToResponseErrors(errs.Errors())
return
}
svc := service.New(c.Request.Context())
dbUser, err := svc.CreateUser(&param)
if err != nil {
global.GO_LOG.Sugar().Errorf("svc.CreateUser err: %v", err)
response.ToErrorResponse(errcode.ErrorCreateFail)
return
}
response.ToResponse(dbUser)
}
// @Summary 更新用户
// @Tags users
// @Description
// @Accept mpfd
// @Produce json
// @Param id path int true "用户ID"
// @Param username formData string false "用户名" maxlength(30)
// @Param password formData string false "密码" maxlength(18)
// @param nickname formData string false "昵称" maxlength(30)
// @Success 200 {object} model.User "请求成功"
// @Security ApiKeyAuth
// @Router /users/{id} [patch]
func (user User) Update(c *gin.Context) {
userID, err := convert.StrTo(c.Param("id")).Int64()
response := app.NewResponse(c)
if err != nil {
global.GO_LOG.Sugar().Errorf("convert.StrTo err: %v", err)
response.ToErrorResponse(errcode.InvalidParams)
return
}
param := service.UpdateUserRequest{ID: userID}
valid, errs := app.BindAndValid(c, &param)
if !valid {
global.GO_LOG.Sugar().Errorf("app.BindAndValid errs: %v", errs)
response.ToResponseErrors(errs)
return
}
svc := service.New(c.Request.Context())
dbUser, err := svc.UpdateUser(&param)
if err != nil {
if err == gorm.ErrRecordNotFound {
global.GO_LOG.Sugar().Errorf("svc.UpdateUser err: %v", err)
response.ToErrorResponse(errcode.ErrorGetFail)
return
} else {
global.GO_LOG.Sugar().Errorf("svc.UpdateUser err: %v", err)
response.ToErrorResponse(errcode.ErrorUpdateFail)
return
}
}
response.ToResponse(dbUser)
}
// @Summary 删除用户
// @Tags users
// @Description
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} model.User "请求成功"
// @Security ApiKeyAuth
// @Router /users/{id} [delete]
func (user User) Delete(c *gin.Context) {
userID, err := convert.StrTo(c.Param("id")).Int64()
response := app.NewResponse(c)
if err != nil {
global.GO_LOG.Sugar().Errorf("convert.StrTo err: %v", err)
response.ToErrorResponse(errcode.InvalidParams)
return
}
param := service.DeleteUserRequest{ID: userID}
svc := service.New(c.Request.Context())
dbUser, err := svc.DeleteUser(&param)
if err != nil {
if err == gorm.ErrRecordNotFound {
global.GO_LOG.Sugar().Errorf("svc.DeleteUser err: %v", err)
response.ToErrorResponse(errcode.ErrorGetFail)
return
} else {
global.GO_LOG.Sugar().Errorf("svc.DeleteUser err: %v", err)
response.ToErrorResponse(errcode.ErrorDeleteFail)
return
}
}
errcode.Success.Data = dbUser
response.ToErrorResponse(errcode.Success)
}