Files
opencatd-open/internal/controller/user.go
2025-04-22 02:52:56 +08:00

218 lines
4.5 KiB
Go

package controller
import (
"net/http"
"opencatd-open/internal/dto"
"opencatd-open/internal/model"
"opencatd-open/internal/utils"
"strconv"
"strings"
"github.com/duke-git/lancet/v2/slice"
"github.com/gin-gonic/gin"
)
func (a Api) Register(c *gin.Context) {
req := new(dto.User)
err := c.ShouldBind(&req)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
err = a.userService.Register(c, &model.User{
Username: req.Username,
Password: req.Password,
})
if err != nil {
dto.Fail(c, 400, err.Error())
return
} else {
dto.Success(c, nil)
}
}
func (a Api) Login(c *gin.Context) {
req := new(dto.User)
err := c.ShouldBind(&req)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
auth, err := a.userService.Login(c, req)
if err != nil {
dto.Fail(c, 400, err.Error())
return
} else {
dto.Success(c, auth)
}
}
func (a Api) Profile(c *gin.Context) {
user, err := a.userService.Profile(c)
if err != nil {
dto.Fail(c, http.StatusUnauthorized, err.Error())
return
} else {
dto.Success(c, user)
}
}
func (a Api) UpdateProfile(c *gin.Context) {
var user = model.User{}
err := c.ShouldBind(&user)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
err = a.userService.Update(c, &model.User{Name: user.Name, Username: user.Username, Email: user.Email})
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) UpdatePassword(c *gin.Context) {
var passwd dto.ChangePassword
err := c.ShouldBind(&passwd)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
_user := c.MustGet("user").(*model.User)
if _user.Password == "" {
hashpass, err := utils.HashPassword(passwd.NewPassword)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
_user.Password = hashpass
} else {
if !utils.CheckPassword(_user.Password, passwd.Password) {
dto.Fail(c, http.StatusBadRequest, "password not match")
return
}
hashpass, err := utils.HashPassword(passwd.NewPassword)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
_user.Password = hashpass
}
err = a.userService.Update(c, _user)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) ListUser(c *gin.Context) {
limit, _ := strconv.Atoi(c.DefaultQuery("pageSize", "20"))
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
offset := (page - 1) * limit
active := c.QueryArray("active[]")
if !slice.ContainSubSlice([]string{"true", "false", ""}, active) {
dto.Fail(c, http.StatusBadRequest, "active must be true or false")
return
}
users, total, err := a.userService.List(c, limit, offset, active)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, gin.H{
"users": users,
"total": total,
})
}
func (a Api) CreateUser(c *gin.Context) {
var user model.User
err := c.ShouldBind(&user)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
err = a.userService.Create(c, &user)
if err != nil {
dto.Fail(c, http.StatusInternalServerError, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) GetUser(c *gin.Context) {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
user, err := a.userService.GetByID(c, id)
if err != nil {
dto.Fail(c, 500, err.Error())
return
}
dto.Success(c, user)
}
func (a Api) EditUser(c *gin.Context) {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
var user model.User
err := c.ShouldBind(&user)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
user.ID = int64(id)
err = a.userService.Update(c, &user)
if err != nil {
dto.Fail(c, 500, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) DeleteUser(c *gin.Context) {
id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
err := a.userService.Delete(c, id)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
dto.Success(c, nil)
}
func (a Api) UserOption(c *gin.Context) {
option := strings.ToLower(c.Param("option"))
var batchid dto.BatchIDRequest
err := c.ShouldBind(&batchid)
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
switch option {
case "enable":
err = a.userService.BatchEnable(c, batchid.IDs)
case "disable":
err = a.userService.BatchDisable(c, batchid.IDs)
case "delete":
err = a.userService.BatchDelete(c, batchid.IDs)
default:
dto.Fail(c, 400, "invalid option, only support enable, disable, delete")
return
}
if err != nil {
dto.Fail(c, 400, err.Error())
return
}
dto.Success(c, nil)
}