mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-12-23 23:02:42 +00:00
98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
|
|
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
|
||
|
|
}
|