Preferences: Use dashboard uid for the home dashboard (#106666)

This commit is contained in:
Stephanie Hingtgen
2025-06-13 07:10:44 -05:00
committed by GitHub
parent 4c2bfe8263
commit 352aac162c
16 changed files with 303 additions and 177 deletions
+32 -12
View File
@@ -26,10 +26,11 @@ func ProvideService(db db.DB, cfg *setting.Cfg) pref.Service {
func prefsFromConfig(cfg *setting.Cfg) pref.Preference {
return pref.Preference{
Theme: cfg.DefaultTheme,
Timezone: cfg.DateFormats.DefaultTimezone,
WeekStart: &cfg.DateFormats.DefaultWeekStart,
HomeDashboardID: 0,
Theme: cfg.DefaultTheme,
Timezone: cfg.DateFormats.DefaultTimezone,
WeekStart: &cfg.DateFormats.DefaultWeekStart,
HomeDashboardID: 0, // nolint:staticcheck
HomeDashboardUID: "",
JSONData: &pref.PreferenceJSONData{
Language: cfg.DefaultLanguage,
},
@@ -59,9 +60,13 @@ func (s *Service) GetWithDefaults(ctx context.Context, query *pref.GetPreference
if p.WeekStart != nil && *p.WeekStart != "" {
res.WeekStart = p.WeekStart
}
// nolint: staticcheck
if p.HomeDashboardID != 0 {
res.HomeDashboardID = p.HomeDashboardID
}
if p.HomeDashboardUID != "" {
res.HomeDashboardUID = p.HomeDashboardUID
}
if p.JSONData != nil {
if p.JSONData.Language != "" {
res.JSONData.Language = p.JSONData.Language
@@ -118,9 +123,10 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
if err != nil {
if errors.Is(err, pref.ErrPrefNotFound) {
preference := &pref.Preference{
UserID: cmd.UserID,
OrgID: cmd.OrgID,
TeamID: cmd.TeamID,
UserID: cmd.UserID,
OrgID: cmd.OrgID,
TeamID: cmd.TeamID,
// nolint: staticcheck
HomeDashboardID: cmd.HomeDashboardID,
Timezone: cmd.Timezone,
WeekStart: &cmd.WeekStart,
@@ -129,6 +135,11 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
Updated: time.Now(),
JSONData: jsonData,
}
if cmd.HomeDashboardUID != nil {
preference.HomeDashboardUID = *cmd.HomeDashboardUID
}
_, err = s.store.Insert(ctx, preference)
if err != nil {
return err
@@ -142,7 +153,10 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
preference.Theme = cmd.Theme
preference.Updated = time.Now()
preference.Version += 1
preference.HomeDashboardID = cmd.HomeDashboardID
preference.HomeDashboardID = cmd.HomeDashboardID // nolint:staticcheck
if cmd.HomeDashboardUID != nil {
preference.HomeDashboardUID = *cmd.HomeDashboardUID
}
preference.JSONData = jsonData
return s.store.Update(ctx, preference)
@@ -201,10 +215,15 @@ func (s *Service) Patch(ctx context.Context, cmd *pref.PatchPreferenceCommand) e
}
}
// nolint: staticcheck
if cmd.HomeDashboardID != nil {
preference.HomeDashboardID = *cmd.HomeDashboardID
}
if cmd.HomeDashboardUID != nil {
preference.HomeDashboardUID = *cmd.HomeDashboardUID
}
if cmd.CookiePreferences != nil {
cookies, err := parseCookiePreferences(cmd.CookiePreferences)
if err != nil {
@@ -242,10 +261,11 @@ func (s *Service) Patch(ctx context.Context, cmd *pref.PatchPreferenceCommand) e
func (s *Service) GetDefaults() *pref.Preference {
return &pref.Preference{
Theme: s.defaults.Theme,
Timezone: s.defaults.Timezone,
WeekStart: s.defaults.WeekStart,
HomeDashboardID: 0,
Theme: s.defaults.Theme,
Timezone: s.defaults.Timezone,
WeekStart: s.defaults.WeekStart,
HomeDashboardID: 0, // nolint:staticcheck
HomeDashboardUID: "",
JSONData: &pref.PreferenceJSONData{
Language: s.defaults.JSONData.Language,
},
+79 -62
View File
@@ -41,10 +41,11 @@ func TestGetDefaults(t *testing.T) {
t.Run("GetDefaults", func(t *testing.T) {
preference := prefService.GetDefaults()
expected := &pref.Preference{
WeekStart: &weekStart,
Theme: "light",
Timezone: "UTC",
HomeDashboardID: 0,
WeekStart: &weekStart,
Theme: "light",
Timezone: "UTC",
HomeDashboardID: 0, // nolint:staticcheck
HomeDashboardUID: "",
JSONData: &pref.PreferenceJSONData{
Language: "en-US",
},
@@ -59,10 +60,11 @@ func TestGetDefaults(t *testing.T) {
preference, err := prefService.GetWithDefaults(context.Background(), query)
require.NoError(t, err)
expected := &pref.Preference{
WeekStart: &weekStart,
Theme: "light",
Timezone: "UTC",
HomeDashboardID: 0,
WeekStart: &weekStart,
Theme: "light",
Timezone: "UTC",
HomeDashboardID: 0, // nolint:staticcheck
HomeDashboardUID: "",
JSONData: &pref.PreferenceJSONData{
Language: "en-US",
},
@@ -85,23 +87,25 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
weekStartTwo := "2"
insertPrefs(t, prefService.store,
pref.Preference{
OrgID: 1,
HomeDashboardID: 1,
Theme: "dark",
Timezone: "UTC",
WeekStart: &weekStartOne,
OrgID: 1,
HomeDashboardID: 1, // nolint:staticcheck
Theme: "dark",
Timezone: "UTC",
WeekStart: &weekStartOne,
HomeDashboardUID: "test-uid",
JSONData: &pref.PreferenceJSONData{
Language: "en-GB",
Locale: "en",
},
},
pref.Preference{
OrgID: 1,
UserID: 1,
HomeDashboardID: 4,
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
OrgID: 1,
UserID: 1,
HomeDashboardID: 4, // nolint:staticcheck
HomeDashboardUID: "test-uid4",
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
JSONData: &pref.PreferenceJSONData{
Language: "en-AU",
Locale: "es",
@@ -114,10 +118,11 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
preference, err := prefService.GetWithDefaults(context.Background(), query)
require.NoError(t, err)
expected := &pref.Preference{
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
HomeDashboardID: 4,
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
HomeDashboardID: 4, // nolint:staticcheck
HomeDashboardUID: "test-uid4",
JSONData: &pref.PreferenceJSONData{
Language: "en-AU",
Locale: "es",
@@ -129,15 +134,16 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
})
t.Run("ignore other user's preferences", func(t *testing.T) {
prefService.GetDefaults().HomeDashboardID = 1
prefService.GetDefaults().HomeDashboardID = 1 // nolint:staticcheck
query := &pref.GetPreferenceWithDefaultsQuery{OrgID: 1, UserID: 2}
preference, err := prefService.GetWithDefaults(context.Background(), query)
require.NoError(t, err)
expected := &pref.Preference{
Theme: "dark",
Timezone: "UTC",
WeekStart: &weekStartOne,
HomeDashboardID: 1,
Theme: "dark",
Timezone: "UTC",
WeekStart: &weekStartOne,
HomeDashboardID: 1, // nolint:staticcheck
HomeDashboardUID: "test-uid",
JSONData: &pref.PreferenceJSONData{
Language: "en-GB",
Locale: "en",
@@ -298,27 +304,30 @@ func TestGetWithDefaults_teams(t *testing.T) {
}
insertPrefs(t, prefService.store,
pref.Preference{
OrgID: 1,
HomeDashboardID: 1,
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartOne,
OrgID: 1,
HomeDashboardID: 1, // nolint:staticcheck
HomeDashboardUID: "test-uid",
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartOne,
},
pref.Preference{
OrgID: 1,
TeamID: 2,
HomeDashboardID: 3,
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
OrgID: 1,
TeamID: 2,
HomeDashboardID: 3, // nolint:staticcheck
HomeDashboardUID: "test-uid3",
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
},
pref.Preference{
OrgID: 1,
TeamID: 3,
HomeDashboardID: 4,
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
OrgID: 1,
TeamID: 3,
HomeDashboardID: 4, // nolint:staticcheck
HomeDashboardUID: "test-uid4",
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
},
)
@@ -326,11 +335,12 @@ func TestGetWithDefaults_teams(t *testing.T) {
preferences, err := prefService.GetWithDefaults(context.Background(), query)
require.NoError(t, err)
expected := &pref.Preference{
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
HomeDashboardID: 4,
JSONData: &pref.PreferenceJSONData{},
Theme: "light",
Timezone: "browser",
WeekStart: &weekStartTwo,
HomeDashboardID: 4, // nolint:staticcheck
HomeDashboardUID: "test-uid4",
JSONData: &pref.PreferenceJSONData{},
}
if diff := cmp.Diff(expected, preferences); diff != "" {
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
@@ -364,13 +374,15 @@ func TestSave(t *testing.T) {
}
t.Run("insert", func(t *testing.T) {
testUID := "test-uid5"
err := prefService.Save(context.Background(),
&pref.SavePreferenceCommand{
OrgID: 1,
Theme: "dark",
Timezone: "browser",
HomeDashboardID: 5,
WeekStart: "1",
OrgID: 1,
Theme: "dark",
Timezone: "browser",
HomeDashboardID: 5, // nolint:staticcheck
HomeDashboardUID: &testUID,
WeekStart: "1",
},
)
require.NoError(t, err)
@@ -381,18 +393,21 @@ func TestSave(t *testing.T) {
assert.Zero(t, stored.TeamID)
assert.Equal(t, "dark", stored.Theme)
assert.Equal(t, "browser", stored.Timezone)
assert.EqualValues(t, 5, stored.HomeDashboardID)
assert.EqualValues(t, 5, stored.HomeDashboardID) // nolint:staticcheck
assert.Equal(t, testUID, stored.HomeDashboardUID)
assert.Equal(t, "1", *stored.WeekStart)
assert.EqualValues(t, 0, stored.Version)
})
t.Run("update", func(t *testing.T) {
testEmptyUID := ""
err := prefService.Save(context.Background(),
&pref.SavePreferenceCommand{
OrgID: 1,
Timezone: "UTC",
HomeDashboardID: 0,
WeekStart: "1",
OrgID: 1,
Timezone: "UTC",
HomeDashboardID: 0, // nolint:staticcheck
HomeDashboardUID: &testEmptyUID,
WeekStart: "1",
},
)
require.NoError(t, err)
@@ -403,7 +418,8 @@ func TestSave(t *testing.T) {
assert.Zero(t, stored.TeamID)
assert.Empty(t, stored.Theme)
assert.Equal(t, "UTC", stored.Timezone)
assert.Zero(t, stored.HomeDashboardID)
assert.Zero(t, stored.HomeDashboardID) // nolint:staticcheck
assert.Equal(t, "", stored.HomeDashboardUID)
assert.Equal(t, "1", *stored.WeekStart)
assert.EqualValues(t, 1, stored.Version)
})
@@ -422,7 +438,8 @@ func TestSave(t *testing.T) {
assert.Zero(t, stored.TeamID)
assert.Equal(t, themeValue, stored.Theme)
assert.Equal(t, "UTC", stored.Timezone)
assert.Zero(t, stored.HomeDashboardID)
assert.Zero(t, stored.HomeDashboardID) // nolint:staticcheck
assert.Equal(t, "", stored.HomeDashboardUID)
assert.Equal(t, "1", *stored.WeekStart)
assert.EqualValues(t, 2, stored.Version)
})
+71 -54
View File
@@ -36,56 +36,63 @@ func testIntegrationPreferencesDataAccess(t *testing.T, fn getStore) {
t.Run("Get with saved org and user home dashboard should return user home dashboard", func(t *testing.T) {
_, err := prefStore.Insert(context.Background(),
&pref.Preference{
OrgID: 1,
UserID: 1,
HomeDashboardID: 4,
TeamID: 2,
Created: time.Now(),
Updated: time.Now(),
OrgID: 1,
UserID: 1,
HomeDashboardID: 4, // nolint:staticcheck
HomeDashboardUID: "test-uid4",
TeamID: 2,
Created: time.Now(),
Updated: time.Now(),
})
require.NoError(t, err)
query := &pref.Preference{OrgID: 1, UserID: 1, TeamID: 2}
prefs, err := prefStore.Get(context.Background(), query)
require.NoError(t, err)
require.Equal(t, int64(4), prefs.HomeDashboardID)
require.Equal(t, int64(4), prefs.HomeDashboardID) // nolint:staticcheck
require.Equal(t, "test-uid4", prefs.HomeDashboardUID)
})
t.Run("List with saved org and user home dashboard should return user home dashboard", func(t *testing.T) {
_, err := prefStore.Insert(context.Background(),
&pref.Preference{
OrgID: 1,
UserID: 1,
TeamID: 3,
HomeDashboardID: 1,
Created: time.Now(),
Updated: time.Now(),
OrgID: 1,
UserID: 1,
TeamID: 3,
HomeDashboardID: 1, // nolint:staticcheck
HomeDashboardUID: "test-uid1",
Created: time.Now(),
Updated: time.Now(),
})
require.NoError(t, err)
query := &pref.Preference{OrgID: 1, UserID: 1, Teams: []int64{2}}
prefs, err := prefStore.List(context.Background(), query)
require.NoError(t, err)
require.Equal(t, int64(4), prefs[0].HomeDashboardID)
require.Equal(t, int64(4), prefs[0].HomeDashboardID) // nolint:staticcheck
require.Equal(t, "test-uid4", prefs[0].HomeDashboardUID)
})
t.Run("List with saved org and other user home dashboard should return org home dashboard", func(t *testing.T) {
_, err := prefStore.Insert(context.Background(),
&pref.Preference{
OrgID: 1,
UserID: 2,
TeamID: 3,
HomeDashboardID: 1,
Created: time.Now(),
Updated: time.Now(),
OrgID: 1,
UserID: 2,
TeamID: 3,
HomeDashboardID: 1, // nolint:staticcheck
HomeDashboardUID: "test-uid1",
Created: time.Now(),
Updated: time.Now(),
})
require.NoError(t, err)
query := &pref.Preference{OrgID: 1, UserID: 1, Teams: []int64{3}}
prefs, err := prefStore.List(context.Background(), query)
require.NoError(t, err)
require.Equal(t, int64(1), prefs[0].HomeDashboardID)
require.Equal(t, int64(1), prefs[1].HomeDashboardID)
require.Equal(t, int64(1), prefs[0].HomeDashboardID) // nolint:staticcheck
require.Equal(t, int64(1), prefs[1].HomeDashboardID) // nolint:staticcheck
require.Equal(t, "test-uid1", prefs[0].HomeDashboardUID)
require.Equal(t, "test-uid1", prefs[1].HomeDashboardUID)
})
t.Run("List with saved org and teams home dashboard should return last team home dashboard", func(t *testing.T) {
@@ -94,64 +101,74 @@ func testIntegrationPreferencesDataAccess(t *testing.T, fn getStore) {
}
prefs, err := prefStore.List(context.Background(), query)
require.NoError(t, err)
require.Equal(t, int64(4), prefs[0].HomeDashboardID)
require.Equal(t, int64(1), prefs[1].HomeDashboardID)
require.Equal(t, int64(1), prefs[2].HomeDashboardID)
require.Equal(t, int64(4), prefs[0].HomeDashboardID) // nolint:staticcheck
require.Equal(t, int64(1), prefs[1].HomeDashboardID) // nolint:staticcheck
require.Equal(t, int64(1), prefs[2].HomeDashboardID) // nolint:staticcheck
require.Equal(t, "test-uid4", prefs[0].HomeDashboardUID)
require.Equal(t, "test-uid1", prefs[1].HomeDashboardUID)
require.Equal(t, "test-uid1", prefs[2].HomeDashboardUID)
})
t.Run("List with saved org and other teams home dashboard should return org home dashboard", func(t *testing.T) {
_, err := prefStore.Insert(context.Background(), &pref.Preference{OrgID: 1, HomeDashboardID: 1, Created: time.Now(), Updated: time.Now()})
// nolint:staticcheck
_, err := prefStore.Insert(context.Background(), &pref.Preference{OrgID: 1, HomeDashboardID: 1, HomeDashboardUID: "test-uid1", Created: time.Now(), Updated: time.Now()})
require.NoError(t, err)
_, err = prefStore.Insert(context.Background(), &pref.Preference{OrgID: 1, TeamID: 2, HomeDashboardID: 2, Created: time.Now(), Updated: time.Now()})
// nolint:staticcheck
_, err = prefStore.Insert(context.Background(), &pref.Preference{OrgID: 1, TeamID: 2, HomeDashboardID: 2, HomeDashboardUID: "test-uid2", Created: time.Now(), Updated: time.Now()})
require.NoError(t, err)
_, err = prefStore.Insert(context.Background(), &pref.Preference{OrgID: 1, TeamID: 3, HomeDashboardID: 3, Created: time.Now(), Updated: time.Now()})
// nolint:staticcheck
_, err = prefStore.Insert(context.Background(), &pref.Preference{OrgID: 1, TeamID: 3, HomeDashboardID: 3, HomeDashboardUID: "test-uid3", Created: time.Now(), Updated: time.Now()})
require.NoError(t, err)
query := &pref.Preference{OrgID: 1}
prefs, err := prefStore.List(context.Background(), query)
require.NoError(t, err)
require.Equal(t, int64(1), prefs[0].HomeDashboardID)
require.Equal(t, int64(1), prefs[0].HomeDashboardID) // nolint:staticcheck
require.Equal(t, "test-uid1", prefs[0].HomeDashboardUID)
})
t.Run("Update for a user should only modify a single value", func(t *testing.T) {
ss := db.InitTestDB(t)
prefStore := fn(ss)
id, err := prefStore.Insert(context.Background(), &pref.Preference{
UserID: user.SignedInUser{}.UserID,
Theme: "dark",
Timezone: "browser",
HomeDashboardID: 5,
WeekStart: &weekStartOne,
JSONData: &pref.PreferenceJSONData{},
Created: time.Now(),
Updated: time.Now(),
UserID: user.SignedInUser{}.UserID,
Theme: "dark",
Timezone: "browser",
HomeDashboardID: 5, // nolint:staticcheck
HomeDashboardUID: "test-uid5",
WeekStart: &weekStartOne,
JSONData: &pref.PreferenceJSONData{},
Created: time.Now(),
Updated: time.Now(),
})
require.NoError(t, err)
err = prefStore.Update(context.Background(), &pref.Preference{
ID: id,
Theme: "dark",
HomeDashboardID: 5,
Timezone: "browser",
WeekStart: &weekStartOne,
Created: time.Now(),
Updated: time.Now(),
JSONData: &pref.PreferenceJSONData{},
ID: id,
Theme: "dark",
HomeDashboardID: 5, // nolint:staticcheck
HomeDashboardUID: "test-uid5",
Timezone: "browser",
WeekStart: &weekStartOne,
Created: time.Now(),
Updated: time.Now(),
JSONData: &pref.PreferenceJSONData{},
})
require.NoError(t, err)
query := &pref.Preference{}
prefs, err := prefStore.List(context.Background(), query)
require.NoError(t, err)
expected := &pref.Preference{
ID: prefs[0].ID,
Version: prefs[0].Version,
HomeDashboardID: 5,
Timezone: "browser",
WeekStart: &weekStartOne,
Theme: "dark",
JSONData: prefs[0].JSONData,
Created: prefs[0].Created,
Updated: prefs[0].Updated,
ID: prefs[0].ID,
Version: prefs[0].Version,
HomeDashboardID: 5, // nolint:staticcheck
HomeDashboardUID: "test-uid5",
Timezone: "browser",
WeekStart: &weekStartOne,
Theme: "dark",
JSONData: prefs[0].JSONData,
Created: prefs[0].Created,
Updated: prefs[0].Updated,
}
if diff := cmp.Diff(expected, prefs[0]); diff != "" {
t.Fatalf("Result mismatch (-want +got):\n%s", diff)