func()

in controllers/user/chain/create_user.go [28:78]


func (h CreateUser) ServeRequest(ctx context.Context, user *sonarApi.SonarUser) error {
	log := ctrl.LoggerFrom(ctx).WithValues("userlogin", user.Spec.Login)
	log.Info("Creating user in sonar")

	userSecret := &corev1.Secret{}
	if err := h.client.Get(ctx, client.ObjectKey{
		Namespace: user.Namespace,
		Name:      user.Spec.Secret,
	}, userSecret); err != nil {
		return fmt.Errorf("failed to get user secret: %w", err)
	}

	sonarUser := &sonar.User{
		Login:    user.Spec.Login,
		Name:     user.Spec.Name,
		Password: string(userSecret.Data["password"]),
		Email:    user.Spec.Email,
	}

	existingUser, err := h.sonarApiClient.GetUserByLogin(ctx, user.Spec.Login)
	if err != nil {
		if !sonar.IsErrNotFound(err) {
			return fmt.Errorf("failed to get user: %w", err)
		}

		log.Info("User not found, creating new one")

		if err = h.sonarApiClient.CreateUser(ctx, sonarUser); err != nil {
			return fmt.Errorf("failed to create user: %w", err)
		}

		log.Info("User has been created")
		return nil
	}

	log.Info("User already exists, updating")

	// to check if user needs to be updated we need to clear password as it is not returned by sonar
	sonarUser.Password = ""
	if reflect.DeepEqual(sonarUser, existingUser) {
		log.Info("User already up to date")
		return nil
	}

	if err = h.sonarApiClient.UpdateUser(ctx, sonarUser); err != nil {
		return fmt.Errorf("failed to update user: %w", err)
	}

	log.Info("User has been updated")
	return nil
}