package repository import ( "context" "github.com/Caknoooo/go-gin-clean-starter/database/entities" "gorm.io/gorm" ) type ( UserRepository interface { Register(ctx context.Context, tx *gorm.DB, user entities.M_User) (entities.M_User, error) GetUserById(ctx context.Context, tx *gorm.DB, userId string) (entities.M_User, error) GetUserByEmail(ctx context.Context, tx *gorm.DB, email string) (entities.M_User, error) GetUserByUsername(ctx context.Context, tx *gorm.DB, username string) (entities.M_User, error) CheckEmail(ctx context.Context, tx *gorm.DB, email string) (entities.M_User, bool, error) CheckUsername(ctx context.Context, tx *gorm.DB, username string) (entities.M_User, bool, error) Update(ctx context.Context, tx *gorm.DB, user entities.M_User) (entities.M_User, error) Delete(ctx context.Context, tx *gorm.DB, userId string) error SwitchRole(ctx context.Context, tx *gorm.DB, userId string, roleId string) (entities.M_User, error) } userRepository struct { db *gorm.DB } ) // CheckUsername implements UserRepository. func (r *userRepository) CheckUsername(ctx context.Context, tx *gorm.DB, username string) (entities.M_User, bool, error) { if tx == nil { tx = r.db } var user entities.M_User if err := tx.WithContext(ctx).Where("username = ?", username).Take(&user).Error; err != nil { return entities.M_User{}, false, err } return user, true, nil } // GetUserByUsername implements UserRepository. func (r *userRepository) GetUserByUsername(ctx context.Context, tx *gorm.DB, username string) (entities.M_User, error) { if tx == nil { tx = r.db } var user entities.M_User if err := tx.WithContext(ctx). Preload("Roles"). Where("username = ?", username). Take(&user).Error; err != nil { return entities.M_User{}, err } return user, nil } func NewUserRepository(db *gorm.DB) UserRepository { return &userRepository{ db: db, } } // SwitchRole implements UserRepository. func (r *userRepository) SwitchRole(ctx context.Context, tx *gorm.DB, userId string, roleId string) (entities.M_User, error) { if tx == nil { tx = r.db } var user entities.M_User // Preload UserRoles dan Role di dalamnya if err := tx.WithContext(ctx). Where("id = ?", userId). Preload("UserRoles.Role"). Take(&user).Error; err != nil { return entities.M_User{}, err } var role entities.M_Role if err := tx.WithContext(ctx).Where("id = ?", roleId).Take(&role).Error; err != nil { return entities.M_User{}, err } // Ganti semua role user dengan role baru (hapus yang lama, insert yang baru) if err := tx.WithContext(ctx). Where("user_id = ?", userId). Delete(&entities.M_User_Role{}).Error; err != nil { return entities.M_User{}, err } newUserRole := entities.M_User_Role{ UserID: user.ID, RoleID: role.ID, } if err := tx.WithContext(ctx).Create(&newUserRole).Error; err != nil { return entities.M_User{}, err } // Ambil ulang user beserta roles-nya if err := tx.WithContext(ctx). Where("id = ?", userId). Preload("UserRoles.Role"). Take(&user).Error; err != nil { return entities.M_User{}, err } return user, nil } // func (r *userRepository) SwitchRole(ctx context.Context, tx *gorm.DB, userId string, roleId string) (entities.M_User, error) { // if tx == nil { // tx = r.db // } // var user entities.M_User // if err := tx.WithContext(ctx).Where("id = ?", userId).Take(&user).Error; err != nil { // return entities.M_User{}, err // } // // Update field ActiveRoleID // user.ActiveRoleID = roleId // if err := tx.WithContext(ctx).Save(&user).Error; err != nil { // return entities.M_User{}, err // } // // Preload roles jika perlu // if err := tx.WithContext(ctx). // Where("id = ?", userId). // Preload("UserRoles.Role"). // Take(&user).Error; err != nil { // return entities.M_User{}, err // } // return user, nil // } func (r *userRepository) Register(ctx context.Context, tx *gorm.DB, user entities.M_User) (entities.M_User, error) { if tx == nil { tx = r.db } if err := tx.WithContext(ctx).Create(&user).Error; err != nil { return entities.M_User{}, err } return user, nil } func (r *userRepository) GetUserById(ctx context.Context, tx *gorm.DB, userId string) (entities.M_User, error) { if tx == nil { tx = r.db } var user entities.M_User if err := tx.WithContext(ctx). Preload("Client"). Preload("Roles"). Where("id = ?", userId). Take(&user).Error; err != nil { return entities.M_User{}, err } return user, nil } func (r *userRepository) GetUserByEmail(ctx context.Context, tx *gorm.DB, email string) (entities.M_User, error) { if tx == nil { tx = r.db } var user entities.M_User if err := tx.WithContext(ctx). Preload("Roles"). Where("email = ?", email). Take(&user).Error; err != nil { return entities.M_User{}, err } return user, nil } func (r *userRepository) CheckEmail(ctx context.Context, tx *gorm.DB, email string) (entities.M_User, bool, error) { if tx == nil { tx = r.db } var user entities.M_User if err := tx.WithContext(ctx).Where("email = ?", email).Take(&user).Error; err != nil { return entities.M_User{}, false, err } return user, true, nil } func (r *userRepository) Update(ctx context.Context, tx *gorm.DB, user entities.M_User) (entities.M_User, error) { if tx == nil { tx = r.db } if err := tx.WithContext(ctx).Updates(&user).Error; err != nil { return entities.M_User{}, err } return user, nil } func (r *userRepository) Delete(ctx context.Context, tx *gorm.DB, userId string) error { if tx == nil { tx = r.db } if err := tx.WithContext(ctx).Delete(&entities.M_User{}, "id = ?", userId).Error; err != nil { return err } return nil }