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 }