129 lines
4.2 KiB
Go
129 lines
4.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"users_management/m/model/entity"
|
|
|
|
"github.com/google/uuid"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type UsersRepo interface {
|
|
Post(user entity.User) error
|
|
GetRoleByDepartment(departmentName string) (entity.Role, error)
|
|
GetUserByUsername(username string) (entity.User, error)
|
|
GetUserByNomorInduk(nomorInduk string) (entity.User, error)
|
|
CreateUserFromExternal(user entity.User) error
|
|
UpdateUserRole(nomorInduk string, roleID uuid.UUID) error
|
|
GetAllUsers() ([]entity.User, error)
|
|
RegisterUser(user entity.User) error
|
|
GetPendingUsers() ([]entity.User, error)
|
|
UpdateUserStatus(userID uuid.UUID, status entity.UserStatus) error
|
|
GetUserByID(userID uuid.UUID) (entity.User, error)
|
|
GetUserByUsernameWithStatus(username string) (entity.User, error)
|
|
CreateSuperAdminBypass(user entity.User) error
|
|
UpdateUserRoleByID(userID uuid.UUID, roleID uuid.UUID) error
|
|
UpdateUserRoleByUsername(username string, roleID uuid.UUID) error
|
|
GetUserByName(name string) (entity.User, error)
|
|
}
|
|
|
|
type usersRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewUsersRepo(db *gorm.DB) UsersRepo {
|
|
return &usersRepo{
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
func (r *usersRepo) GetUserByName(name string) (entity.User, error) {
|
|
var user entity.User
|
|
// Use LOWER() function for case-insensitive comparison
|
|
err := r.db.Where("LOWER(name) = LOWER(?)", name).Preload("Role").First(&user).Error
|
|
return user, err
|
|
}
|
|
|
|
func (r *usersRepo) UpdateUserRoleByID(userID uuid.UUID, roleID uuid.UUID) error {
|
|
return r.db.Model(&entity.User{}).Where("id = ?", userID).Update("role_id", roleID).Error
|
|
}
|
|
|
|
func (r *usersRepo) UpdateUserRoleByUsername(username string, roleID uuid.UUID) error {
|
|
return r.db.Model(&entity.User{}).Where("username = ?", username).Update("role_id", roleID).Error
|
|
}
|
|
|
|
func (r *usersRepo) CreateSuperAdminBypass(user entity.User) error {
|
|
return r.db.Create(&user).Error
|
|
}
|
|
|
|
func (r *usersRepo) RegisterUser(user entity.User) error {
|
|
return r.db.Create(&user).Error
|
|
}
|
|
|
|
func (r *usersRepo) GetPendingUsers() ([]entity.User, error) {
|
|
var users []entity.User
|
|
err := r.db.Where("status = ?", entity.UserStatusPending).Preload("Role").Find(&users).Error
|
|
return users, err
|
|
}
|
|
|
|
func (r *usersRepo) UpdateUserStatus(userID uuid.UUID, status entity.UserStatus) error {
|
|
return r.db.Model(&entity.User{}).Where("id = ?", userID).Update("status", status).Error
|
|
}
|
|
|
|
func (r *usersRepo) GetUserByID(userID uuid.UUID) (entity.User, error) {
|
|
var user entity.User
|
|
err := r.db.Where("id = ?", userID).Preload("Role").First(&user).Error
|
|
return user, err
|
|
}
|
|
|
|
func (r *usersRepo) GetUserByUsernameWithStatus(username string) (entity.User, error) {
|
|
var user entity.User
|
|
err := r.db.Where("username = ?", username).Preload("Role").First(&user).Error
|
|
return user, err
|
|
}
|
|
|
|
func (r *usersRepo) Post(user entity.User) error {
|
|
err := r.db.Create(&user).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r *usersRepo) GetRoleByDepartment(departmentName string) (entity.Role, error) {
|
|
var role entity.Role
|
|
err := r.db.Where("name = ?", departmentName).First(&role).Error
|
|
if err != nil {
|
|
return role, err
|
|
}
|
|
return role, nil
|
|
}
|
|
|
|
func (r *usersRepo) GetUserByUsername(username string) (entity.User, error) {
|
|
var users entity.User
|
|
err := r.db.Where("username = ?", username).Preload("Role").First(&users).Error
|
|
if err != nil {
|
|
return users, err
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
// New methods for RBAC
|
|
func (r *usersRepo) GetUserByNomorInduk(nomorInduk string) (entity.User, error) {
|
|
var user entity.User
|
|
err := r.db.Where("nomor_induk = ?", nomorInduk).Preload("Role").First(&user).Error
|
|
return user, err
|
|
}
|
|
|
|
func (r *usersRepo) CreateUserFromExternal(user entity.User) error {
|
|
return r.db.Create(&user).Error
|
|
}
|
|
|
|
func (r *usersRepo) UpdateUserRole(nomorInduk string, roleID uuid.UUID) error {
|
|
return r.db.Model(&entity.User{}).Where("nomor_induk = ?", nomorInduk).Update("role_id", roleID).Error
|
|
}
|
|
|
|
func (r *usersRepo) GetAllUsers() ([]entity.User, error) {
|
|
var users []entity.User
|
|
err := r.db.Preload("Role").Find(&users).Error
|
|
return users, err
|
|
} |