github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/internal/service/org_preferences.go (about)

     1  package service
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"log/slog"
     7  
     8  	"github.com/gosimple/slug"
     9  	"github.com/grafana/grafana-openapi-client-go/models"
    10  )
    11  
    12  // GetOrgPreferences returns the preferences for a given Org
    13  // orgName: The name of the organization whose preferences we should retrieve
    14  func (s *DashNGoImpl) GetOrgPreferences(orgName string) (*models.Preferences, error) {
    15  	if !s.grafanaConf.IsGrafanaAdmin() {
    16  		return nil, errors.New("no valid Grafana Admin configured, cannot retrieve Organizations Preferences")
    17  	}
    18  	f := func() (interface{}, error) {
    19  		orgPreferences, err := s.GetClient().OrgPreferences.GetOrgPreferences()
    20  		if err != nil {
    21  			return nil, err
    22  		}
    23  		return orgPreferences.GetPayload(), nil
    24  	}
    25  	result, err := s.scopeIntoOrg(orgName, f)
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  	return result.(*models.Preferences), nil
    30  }
    31  
    32  // scopeIntoOrg changes the organization, performs an operation, and reverts the Org to the previous value.
    33  func (s *DashNGoImpl) scopeIntoOrg(orgName string, runTask func() (interface{}, error)) (interface{}, error) {
    34  	currentOrg := s.getAssociatedActiveOrg(s.GetClient())
    35  	orgNameBackup := s.grafanaConf.OrganizationName
    36  	s.grafanaConf.OrganizationName = orgName
    37  	orgEntity, err := s.getOrgIdFromSlug(slug.Make(orgName), false)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	defer func() {
    42  		s.grafanaConf.OrganizationName = orgNameBackup
    43  		// restore scoped Org
    44  		err = s.SetUserOrganizations(currentOrg.ID)
    45  		if err != nil {
    46  			slog.Warn("unable to restore previous Org", slog.Any("err", err))
    47  		}
    48  	}()
    49  
    50  	err = s.SetUserOrganizations(orgEntity.OrgID)
    51  	if err != nil {
    52  		return nil, fmt.Errorf("unable to scope into requested org. %w", err)
    53  	}
    54  
    55  	res, err := runTask()
    56  	if err != nil {
    57  		return nil, err
    58  	}
    59  
    60  	return res, nil
    61  }
    62  
    63  // UploadOrgPreferences Updates the preferences for a given organization.  Returns error if org is not found.
    64  func (s *DashNGoImpl) UploadOrgPreferences(orgName string, pref *models.Preferences) error {
    65  	runTask := func() (interface{}, error) {
    66  		if pref == nil {
    67  			return nil, fmt.Errorf("preferences are nil, cannot update")
    68  		}
    69  
    70  		update := &models.UpdatePrefsCmd{}
    71  		update.HomeDashboardUID = pref.HomeDashboardUID
    72  		update.Language = pref.Language
    73  		update.Timezone = pref.Timezone
    74  		update.Theme = pref.Theme
    75  		update.WeekStart = pref.WeekStart
    76  
    77  		status, err := s.GetClient().OrgPreferences.UpdateOrgPreferences(update)
    78  		if err != nil {
    79  			return nil, err
    80  		}
    81  		return status, nil
    82  	}
    83  	_, err := s.scopeIntoOrg(orgName, runTask)
    84  	if err != nil {
    85  		return err
    86  	}
    87  	slog.Info("Organization Preferences were updated")
    88  	return nil
    89  }