Chore: remove xorm from preference (#53803)

* Chore: remove xorm from preference

* separte feature toggle

* fix comments

* fix comments

* remove the dublicated namedexec
This commit is contained in:
ying-jeanne
2022-08-17 22:07:20 -04:00
committed by GitHub
parent 4ac87a3b3b
commit 82b63688d2
10 changed files with 247 additions and 103 deletions
+11 -4
View File
@@ -18,13 +18,20 @@ type Service struct {
}
func ProvideService(db db.DB, cfg *setting.Cfg, features *featuremgmt.FeatureManager) pref.Service {
return &Service{
store: &sqlStore{
db: db,
},
service := &Service{
cfg: cfg,
features: features,
}
if cfg.IsFeatureToggleEnabled("newDBLibrary") {
service.store = &sqlxStore{
sess: db.GetSqlxSession(),
}
} else {
service.store = &sqlStore{
db: db,
}
}
return service
}
func (s *Service) GetWithDefaults(ctx context.Context, query *pref.GetPreferenceWithDefaultsQuery) (*pref.Preference, error) {
@@ -0,0 +1,68 @@
package prefimpl
import (
"context"
"database/sql"
"errors"
"fmt"
"strings"
pref "github.com/grafana/grafana/pkg/services/preference"
"github.com/grafana/grafana/pkg/services/sqlstore/session"
)
type sqlxStore struct {
sess *session.SessionDB
}
func (s *sqlxStore) Get(ctx context.Context, query *pref.Preference) (*pref.Preference, error) {
var prefs pref.Preference
err := s.sess.Get(ctx, &prefs, "SELECT * from preferences WHERE org_id=? AND user_id=? AND team_id=?", query.OrgID, query.UserID, query.TeamID)
if err != nil && errors.Is(err, sql.ErrNoRows) {
return nil, pref.ErrPrefNotFound
}
return &prefs, err
}
func (s *sqlxStore) List(ctx context.Context, query *pref.Preference) ([]*pref.Preference, error) {
prefs := make([]*pref.Preference, 0)
params := make([]interface{}, 0)
filter := ""
if len(query.Teams) > 0 {
filter = "(org_id=? AND team_id IN (?" + strings.Repeat(",?", len(query.Teams)-1) + ")) OR "
params = append(params, query.OrgID)
for _, v := range query.Teams {
params = append(params, v)
}
}
filter += "(org_id=? AND user_id=? AND team_id=0) OR (org_id=? AND team_id=0 AND user_id=0)"
params = append(params, query.OrgID)
params = append(params, query.UserID)
params = append(params, query.OrgID)
err := s.sess.Select(ctx, &prefs, fmt.Sprintf("SELECT * FROM preferences WHERE %s ORDER BY user_id ASC, team_id ASC", filter), params...)
return prefs, err
}
func (s *sqlxStore) Update(ctx context.Context, cmd *pref.Preference) error {
query := "UPDATE preferences SET org_id=:org_id, user_id=:user_id, team_id=:team_id, version=:version, home_dashboard_id=:home_dashboard_id, " +
"timezone=:timezone, week_start=:week_start, theme=:theme, created=:created, updated=:updated, json_data=:json_data WHERE id=:id"
_, err := s.sess.NamedExec(ctx, query, cmd)
return err
}
func (s *sqlxStore) Insert(ctx context.Context, cmd *pref.Preference) (int64, error) {
var ID int64
query := "INSERT INTO preferences (org_id, user_id, team_id, version, home_dashboard_id, timezone, week_start, theme, created, updated, json_data) VALUES " +
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
ID, err := s.sess.ExecWithReturningId(
ctx, query, cmd.OrgID, cmd.UserID, cmd.TeamID, cmd.Version, cmd.HomeDashboardID,
cmd.Timezone, cmd.WeekStart, cmd.Theme, cmd.Created, cmd.Updated, cmd.JSONData)
return ID, err
}
func (s *sqlxStore) DeleteByUser(ctx context.Context, userID int64) error {
_, err := s.sess.Exec(ctx, "DELETE FROM preferences WHERE user_id=?", userID)
return err
}
@@ -0,0 +1,13 @@
package prefimpl
import (
"testing"
"github.com/grafana/grafana/pkg/services/sqlstore"
)
func TestIntegrationSQLxPreferencesDataAccess(t *testing.T) {
testIntegrationPreferencesDataAccess(t, func(ss *sqlstore.SQLStore) store {
return &sqlxStore{sess: ss.GetSqlxSession()}
})
}
-82
View File
@@ -2,11 +2,8 @@ package prefimpl
import (
"context"
"strings"
pref "github.com/grafana/grafana/pkg/services/preference"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/db"
)
type store interface {
@@ -16,82 +13,3 @@ type store interface {
Update(context.Context, *pref.Preference) error
DeleteByUser(context.Context, int64) error
}
type sqlStore struct {
db db.DB
}
func (s *sqlStore) Get(ctx context.Context, query *pref.Preference) (*pref.Preference, error) {
var prefs pref.Preference
err := s.db.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
exist, err := sess.Where("org_id=? AND user_id=? AND team_id=?", query.OrgID, query.UserID, query.TeamID).Get(&prefs)
if err != nil {
return err
}
if !exist {
return pref.ErrPrefNotFound
}
return nil
})
if err != nil {
return nil, err
}
return &prefs, nil
}
func (s *sqlStore) List(ctx context.Context, query *pref.Preference) ([]*pref.Preference, error) {
prefs := make([]*pref.Preference, 0)
params := make([]interface{}, 0)
filter := ""
if len(query.Teams) > 0 {
filter = "(org_id=? AND team_id IN (?" + strings.Repeat(",?", len(query.Teams)-1) + ")) OR "
params = append(params, query.OrgID)
for _, v := range query.Teams {
params = append(params, v)
}
}
filter += "(org_id=? AND user_id=? AND team_id=0) OR (org_id=? AND team_id=0 AND user_id=0)"
params = append(params, query.OrgID)
params = append(params, query.UserID)
params = append(params, query.OrgID)
err := s.db.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
err := dbSession.Where(filter, params...).
OrderBy("user_id ASC, team_id ASC").
Find(&prefs)
if err != nil {
return err
}
return nil
})
return prefs, err
}
func (s *sqlStore) Update(ctx context.Context, cmd *pref.Preference) error {
return s.db.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error {
_, err := sess.ID(cmd.ID).AllCols().Update(cmd)
return err
})
}
func (s *sqlStore) Insert(ctx context.Context, cmd *pref.Preference) (int64, error) {
var ID int64
var err error
err = s.db.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error {
ID, err = sess.Insert(cmd)
return err
})
return ID, err
}
func (s *sqlStore) DeleteByUser(ctx context.Context, userID int64) error {
return s.db.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
var rawSQL = "DELETE FROM preferences WHERE user_id = ?"
_, err := dbSession.Exec(rawSQL, userID)
return err
})
}
+12 -3
View File
@@ -12,12 +12,14 @@ import (
"github.com/stretchr/testify/require"
)
func TestIntegrationPreferencesDataAccess(t *testing.T) {
type getStore func(*sqlstore.SQLStore) store
func testIntegrationPreferencesDataAccess(t *testing.T, fn getStore) {
if testing.Short() {
t.Skip("skipping integration test")
}
ss := sqlstore.InitTestDB(t)
prefStore := sqlStore{db: ss}
prefStore := fn(ss)
orgNavbarPreferences := pref.NavbarPreference{
SavedItems: []pref.NavLink{{
ID: "alerting",
@@ -115,7 +117,7 @@ func TestIntegrationPreferencesDataAccess(t *testing.T) {
t.Run("Update for a user should only modify a single value", func(t *testing.T) {
ss := sqlstore.InitTestDB(t)
prefStore := sqlStore{db: ss}
prefStore := fn(ss)
id, err := prefStore.Insert(context.Background(), &pref.Preference{
UserID: user.SignedInUser{}.UserID,
Theme: "dark",
@@ -167,4 +169,11 @@ func TestIntegrationPreferencesDataAccess(t *testing.T) {
})
require.NoError(t, err)
})
t.Run("delete preference by user", func(t *testing.T) {
err := prefStore.DeleteByUser(context.Background(), user.SignedInUser{}.UserID)
require.NoError(t, err)
query := &pref.Preference{OrgID: 0, UserID: user.SignedInUser{}.UserID, TeamID: 0}
_, err = prefStore.Get(context.Background(), query)
require.EqualError(t, err, pref.ErrPrefNotFound.Error())
})
}
@@ -0,0 +1,89 @@
package prefimpl
import (
"context"
"strings"
pref "github.com/grafana/grafana/pkg/services/preference"
"github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/db"
)
type sqlStore struct {
db db.DB
}
func (s *sqlStore) Get(ctx context.Context, query *pref.Preference) (*pref.Preference, error) {
var prefs pref.Preference
err := s.db.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
exist, err := sess.Where("org_id=? AND user_id=? AND team_id=?", query.OrgID, query.UserID, query.TeamID).Get(&prefs)
if err != nil {
return err
}
if !exist {
return pref.ErrPrefNotFound
}
return nil
})
if err != nil {
return nil, err
}
return &prefs, nil
}
func (s *sqlStore) List(ctx context.Context, query *pref.Preference) ([]*pref.Preference, error) {
prefs := make([]*pref.Preference, 0)
params := make([]interface{}, 0)
filter := ""
if len(query.Teams) > 0 {
filter = "(org_id=? AND team_id IN (?" + strings.Repeat(",?", len(query.Teams)-1) + ")) OR "
params = append(params, query.OrgID)
for _, v := range query.Teams {
params = append(params, v)
}
}
filter += "(org_id=? AND user_id=? AND team_id=0) OR (org_id=? AND team_id=0 AND user_id=0)"
params = append(params, query.OrgID)
params = append(params, query.UserID)
params = append(params, query.OrgID)
err := s.db.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
err := dbSession.Where(filter, params...).
OrderBy("user_id ASC, team_id ASC").
Find(&prefs)
if err != nil {
return err
}
return nil
})
return prefs, err
}
func (s *sqlStore) Update(ctx context.Context, cmd *pref.Preference) error {
return s.db.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error {
_, err := sess.ID(cmd.ID).AllCols().Update(cmd)
return err
})
}
func (s *sqlStore) Insert(ctx context.Context, cmd *pref.Preference) (int64, error) {
var ID int64
var err error
err = s.db.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error {
ID, err = sess.Insert(cmd)
return err
})
return ID, err
}
func (s *sqlStore) DeleteByUser(ctx context.Context, userID int64) error {
return s.db.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
var rawSQL = "DELETE FROM preferences WHERE user_id = ?"
_, err := dbSession.Exec(rawSQL, userID)
return err
})
}
@@ -0,0 +1,13 @@
package prefimpl
import (
"testing"
"github.com/grafana/grafana/pkg/services/sqlstore"
)
func TestIntegrationXORMPreferencesDataAccess(t *testing.T) {
testIntegrationPreferencesDataAccess(t, func(ss *sqlstore.SQLStore) store {
return &sqlStore{db: ss}
})
}