package auth import ( "context" "errors" "fmt" "go.uber.org/zap" "gorm.io/gorm" "furtuna-be/internal/common/logger" "furtuna-be/internal/entity" ) type AuthRepository struct { db *gorm.DB } func NewAuthRepository(db *gorm.DB) *AuthRepository { return &AuthRepository{ db: db, } } func (r *AuthRepository) CheckExistsUserAccount(ctx context.Context, email string) (*entity.UserDB, error) { var user entity.UserDB err := r.db. Table("users"). Select("users.*, user_roles.role_id, user_roles.partner_id, user_roles.site_id,"+ " sites.name, roles.role_name, partners.name as partner_name, partners.status as partner_status, users.reset_password"). Where("users.email = ?", email). Joins("left join user_roles on users.id = user_roles.user_id"). Joins("left join roles on user_roles.role_id = roles.role_id"). Joins("left join partners on user_roles.partner_id = partners.id"). Joins("left join sites on user_roles.site_id = sites.id"). First(&user).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("user with email %s does not exist", email) // or use a custom error type } logger.ContextLogger(ctx).Error(fmt.Sprintf("Failed to get user with email: %s", email), zap.Error(err)) return nil, err } return &user, nil } func (r *AuthRepository) CheckExistsUserAccountByID(ctx context.Context, userID int64) (*entity.UserDB, error) { var user entity.UserDB err := r.db. Table("users"). Select("users.*, user_roles.role_id, user_roles.partner_id, user_roles.site_id, sites.name, roles.role_name, partners.name as partner_name, partners.status as partner_status"). Where("users.id = ?", userID). Joins("left join user_roles on users.id = user_roles.user_id"). Joins("left join roles on user_roles.role_id = roles.role_id"). Joins("left join partners on user_roles.partner_id = partners.id"). Joins("left join sites on user_roles.site_id = sites.id"). First(&user).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("user with not exist") // or use a custom error type } logger.ContextLogger(ctx).Error(fmt.Sprintf("Failed to get user"), zap.Error(err)) return nil, err } return &user, nil } func (r *AuthRepository) UpdatePassword(ctx context.Context, trx *gorm.DB, newHashedPassword string, userID int64, resetPassword bool) error { // Perform the update using a single Updates call err := trx.Model(&entity.UserDB{}). Where("id = ?", userID). Updates(map[string]interface{}{ "password": newHashedPassword, "reset_password": resetPassword, }).Error if err != nil { logger.ContextLogger(ctx).Error(fmt.Sprintf("Failed to update password for user with id: %d", userID), zap.Error(err)) return err } return nil }