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 }