mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-12-23 06:42:41 +00:00
add new user_admin.go
This commit is contained in:
parent
16720b34db
commit
b5ba2e6a2a
1 changed files with 97 additions and 0 deletions
97
web/service/user_admin.go
Normal file
97
web/service/user_admin.go
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/mhsanaei/3x-ui/v2/database"
|
||||
"github.com/mhsanaei/3x-ui/v2/database/model"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type UserAdminService struct {
|
||||
DB *gorm.DB
|
||||
}
|
||||
|
||||
func NewUserAdminService() *UserAdminService {
|
||||
return &UserAdminService{DB: database.GetDB()}
|
||||
}
|
||||
|
||||
type UserDTO struct {
|
||||
Id int `json:"id"`
|
||||
Username string `json:"username"`
|
||||
Role string `json:"role"`
|
||||
}
|
||||
|
||||
func toDTO(u *model.User) UserDTO {
|
||||
return UserDTO{Id: u.Id, Username: u.Username, Role: u.Role}
|
||||
}
|
||||
|
||||
func (s *UserAdminService) ListUsers() ([]UserDTO, error) {
|
||||
var users []model.User
|
||||
if err := s.DB.Order("id ASC").Find(&users).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out := make([]UserDTO, 0, len(users))
|
||||
for i := range users {
|
||||
out = append(out, toDTO(&users[i]))
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (s *UserAdminService) CreateUser(username, rawPassword, role string) (UserDTO, error) {
|
||||
if username == "" || rawPassword == "" {
|
||||
return UserDTO{}, errors.New("username and password required")
|
||||
}
|
||||
if role == "" {
|
||||
role = "reader"
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(rawPassword), 12)
|
||||
if err != nil {
|
||||
return UserDTO{}, err
|
||||
}
|
||||
u := &model.User{
|
||||
Username: username,
|
||||
PasswordHash: string(hash),
|
||||
Role: role,
|
||||
}
|
||||
if err := s.DB.Create(u).Error; err != nil {
|
||||
return UserDTO{}, err
|
||||
}
|
||||
return toDTO(u), nil
|
||||
}
|
||||
|
||||
func (s *UserAdminService) UpdateUserRole(id int, newRole string) (UserDTO, error) {
|
||||
var u model.User
|
||||
if err := s.DB.First(&u, id).Error; err != nil {
|
||||
return UserDTO{}, err
|
||||
}
|
||||
if newRole == "" {
|
||||
return UserDTO{}, errors.New("role required")
|
||||
}
|
||||
u.Role = newRole
|
||||
if err := s.DB.Save(&u).Error; err != nil {
|
||||
return UserDTO{}, err
|
||||
}
|
||||
return toDTO(&u), nil
|
||||
}
|
||||
|
||||
func (s *UserAdminService) ResetPassword(id int, newPassword string) error {
|
||||
if newPassword == "" {
|
||||
return errors.New("password required")
|
||||
}
|
||||
var u model.User
|
||||
if err := s.DB.First(&u, id).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(newPassword), 12)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
u.PasswordHash = string(hash)
|
||||
return s.DB.Save(&u).Error
|
||||
}
|
||||
|
||||
func (s *UserAdminService) DeleteUser(id int) error {
|
||||
return s.DB.Delete(&model.User{}, id).Error
|
||||
}
|
||||
Loading…
Reference in a new issue