119 lines
3.2 KiB
Go
119 lines
3.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"hyapp-admin-server/internal/model"
|
|
"hyapp-admin-server/internal/security"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func (s *Store) ListUsers(options ListOptions) ([]model.User, int64, error) {
|
|
return s.ListUsersWithAccess(options, DataAccess{All: true})
|
|
}
|
|
|
|
func (s *Store) UsersByIDs(ids []uint) (map[uint]model.User, error) {
|
|
usersByID := make(map[uint]model.User, len(ids))
|
|
if len(ids) == 0 {
|
|
return usersByID, nil
|
|
}
|
|
var users []model.User
|
|
if err := s.db.Where("id IN ?", ids).Find(&users).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
for _, user := range users {
|
|
usersByID[user.ID] = user
|
|
}
|
|
return usersByID, nil
|
|
}
|
|
|
|
func (s *Store) ListUsersWithAccess(options ListOptions, access DataAccess) ([]model.User, int64, error) {
|
|
page, pageSize := normalizePage(options.Page, options.PageSize)
|
|
query := s.db.Model(&model.User{}).Preload("Roles")
|
|
query = applyUserFilters(query, options)
|
|
query = applyUserDataAccess(query, access)
|
|
|
|
var total int64
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
var users []model.User
|
|
err := query.Order(userSort(options.Sort)).Offset((page - 1) * pageSize).Limit(pageSize).Find(&users).Error
|
|
return users, total, err
|
|
}
|
|
|
|
func (s *Store) ExportUsers(options ListOptions) ([]model.User, error) {
|
|
return s.ExportUsersWithAccess(options, DataAccess{All: true})
|
|
}
|
|
|
|
func (s *Store) ExportUsersWithAccess(options ListOptions, access DataAccess) ([]model.User, error) {
|
|
var users []model.User
|
|
query := s.db.Model(&model.User{}).Preload("Roles")
|
|
query = applyUserFilters(query, options)
|
|
query = applyUserDataAccess(query, access)
|
|
err := query.Order(userSort(options.Sort)).Find(&users).Error
|
|
return users, err
|
|
}
|
|
|
|
func (s *Store) CreateUser(user *model.User, roleIDs []uint) error {
|
|
return s.db.Transaction(func(tx *gorm.DB) error {
|
|
if err := tx.Create(user).Error; err != nil {
|
|
return err
|
|
}
|
|
return replaceUserRoles(tx, user, roleIDs)
|
|
})
|
|
}
|
|
|
|
func (s *Store) UpdateUser(userID uint, updates map[string]any, roleIDs *[]uint) (*model.User, error) {
|
|
var user model.User
|
|
if err := s.db.First(&user, userID).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err := s.db.Transaction(func(tx *gorm.DB) error {
|
|
if len(updates) > 0 {
|
|
if err := tx.Model(&user).Updates(updates).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if roleIDs != nil {
|
|
if err := replaceUserRoles(tx, &user, *roleIDs); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return s.FindUserByID(userID)
|
|
}
|
|
|
|
func (s *Store) UpdateUserStatus(userID uint, status string) (*model.User, error) {
|
|
if !validUserStatus(status) {
|
|
return nil, errors.New("invalid user status")
|
|
}
|
|
return s.UpdateUser(userID, map[string]any{"status": status}, nil)
|
|
}
|
|
|
|
func (s *Store) BatchUpdateUserStatus(ids []uint, status string) error {
|
|
if !validUserStatus(status) {
|
|
return errors.New("invalid user status")
|
|
}
|
|
if len(ids) == 0 {
|
|
return nil
|
|
}
|
|
return s.db.Model(&model.User{}).Where("id IN ?", ids).Update("status", status).Error
|
|
}
|
|
|
|
func (s *Store) ResetUserPassword(userID uint, password string) error {
|
|
hash, err := security.HashPassword(password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return s.db.Model(&model.User{}).Where("id = ?", userID).Update("password_hash", hash).Error
|
|
}
|