mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
PublicDashboards: New method created to get access through Request access page when its paused (#64451)
This commit is contained in:
parent
8ef2afda87
commit
4d0e309d4e
@ -21,7 +21,7 @@ func (api *Api) ViewPublicDashboard(c *contextmodel.ReqContext) response.Respons
|
|||||||
return response.Err(ErrInvalidAccessToken.Errorf("ViewPublicDashboard: invalid access token"))
|
return response.Err(ErrInvalidAccessToken.Errorf("ViewPublicDashboard: invalid access token"))
|
||||||
}
|
}
|
||||||
|
|
||||||
pubdash, dash, err := api.PublicDashboardService.FindPublicDashboardAndDashboardByAccessToken(
|
pubdash, dash, err := api.PublicDashboardService.FindEnabledPublicDashboardAndDashboardByAccessToken(
|
||||||
c.Req.Context(),
|
c.Req.Context(),
|
||||||
accessToken,
|
accessToken,
|
||||||
)
|
)
|
||||||
|
@ -83,7 +83,7 @@ func TestAPIViewPublicDashboard(t *testing.T) {
|
|||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
t.Run(test.Name, func(t *testing.T) {
|
t.Run(test.Name, func(t *testing.T) {
|
||||||
service := publicdashboards.NewFakePublicDashboardService(t)
|
service := publicdashboards.NewFakePublicDashboardService(t)
|
||||||
service.On("FindPublicDashboardAndDashboardByAccessToken", mock.Anything, mock.AnythingOfType("string")).
|
service.On("FindEnabledPublicDashboardAndDashboardByAccessToken", mock.Anything, mock.AnythingOfType("string")).
|
||||||
Return(&PublicDashboard{Uid: "pubdashuid"}, test.DashboardResult, test.Err).Maybe()
|
Return(&PublicDashboard{Uid: "pubdashuid"}, test.DashboardResult, test.Err).Maybe()
|
||||||
|
|
||||||
cfg := setting.NewCfg()
|
cfg := setting.NewCfg()
|
||||||
|
@ -254,6 +254,38 @@ func (_m *FakePublicDashboardService) FindDashboard(ctx context.Context, orgId i
|
|||||||
return r0, r1
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindEnabledDashboardAndDashboardByAccessToken provides a mock function with given fields: ctx, accessToken
|
||||||
|
func (_m *FakePublicDashboardService) FindEnabledPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*models.PublicDashboard, *dashboards.Dashboard, error) {
|
||||||
|
ret := _m.Called(ctx, accessToken)
|
||||||
|
|
||||||
|
var r0 *models.PublicDashboard
|
||||||
|
if rf, ok := ret.Get(0).(func(context.Context, string) *models.PublicDashboard); ok {
|
||||||
|
r0 = rf(ctx, accessToken)
|
||||||
|
} else {
|
||||||
|
if ret.Get(0) != nil {
|
||||||
|
r0 = ret.Get(0).(*models.PublicDashboard)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var r1 *dashboards.Dashboard
|
||||||
|
if rf, ok := ret.Get(1).(func(context.Context, string) *dashboards.Dashboard); ok {
|
||||||
|
r1 = rf(ctx, accessToken)
|
||||||
|
} else {
|
||||||
|
if ret.Get(1) != nil {
|
||||||
|
r1 = ret.Get(1).(*dashboards.Dashboard)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var r2 error
|
||||||
|
if rf, ok := ret.Get(2).(func(context.Context, string) error); ok {
|
||||||
|
r2 = rf(ctx, accessToken)
|
||||||
|
} else {
|
||||||
|
r2 = ret.Error(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1, r2
|
||||||
|
}
|
||||||
|
|
||||||
// FindPublicDashboardAndDashboardByAccessToken provides a mock function with given fields: ctx, accessToken
|
// FindPublicDashboardAndDashboardByAccessToken provides a mock function with given fields: ctx, accessToken
|
||||||
func (_m *FakePublicDashboardService) FindPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*models.PublicDashboard, *dashboards.Dashboard, error) {
|
func (_m *FakePublicDashboardService) FindPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*models.PublicDashboard, *dashboards.Dashboard, error) {
|
||||||
ret := _m.Called(ctx, accessToken)
|
ret := _m.Called(ctx, accessToken)
|
||||||
|
@ -16,6 +16,7 @@ import (
|
|||||||
//go:generate mockery --name Service --structname FakePublicDashboardService --inpackage --filename public_dashboard_service_mock.go
|
//go:generate mockery --name Service --structname FakePublicDashboardService --inpackage --filename public_dashboard_service_mock.go
|
||||||
type Service interface {
|
type Service interface {
|
||||||
FindPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, *dashboards.Dashboard, error)
|
FindPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, *dashboards.Dashboard, error)
|
||||||
|
FindEnabledPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, *dashboards.Dashboard, error)
|
||||||
FindByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, error)
|
FindByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, error)
|
||||||
FindByDashboardUid(ctx context.Context, orgId int64, dashboardUid string) (*PublicDashboard, error)
|
FindByDashboardUid(ctx context.Context, orgId int64, dashboardUid string) (*PublicDashboard, error)
|
||||||
FindAnnotations(ctx context.Context, reqDTO AnnotationsQueryDTO, accessToken string) ([]AnnotationEvent, error)
|
FindAnnotations(ctx context.Context, reqDTO AnnotationsQueryDTO, accessToken string) ([]AnnotationEvent, error)
|
||||||
|
@ -18,7 +18,7 @@ import (
|
|||||||
|
|
||||||
// FindAnnotations returns annotations for a public dashboard
|
// FindAnnotations returns annotations for a public dashboard
|
||||||
func (pd *PublicDashboardServiceImpl) FindAnnotations(ctx context.Context, reqDTO models.AnnotationsQueryDTO, accessToken string) ([]models.AnnotationEvent, error) {
|
func (pd *PublicDashboardServiceImpl) FindAnnotations(ctx context.Context, reqDTO models.AnnotationsQueryDTO, accessToken string) ([]models.AnnotationEvent, error) {
|
||||||
pub, dash, err := pd.FindPublicDashboardAndDashboardByAccessToken(ctx, accessToken)
|
pub, dash, err := pd.FindEnabledPublicDashboardAndDashboardByAccessToken(ctx, accessToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ func (pd *PublicDashboardServiceImpl) GetMetricRequest(ctx context.Context, dash
|
|||||||
|
|
||||||
// GetQueryDataResponse returns a query data response for the given panel and query
|
// GetQueryDataResponse returns a query data response for the given panel and query
|
||||||
func (pd *PublicDashboardServiceImpl) GetQueryDataResponse(ctx context.Context, skipCache bool, queryDto models.PublicDashboardQueryDTO, panelId int64, accessToken string) (*backend.QueryDataResponse, error) {
|
func (pd *PublicDashboardServiceImpl) GetQueryDataResponse(ctx context.Context, skipCache bool, queryDto models.PublicDashboardQueryDTO, panelId int64, accessToken string) (*backend.QueryDataResponse, error) {
|
||||||
publicDashboard, dashboard, err := pd.FindPublicDashboardAndDashboardByAccessToken(ctx, accessToken)
|
publicDashboard, dashboard, err := pd.FindEnabledPublicDashboardAndDashboardByAccessToken(ctx, accessToken)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -105,6 +105,20 @@ func (pd *PublicDashboardServiceImpl) FindByAccessToken(ctx context.Context, acc
|
|||||||
return pubdash, nil
|
return pubdash, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindEnabledPublicDashboardAndDashboardByAccessToken Gets public dashboard and a dashboard by access token if public dashboard is enabled
|
||||||
|
func (pd *PublicDashboardServiceImpl) FindEnabledPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, *dashboards.Dashboard, error) {
|
||||||
|
pubdash, dash, err := pd.FindPublicDashboardAndDashboardByAccessToken(ctx, accessToken)
|
||||||
|
if err != nil {
|
||||||
|
return pubdash, dash, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !pubdash.IsEnabled {
|
||||||
|
return nil, nil, ErrPublicDashboardNotEnabled.Errorf("FindEnabledPublicDashboardAndDashboardByAccessToken: Public dashboard is not enabled accessToken: %s", accessToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
return pubdash, dash, err
|
||||||
|
}
|
||||||
|
|
||||||
// FindPublicDashboardAndDashboardByAccessToken Gets public dashboard and a dashboard by access token
|
// FindPublicDashboardAndDashboardByAccessToken Gets public dashboard and a dashboard by access token
|
||||||
func (pd *PublicDashboardServiceImpl) FindPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, *dashboards.Dashboard, error) {
|
func (pd *PublicDashboardServiceImpl) FindPublicDashboardAndDashboardByAccessToken(ctx context.Context, accessToken string) (*PublicDashboard, *dashboards.Dashboard, error) {
|
||||||
pubdash, err := pd.FindByAccessToken(ctx, accessToken)
|
pubdash, err := pd.FindByAccessToken(ctx, accessToken)
|
||||||
@ -112,10 +126,6 @@ func (pd *PublicDashboardServiceImpl) FindPublicDashboardAndDashboardByAccessTok
|
|||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !pubdash.IsEnabled {
|
|
||||||
return nil, nil, ErrPublicDashboardNotEnabled.Errorf("FindPublicDashboardAndDashboardByAccessToken: Public dashboard is paused accessToken: %s", accessToken)
|
|
||||||
}
|
|
||||||
|
|
||||||
dash, err := pd.store.FindDashboard(ctx, pubdash.OrgId, pubdash.DashboardUid)
|
dash, err := pd.store.FindDashboard(ctx, pubdash.OrgId, pubdash.DashboardUid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
@ -67,15 +67,15 @@ func TestGetPublicDashboard(t *testing.T) {
|
|||||||
DashResp: &dashboards.Dashboard{UID: "mydashboard", Data: dashboardData},
|
DashResp: &dashboards.Dashboard{UID: "mydashboard", Data: dashboardData},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "returns ErrPublicDashboardNotFound when isEnabled is false",
|
Name: "returns dashboard when isEnabled is false",
|
||||||
AccessToken: "abc123",
|
AccessToken: "abc123",
|
||||||
StoreResp: &storeResp{
|
StoreResp: &storeResp{
|
||||||
pd: &PublicDashboard{AccessToken: "abcdToken", IsEnabled: false},
|
pd: &PublicDashboard{AccessToken: "abcdToken", IsEnabled: false},
|
||||||
d: &dashboards.Dashboard{UID: "mydashboard"},
|
d: &dashboards.Dashboard{UID: "mydashboard", Data: dashboardData},
|
||||||
err: nil,
|
err: nil,
|
||||||
},
|
},
|
||||||
ErrResp: ErrPublicDashboardNotFound,
|
ErrResp: nil,
|
||||||
DashResp: nil,
|
DashResp: &dashboards.Dashboard{UID: "mydashboard", Data: dashboardData},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "returns ErrPublicDashboardNotFound if PublicDashboard missing",
|
Name: "returns ErrPublicDashboardNotFound if PublicDashboard missing",
|
||||||
@ -121,6 +121,72 @@ func TestGetPublicDashboard(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetEnabledPublicDashboard(t *testing.T) {
|
||||||
|
type storeResp struct {
|
||||||
|
pd *PublicDashboard
|
||||||
|
d *dashboards.Dashboard
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
Name string
|
||||||
|
AccessToken string
|
||||||
|
StoreResp *storeResp
|
||||||
|
ErrResp error
|
||||||
|
DashResp *dashboards.Dashboard
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Name: "returns a dashboard",
|
||||||
|
AccessToken: "abc123",
|
||||||
|
StoreResp: &storeResp{
|
||||||
|
pd: &PublicDashboard{AccessToken: "abcdToken", IsEnabled: true},
|
||||||
|
d: &dashboards.Dashboard{UID: "mydashboard", Data: dashboardData},
|
||||||
|
err: nil,
|
||||||
|
},
|
||||||
|
ErrResp: nil,
|
||||||
|
DashResp: &dashboards.Dashboard{UID: "mydashboard", Data: dashboardData},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "returns ErrPublicDashboardNotFound when isEnabled is false",
|
||||||
|
AccessToken: "abc123",
|
||||||
|
StoreResp: &storeResp{
|
||||||
|
pd: &PublicDashboard{AccessToken: "abcdToken", IsEnabled: false},
|
||||||
|
d: &dashboards.Dashboard{UID: "mydashboard"},
|
||||||
|
err: nil,
|
||||||
|
},
|
||||||
|
ErrResp: ErrPublicDashboardNotFound,
|
||||||
|
DashResp: nil,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
t.Run(test.Name, func(t *testing.T) {
|
||||||
|
fakeStore := FakePublicDashboardStore{}
|
||||||
|
service := &PublicDashboardServiceImpl{
|
||||||
|
log: log.New("test.logger"),
|
||||||
|
store: &fakeStore,
|
||||||
|
}
|
||||||
|
|
||||||
|
fakeStore.On("FindByAccessToken", mock.Anything, mock.Anything).Return(test.StoreResp.pd, test.StoreResp.err)
|
||||||
|
fakeStore.On("FindDashboard", mock.Anything, mock.Anything, mock.Anything).Return(test.StoreResp.d, test.StoreResp.err)
|
||||||
|
|
||||||
|
pdc, dash, err := service.FindEnabledPublicDashboardAndDashboardByAccessToken(context.Background(), test.AccessToken)
|
||||||
|
if test.ErrResp != nil {
|
||||||
|
assert.Error(t, test.ErrResp, err)
|
||||||
|
} else {
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, test.DashResp, dash)
|
||||||
|
|
||||||
|
if test.DashResp != nil {
|
||||||
|
assert.NotNil(t, dash.CreatedBy)
|
||||||
|
assert.Equal(t, test.StoreResp.pd, pdc)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// We're using sqlite here because testing all of the behaviors with mocks in
|
// We're using sqlite here because testing all of the behaviors with mocks in
|
||||||
// the correct order is convoluted.
|
// the correct order is convoluted.
|
||||||
func TestCreatePublicDashboard(t *testing.T) {
|
func TestCreatePublicDashboard(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user