LibraryPanels: Fixes "error while loading library panels" (#34278)

* LibraryPanels: Fixes error while loading library panels

* Chore: fixes imports
This commit is contained in:
Hugo Häggmark 2021-05-18 14:52:19 +02:00 committed by GitHub
parent 8cfbee1e11
commit 592a3af40e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 24 additions and 19 deletions

View File

@ -6,11 +6,11 @@ import (
"strings" "strings"
"time" "time"
"github.com/grafana/grafana/pkg/services/search"
"github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/api/dtos"
"github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/search"
"github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/services/sqlstore"
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
"github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/util"
) )
@ -23,13 +23,18 @@ SELECT DISTINCT
, u2.login AS updated_by_name , u2.login AS updated_by_name
, u2.email AS updated_by_email , u2.email AS updated_by_email
, (SELECT COUNT(connection_id) FROM ` + connectionTableName + ` WHERE element_id = le.id AND kind=1) AS connected_dashboards` , (SELECT COUNT(connection_id) FROM ` + connectionTableName + ` WHERE element_id = le.id AND kind=1) AS connected_dashboards`
fromLibraryElementDTOWithMeta = `
FROM library_element AS le
LEFT JOIN user AS u1 ON le.created_by = u1.id
LEFT JOIN user AS u2 ON le.updated_by = u2.id
`
) )
func getFromLibraryElementDTOWithMeta(dialect migrator.Dialect) string {
user := dialect.Quote("user")
userJoin := `
FROM library_element AS le
LEFT JOIN ` + user + ` AS u1 ON le.created_by = u1.id
LEFT JOIN ` + user + ` AS u2 ON le.updated_by = u2.id
`
return userJoin
}
func syncFieldsWithModel(libraryElement *LibraryElement) error { func syncFieldsWithModel(libraryElement *LibraryElement) error {
var model map[string]interface{} var model map[string]interface{}
if err := json.Unmarshal(libraryElement.Model, &model); err != nil { if err := json.Unmarshal(libraryElement.Model, &model); err != nil {
@ -61,12 +66,12 @@ func syncFieldsWithModel(libraryElement *LibraryElement) error {
return nil return nil
} }
func getLibraryElement(session *sqlstore.DBSession, uid string, orgID int64) (LibraryElementWithMeta, error) { func getLibraryElement(dialect migrator.Dialect, session *sqlstore.DBSession, uid string, orgID int64) (LibraryElementWithMeta, error) {
elements := make([]LibraryElementWithMeta, 0) elements := make([]LibraryElementWithMeta, 0)
sql := selectLibraryElementDTOWithMeta + sql := selectLibraryElementDTOWithMeta +
", coalesce(dashboard.title, 'General') AS folder_name" + ", coalesce(dashboard.title, 'General') AS folder_name" +
", coalesce(dashboard.uid, '') AS folder_uid" + ", coalesce(dashboard.uid, '') AS folder_uid" +
fromLibraryElementDTOWithMeta + getFromLibraryElementDTOWithMeta(dialect) +
" LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" + " LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" +
" WHERE le.uid=? AND le.org_id=?" " WHERE le.uid=? AND le.org_id=?"
sess := session.SQL(sql, uid, orgID) sess := session.SQL(sql, uid, orgID)
@ -156,7 +161,7 @@ func (l *LibraryElementService) createLibraryElement(c *models.ReqContext, cmd C
// deleteLibraryElement deletes a library element. // deleteLibraryElement deletes a library element.
func (l *LibraryElementService) deleteLibraryElement(c *models.ReqContext, uid string) error { func (l *LibraryElementService) deleteLibraryElement(c *models.ReqContext, uid string) error {
return l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error { return l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
element, err := getLibraryElement(session, uid, c.SignedInUser.OrgId) element, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
if err != nil { if err != nil {
return err return err
} }
@ -195,13 +200,13 @@ func (l *LibraryElementService) getLibraryElements(c *models.ReqContext, params
builder.Write(selectLibraryElementDTOWithMeta) builder.Write(selectLibraryElementDTOWithMeta)
builder.Write(", 'General' as folder_name ") builder.Write(", 'General' as folder_name ")
builder.Write(", '' as folder_uid ") builder.Write(", '' as folder_uid ")
builder.Write(fromLibraryElementDTOWithMeta) builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
writeParamSelectorSQL(&builder, append(params, Pair{"folder_id", 0})...) writeParamSelectorSQL(&builder, append(params, Pair{"folder_id", 0})...)
builder.Write(" UNION ") builder.Write(" UNION ")
builder.Write(selectLibraryElementDTOWithMeta) builder.Write(selectLibraryElementDTOWithMeta)
builder.Write(", dashboard.title as folder_name ") builder.Write(", dashboard.title as folder_name ")
builder.Write(", dashboard.uid as folder_uid ") builder.Write(", dashboard.uid as folder_uid ")
builder.Write(fromLibraryElementDTOWithMeta) builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id <> 0") builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id <> 0")
writeParamSelectorSQL(&builder, params...) writeParamSelectorSQL(&builder, params...)
if c.SignedInUser.OrgRole != models.ROLE_ADMIN { if c.SignedInUser.OrgRole != models.ROLE_ADMIN {
@ -299,7 +304,7 @@ func (l *LibraryElementService) getAllLibraryElements(c *models.ReqContext, quer
builder.Write(selectLibraryElementDTOWithMeta) builder.Write(selectLibraryElementDTOWithMeta)
builder.Write(", 'General' as folder_name ") builder.Write(", 'General' as folder_name ")
builder.Write(", '' as folder_uid ") builder.Write(", '' as folder_uid ")
builder.Write(fromLibraryElementDTOWithMeta) builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
builder.Write(` WHERE le.org_id=? AND le.folder_id=0`, c.SignedInUser.OrgId) builder.Write(` WHERE le.org_id=? AND le.folder_id=0`, c.SignedInUser.OrgId)
writeKindSQL(query, &builder) writeKindSQL(query, &builder)
writeSearchStringSQL(query, l.SQLStore, &builder) writeSearchStringSQL(query, l.SQLStore, &builder)
@ -310,7 +315,7 @@ func (l *LibraryElementService) getAllLibraryElements(c *models.ReqContext, quer
builder.Write(selectLibraryElementDTOWithMeta) builder.Write(selectLibraryElementDTOWithMeta)
builder.Write(", dashboard.title as folder_name ") builder.Write(", dashboard.title as folder_name ")
builder.Write(", dashboard.uid as folder_uid ") builder.Write(", dashboard.uid as folder_uid ")
builder.Write(fromLibraryElementDTOWithMeta) builder.Write(getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect))
builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id<>0") builder.Write(" INNER JOIN dashboard AS dashboard on le.folder_id = dashboard.id AND le.folder_id<>0")
builder.Write(` WHERE le.org_id=?`, c.SignedInUser.OrgId) builder.Write(` WHERE le.org_id=?`, c.SignedInUser.OrgId)
writeKindSQL(query, &builder) writeKindSQL(query, &builder)
@ -424,7 +429,7 @@ func (l *LibraryElementService) patchLibraryElement(c *models.ReqContext, cmd pa
return LibraryElementDTO{}, err return LibraryElementDTO{}, err
} }
err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error { err := l.SQLStore.WithTransactionalDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
elementInDB, err := getLibraryElement(session, uid, c.SignedInUser.OrgId) elementInDB, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
if err != nil { if err != nil {
return err return err
} }
@ -508,7 +513,7 @@ func (l *LibraryElementService) patchLibraryElement(c *models.ReqContext, cmd pa
func (l *LibraryElementService) getConnections(c *models.ReqContext, uid string) ([]LibraryElementConnectionDTO, error) { func (l *LibraryElementService) getConnections(c *models.ReqContext, uid string) ([]LibraryElementConnectionDTO, error) {
connections := make([]LibraryElementConnectionDTO, 0) connections := make([]LibraryElementConnectionDTO, 0)
err := l.SQLStore.WithDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error { err := l.SQLStore.WithDbSession(c.Context.Req.Context(), func(session *sqlstore.DBSession) error {
element, err := getLibraryElement(session, uid, c.SignedInUser.OrgId) element, err := getLibraryElement(l.SQLStore.Dialect, session, uid, c.SignedInUser.OrgId)
if err != nil { if err != nil {
return err return err
} }
@ -516,7 +521,7 @@ func (l *LibraryElementService) getConnections(c *models.ReqContext, uid string)
builder := sqlstore.SQLBuilder{} builder := sqlstore.SQLBuilder{}
builder.Write("SELECT lec.*, u1.login AS created_by_name, u1.email AS created_by_email") builder.Write("SELECT lec.*, u1.login AS created_by_name, u1.email AS created_by_email")
builder.Write(" FROM " + connectionTableName + " AS lec") builder.Write(" FROM " + connectionTableName + " AS lec")
builder.Write(" LEFT JOIN user AS u1 ON lec.created_by = u1.id") builder.Write(" LEFT JOIN " + l.SQLStore.Dialect.Quote("user") + " AS u1 ON lec.created_by = u1.id")
builder.Write(" INNER JOIN dashboard AS dashboard on lec.connection_id = dashboard.id") builder.Write(" INNER JOIN dashboard AS dashboard on lec.connection_id = dashboard.id")
builder.Write(` WHERE lec.element_id=?`, element.ID) builder.Write(` WHERE lec.element_id=?`, element.ID)
if c.SignedInUser.OrgRole != models.ROLE_ADMIN { if c.SignedInUser.OrgRole != models.ROLE_ADMIN {
@ -555,7 +560,7 @@ func (l *LibraryElementService) getElementsForDashboardID(c *models.ReqContext,
sql := selectLibraryElementDTOWithMeta + sql := selectLibraryElementDTOWithMeta +
", coalesce(dashboard.title, 'General') AS folder_name" + ", coalesce(dashboard.title, 'General') AS folder_name" +
", coalesce(dashboard.uid, '') AS folder_uid" + ", coalesce(dashboard.uid, '') AS folder_uid" +
fromLibraryElementDTOWithMeta + getFromLibraryElementDTOWithMeta(l.SQLStore.Dialect) +
" LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" + " LEFT JOIN dashboard AS dashboard ON dashboard.id = le.folder_id" +
" INNER JOIN " + connectionTableName + " AS lce ON lce.element_id = le.id AND lce.kind=1 AND lce.connection_id=?" " INNER JOIN " + connectionTableName + " AS lce ON lce.element_id = le.id AND lce.kind=1 AND lce.connection_id=?"
sess := session.SQL(sql, dashboardID) sess := session.SQL(sql, dashboardID)
@ -610,7 +615,7 @@ func (l *LibraryElementService) connectElementsToDashboardID(c *models.ReqContex
return err return err
} }
for _, elementUID := range elementUIDs { for _, elementUID := range elementUIDs {
element, err := getLibraryElement(session, elementUID, c.SignedInUser.OrgId) element, err := getLibraryElement(l.SQLStore.Dialect, session, elementUID, c.SignedInUser.OrgId)
if err != nil { if err != nil {
return err return err
} }