Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
7aab6a88
Commit
7aab6a88
authored
Mar 22, 2018
by
Julian Kornberger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make golint happier
parent
624dac16
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
286 additions
and
290 deletions
+286
-290
pkg/api/admin_users.go
+7
-7
pkg/api/alerting.go
+3
-3
pkg/api/annotations.go
+17
-17
pkg/api/api.go
+19
-19
pkg/api/apikey.go
+3
-3
pkg/api/app_routes.go
+2
-2
pkg/api/dashboard.go
+18
-21
pkg/api/dashboard_permission.go
+8
-8
pkg/api/dashboard_snapshot.go
+2
-2
pkg/api/dashboard_test.go
+10
-10
pkg/api/dataproxy.go
+4
-4
pkg/api/datasources.go
+12
-13
pkg/api/folder.go
+2
-2
pkg/api/folder_test.go
+2
-2
pkg/api/http_server.go
+1
-1
pkg/api/index.go
+15
-14
pkg/api/login.go
+3
-3
pkg/api/metrics.go
+3
-3
pkg/api/org.go
+6
-6
pkg/api/org_invite.go
+15
-16
pkg/api/org_users.go
+9
-9
pkg/api/playlist.go
+2
-2
pkg/api/playlist_play.go
+27
-29
pkg/api/plugins.go
+43
-41
pkg/api/preferences.go
+5
-5
pkg/api/search.go
+8
-8
pkg/api/team.go
+2
-2
pkg/api/user.go
+18
-18
pkg/cmd/grafana-server/server.go
+1
-1
pkg/middleware/auth.go
+3
-3
pkg/middleware/dashboard_redirect.go
+1
-1
pkg/middleware/dashboard_redirect_test.go
+9
-9
pkg/middleware/recovery_test.go
+6
-6
No files found.
pkg/api/admin_users.go
View file @
7aab6a88
...
...
@@ -47,14 +47,14 @@ func AdminCreateUser(c *m.ReqContext, form dtos.AdminCreateUserForm) {
}
func
AdminUpdateUserPassword
(
c
*
m
.
ReqContext
,
form
dtos
.
AdminUpdateUserPasswordForm
)
{
userI
d
:=
c
.
ParamsInt64
(
":id"
)
userI
D
:=
c
.
ParamsInt64
(
":id"
)
if
len
(
form
.
Password
)
<
4
{
c
.
JsonApiErr
(
400
,
"New password too short"
,
nil
)
return
}
userQuery
:=
m
.
GetUserByIdQuery
{
Id
:
userI
d
}
userQuery
:=
m
.
GetUserByIdQuery
{
Id
:
userI
D
}
if
err
:=
bus
.
Dispatch
(
&
userQuery
);
err
!=
nil
{
c
.
JsonApiErr
(
500
,
"Could not read user from database"
,
err
)
...
...
@@ -64,7 +64,7 @@ func AdminUpdateUserPassword(c *m.ReqContext, form dtos.AdminUpdateUserPasswordF
passwordHashed
:=
util
.
EncodePassword
(
form
.
Password
,
userQuery
.
Result
.
Salt
)
cmd
:=
m
.
ChangeUserPasswordCommand
{
UserId
:
userI
d
,
UserId
:
userI
D
,
NewPassword
:
passwordHashed
,
}
...
...
@@ -77,10 +77,10 @@ func AdminUpdateUserPassword(c *m.ReqContext, form dtos.AdminUpdateUserPasswordF
}
func
AdminUpdateUserPermissions
(
c
*
m
.
ReqContext
,
form
dtos
.
AdminUpdateUserPermissionsForm
)
{
userI
d
:=
c
.
ParamsInt64
(
":id"
)
userI
D
:=
c
.
ParamsInt64
(
":id"
)
cmd
:=
m
.
UpdateUserPermissionsCommand
{
UserId
:
userI
d
,
UserId
:
userI
D
,
IsGrafanaAdmin
:
form
.
IsGrafanaAdmin
,
}
...
...
@@ -93,9 +93,9 @@ func AdminUpdateUserPermissions(c *m.ReqContext, form dtos.AdminUpdateUserPermis
}
func
AdminDeleteUser
(
c
*
m
.
ReqContext
)
{
userI
d
:=
c
.
ParamsInt64
(
":id"
)
userI
D
:=
c
.
ParamsInt64
(
":id"
)
cmd
:=
m
.
DeleteUserCommand
{
UserId
:
userI
d
}
cmd
:=
m
.
DeleteUserCommand
{
UserId
:
userI
D
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
c
.
JsonApiErr
(
500
,
"Failed to delete user"
,
err
)
...
...
pkg/api/alerting.go
View file @
7aab6a88
...
...
@@ -26,9 +26,9 @@ func ValidateOrgAlert(c *m.ReqContext) {
}
func
GetAlertStatesForDashboard
(
c
*
m
.
ReqContext
)
Response
{
dashboardI
d
:=
c
.
QueryInt64
(
"dashboardId"
)
dashboardI
D
:=
c
.
QueryInt64
(
"dashboardId"
)
if
dashboardI
d
==
0
{
if
dashboardI
D
==
0
{
return
ApiError
(
400
,
"Missing query parameter dashboardId"
,
nil
)
}
...
...
@@ -151,7 +151,7 @@ func GetAlertNotifications(c *m.ReqContext) Response {
return
Json
(
200
,
result
)
}
func
GetAlertNotificationByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
GetAlertNotificationByI
D
(
c
*
m
.
ReqContext
)
Response
{
query
:=
&
m
.
GetAlertNotificationsQuery
{
OrgId
:
c
.
OrgId
,
Id
:
c
.
ParamsInt64
(
"notificationId"
),
...
...
pkg/api/annotations.go
View file @
7aab6a88
...
...
@@ -52,7 +52,7 @@ func (e *CreateAnnotationError) Error() string {
}
func
PostAnnotation
(
c
*
m
.
ReqContext
,
cmd
dtos
.
PostAnnotationsCmd
)
Response
{
if
canSave
,
err
:=
canSaveByDashboardI
d
(
c
,
cmd
.
DashboardId
);
err
!=
nil
||
!
canSave
{
if
canSave
,
err
:=
canSaveByDashboardI
D
(
c
,
cmd
.
DashboardId
);
err
!=
nil
||
!
canSave
{
return
dashboardGuardianResponse
(
err
)
}
...
...
@@ -179,18 +179,18 @@ func PostGraphiteAnnotation(c *m.ReqContext, cmd dtos.PostGraphiteAnnotationsCmd
}
func
UpdateAnnotation
(
c
*
m
.
ReqContext
,
cmd
dtos
.
UpdateAnnotationsCmd
)
Response
{
annotationI
d
:=
c
.
ParamsInt64
(
":annotationId"
)
annotationI
D
:=
c
.
ParamsInt64
(
":annotationId"
)
repo
:=
annotations
.
GetRepository
()
if
resp
:=
canSave
(
c
,
repo
,
annotationI
d
);
resp
!=
nil
{
if
resp
:=
canSave
(
c
,
repo
,
annotationI
D
);
resp
!=
nil
{
return
resp
}
item
:=
annotations
.
Item
{
OrgId
:
c
.
OrgId
,
UserId
:
c
.
UserId
,
Id
:
annotationI
d
,
Id
:
annotationI
D
,
Epoch
:
cmd
.
Time
/
1000
,
Text
:
cmd
.
Text
,
Tags
:
cmd
.
Tags
,
...
...
@@ -254,14 +254,14 @@ func DeleteAnnotationById(c *m.ReqContext) Response {
func
DeleteAnnotationRegion
(
c
*
m
.
ReqContext
)
Response
{
repo
:=
annotations
.
GetRepository
()
regionI
d
:=
c
.
ParamsInt64
(
":regionId"
)
regionI
D
:=
c
.
ParamsInt64
(
":regionId"
)
if
resp
:=
canSave
(
c
,
repo
,
regionI
d
);
resp
!=
nil
{
if
resp
:=
canSave
(
c
,
repo
,
regionI
D
);
resp
!=
nil
{
return
resp
}
err
:=
repo
.
Delete
(
&
annotations
.
DeleteParams
{
RegionId
:
regionI
d
,
RegionId
:
regionI
D
,
})
if
err
!=
nil
{
...
...
@@ -271,13 +271,13 @@ func DeleteAnnotationRegion(c *m.ReqContext) Response {
return
ApiSuccess
(
"Annotation region deleted"
)
}
func
canSaveByDashboardI
d
(
c
*
m
.
ReqContext
,
dashboardId
int64
)
(
bool
,
error
)
{
if
dashboardI
d
==
0
&&
!
c
.
SignedInUser
.
HasRole
(
m
.
ROLE_EDITOR
)
{
func
canSaveByDashboardI
D
(
c
*
m
.
ReqContext
,
dashboardID
int64
)
(
bool
,
error
)
{
if
dashboardI
D
==
0
&&
!
c
.
SignedInUser
.
HasRole
(
m
.
ROLE_EDITOR
)
{
return
false
,
nil
}
if
dashboardI
d
>
0
{
guardian
:=
guardian
.
New
(
dashboardI
d
,
c
.
OrgId
,
c
.
SignedInUser
)
if
dashboardI
D
>
0
{
guardian
:=
guardian
.
New
(
dashboardI
D
,
c
.
OrgId
,
c
.
SignedInUser
)
if
canEdit
,
err
:=
guardian
.
CanEdit
();
err
!=
nil
||
!
canEdit
{
return
false
,
err
}
...
...
@@ -293,25 +293,25 @@ func canSave(c *m.ReqContext, repo annotations.Repository, annotationId int64) R
return
ApiError
(
500
,
"Could not find annotation to update"
,
err
)
}
dashboardI
d
:=
items
[
0
]
.
DashboardId
dashboardI
D
:=
items
[
0
]
.
DashboardId
if
canSave
,
err
:=
canSaveByDashboardI
d
(
c
,
dashboardId
);
err
!=
nil
||
!
canSave
{
if
canSave
,
err
:=
canSaveByDashboardI
D
(
c
,
dashboardID
);
err
!=
nil
||
!
canSave
{
return
dashboardGuardianResponse
(
err
)
}
return
nil
}
func
canSaveByRegionI
d
(
c
*
m
.
ReqContext
,
repo
annotations
.
Repository
,
regionId
int64
)
Response
{
items
,
err
:=
repo
.
Find
(
&
annotations
.
ItemQuery
{
RegionId
:
regionI
d
,
OrgId
:
c
.
OrgId
})
func
canSaveByRegionI
D
(
c
*
m
.
ReqContext
,
repo
annotations
.
Repository
,
regionID
int64
)
Response
{
items
,
err
:=
repo
.
Find
(
&
annotations
.
ItemQuery
{
RegionId
:
regionI
D
,
OrgId
:
c
.
OrgId
})
if
err
!=
nil
||
len
(
items
)
==
0
{
return
ApiError
(
500
,
"Could not find annotation to update"
,
err
)
}
dashboardI
d
:=
items
[
0
]
.
DashboardId
dashboardI
D
:=
items
[
0
]
.
DashboardId
if
canSave
,
err
:=
canSaveByDashboardI
d
(
c
,
dashboardId
);
err
!=
nil
||
!
canSave
{
if
canSave
,
err
:=
canSaveByDashboardI
D
(
c
,
dashboardID
);
err
!=
nil
||
!
canSave
{
return
dashboardGuardianResponse
(
err
)
}
...
...
pkg/api/api.go
View file @
7aab6a88
...
...
@@ -15,7 +15,7 @@ func (hs *HttpServer) registerRoutes() {
reqGrafanaAdmin
:=
middleware
.
Auth
(
&
middleware
.
AuthOptions
{
ReqSignedIn
:
true
,
ReqGrafanaAdmin
:
true
})
reqEditorRole
:=
middleware
.
RoleAuth
(
m
.
ROLE_EDITOR
,
m
.
ROLE_ADMIN
)
reqOrgAdmin
:=
middleware
.
RoleAuth
(
m
.
ROLE_ADMIN
)
redirectFromLegacyDashboardUrl
:=
middleware
.
RedirectFromLegacyDashboardU
rl
()
redirectFromLegacyDashboardUrl
:=
middleware
.
RedirectFromLegacyDashboardU
RL
()
redirectFromLegacyDashboardSoloUrl
:=
middleware
.
RedirectFromLegacyDashboardSoloUrl
()
quota
:=
middleware
.
Quota
bind
:=
binding
.
Bind
...
...
@@ -110,7 +110,7 @@ func (hs *HttpServer) registerRoutes() {
r
.
Get
(
"/api/snapshots-delete/:key"
,
reqEditorRole
,
wrap
(
DeleteDashboardSnapshot
))
// api renew session based on remember cookie
r
.
Get
(
"/api/login/ping"
,
quota
(
"session"
),
LoginA
pi
Ping
)
r
.
Get
(
"/api/login/ping"
,
quota
(
"session"
),
LoginA
PI
Ping
)
// authed api
r
.
Group
(
"/api"
,
func
(
apiRoute
RouteRegister
)
{
...
...
@@ -139,7 +139,7 @@ func (hs *HttpServer) registerRoutes() {
apiRoute
.
Group
(
"/users"
,
func
(
usersRoute
RouteRegister
)
{
usersRoute
.
Get
(
"/"
,
wrap
(
SearchUsers
))
usersRoute
.
Get
(
"/search"
,
wrap
(
SearchUsersWithPaging
))
usersRoute
.
Get
(
"/:id"
,
wrap
(
GetUserByI
d
))
usersRoute
.
Get
(
"/:id"
,
wrap
(
GetUserByI
D
))
usersRoute
.
Get
(
"/:id/orgs"
,
wrap
(
GetUserOrgList
))
// query parameters /users/lookup?loginOrEmail=admin@example.com
usersRoute
.
Get
(
"/lookup"
,
wrap
(
GetUserByLoginOrEmail
))
...
...
@@ -149,11 +149,11 @@ func (hs *HttpServer) registerRoutes() {
// team (admin permission required)
apiRoute
.
Group
(
"/teams"
,
func
(
teamsRoute
RouteRegister
)
{
teamsRoute
.
Get
(
"/:teamId"
,
wrap
(
GetTeamByI
d
))
teamsRoute
.
Get
(
"/:teamId"
,
wrap
(
GetTeamByI
D
))
teamsRoute
.
Get
(
"/search"
,
wrap
(
SearchTeams
))
teamsRoute
.
Post
(
"/"
,
bind
(
m
.
CreateTeamCommand
{}),
wrap
(
CreateTeam
))
teamsRoute
.
Put
(
"/:teamId"
,
bind
(
m
.
UpdateTeamCommand
{}),
wrap
(
UpdateTeam
))
teamsRoute
.
Delete
(
"/:teamId"
,
wrap
(
DeleteTeamByI
d
))
teamsRoute
.
Delete
(
"/:teamId"
,
wrap
(
DeleteTeamByI
D
))
teamsRoute
.
Get
(
"/:teamId/members"
,
wrap
(
GetTeamMembers
))
teamsRoute
.
Post
(
"/:teamId/members"
,
bind
(
m
.
AddTeamMemberCommand
{}),
wrap
(
AddTeamMember
))
teamsRoute
.
Delete
(
"/:teamId/members/:userId"
,
wrap
(
RemoveTeamMember
))
...
...
@@ -192,10 +192,10 @@ func (hs *HttpServer) registerRoutes() {
// orgs (admin routes)
apiRoute
.
Group
(
"/orgs/:orgId"
,
func
(
orgsRoute
RouteRegister
)
{
orgsRoute
.
Get
(
"/"
,
wrap
(
GetOrgByI
d
))
orgsRoute
.
Get
(
"/"
,
wrap
(
GetOrgByI
D
))
orgsRoute
.
Put
(
"/"
,
bind
(
dtos
.
UpdateOrgForm
{}),
wrap
(
UpdateOrg
))
orgsRoute
.
Put
(
"/address"
,
bind
(
dtos
.
UpdateOrgAddressForm
{}),
wrap
(
UpdateOrgAddress
))
orgsRoute
.
Delete
(
"/"
,
wrap
(
DeleteOrgByI
d
))
orgsRoute
.
Delete
(
"/"
,
wrap
(
DeleteOrgByI
D
))
orgsRoute
.
Get
(
"/users"
,
wrap
(
GetOrgUsers
))
orgsRoute
.
Post
(
"/users"
,
bind
(
m
.
AddOrgUserCommand
{}),
wrap
(
AddOrgUser
))
orgsRoute
.
Patch
(
"/users/:userId"
,
bind
(
m
.
UpdateOrgUserCommand
{}),
wrap
(
UpdateOrgUser
))
...
...
@@ -211,9 +211,9 @@ func (hs *HttpServer) registerRoutes() {
// auth api keys
apiRoute
.
Group
(
"/auth/keys"
,
func
(
keysRoute
RouteRegister
)
{
keysRoute
.
Get
(
"/"
,
wrap
(
GetA
pi
Keys
))
keysRoute
.
Post
(
"/"
,
quota
(
"api_key"
),
bind
(
m
.
AddApiKeyCommand
{}),
wrap
(
AddA
pi
Key
))
keysRoute
.
Delete
(
"/:id"
,
wrap
(
DeleteA
pi
Key
))
keysRoute
.
Get
(
"/"
,
wrap
(
GetA
PI
Keys
))
keysRoute
.
Post
(
"/"
,
quota
(
"api_key"
),
bind
(
m
.
AddApiKeyCommand
{}),
wrap
(
AddA
PI
Key
))
keysRoute
.
Delete
(
"/:id"
,
wrap
(
DeleteA
PI
Key
))
},
reqOrgAdmin
)
// Preferences
...
...
@@ -226,16 +226,16 @@ func (hs *HttpServer) registerRoutes() {
datasourceRoute
.
Get
(
"/"
,
wrap
(
GetDataSources
))
datasourceRoute
.
Post
(
"/"
,
quota
(
"data_source"
),
bind
(
m
.
AddDataSourceCommand
{}),
wrap
(
AddDataSource
))
datasourceRoute
.
Put
(
"/:id"
,
bind
(
m
.
UpdateDataSourceCommand
{}),
wrap
(
UpdateDataSource
))
datasourceRoute
.
Delete
(
"/:id"
,
wrap
(
DeleteDataSourceByI
d
))
datasourceRoute
.
Delete
(
"/:id"
,
wrap
(
DeleteDataSourceByI
D
))
datasourceRoute
.
Delete
(
"/name/:name"
,
wrap
(
DeleteDataSourceByName
))
datasourceRoute
.
Get
(
"/:id"
,
wrap
(
GetDataSourceByI
d
))
datasourceRoute
.
Get
(
"/:id"
,
wrap
(
GetDataSourceByI
D
))
datasourceRoute
.
Get
(
"/name/:name"
,
wrap
(
GetDataSourceByName
))
},
reqOrgAdmin
)
apiRoute
.
Get
(
"/datasources/id/:name"
,
wrap
(
GetDataSourceI
d
ByName
),
reqSignedIn
)
apiRoute
.
Get
(
"/datasources/id/:name"
,
wrap
(
GetDataSourceI
D
ByName
),
reqSignedIn
)
apiRoute
.
Get
(
"/plugins"
,
wrap
(
GetPluginList
))
apiRoute
.
Get
(
"/plugins/:pluginId/settings"
,
wrap
(
GetPluginSettingByI
d
))
apiRoute
.
Get
(
"/plugins/:pluginId/settings"
,
wrap
(
GetPluginSettingByI
D
))
apiRoute
.
Get
(
"/plugins/:pluginId/markdown/:name"
,
wrap
(
GetPluginMarkdown
))
apiRoute
.
Group
(
"/plugins"
,
func
(
pluginRoute
RouteRegister
)
{
...
...
@@ -250,11 +250,11 @@ func (hs *HttpServer) registerRoutes() {
// Folders
apiRoute
.
Group
(
"/folders"
,
func
(
folderRoute
RouteRegister
)
{
folderRoute
.
Get
(
"/"
,
wrap
(
GetFolders
))
folderRoute
.
Get
(
"/id/:id"
,
wrap
(
GetFolderByI
d
))
folderRoute
.
Get
(
"/id/:id"
,
wrap
(
GetFolderByI
D
))
folderRoute
.
Post
(
"/"
,
bind
(
m
.
CreateFolderCommand
{}),
wrap
(
CreateFolder
))
folderRoute
.
Group
(
"/:uid"
,
func
(
folderUidRoute
RouteRegister
)
{
folderUidRoute
.
Get
(
"/"
,
wrap
(
GetFolderByU
id
))
folderUidRoute
.
Get
(
"/"
,
wrap
(
GetFolderByU
ID
))
folderUidRoute
.
Put
(
"/"
,
bind
(
m
.
UpdateFolderCommand
{}),
wrap
(
UpdateFolder
))
folderUidRoute
.
Delete
(
"/"
,
wrap
(
DeleteFolder
))
...
...
@@ -268,7 +268,7 @@ func (hs *HttpServer) registerRoutes() {
// Dashboard
apiRoute
.
Group
(
"/dashboards"
,
func
(
dashboardRoute
RouteRegister
)
{
dashboardRoute
.
Get
(
"/uid/:uid"
,
wrap
(
GetDashboard
))
dashboardRoute
.
Delete
(
"/uid/:uid"
,
wrap
(
DeleteDashboardByU
id
))
dashboardRoute
.
Delete
(
"/uid/:uid"
,
wrap
(
DeleteDashboardByU
ID
))
dashboardRoute
.
Get
(
"/db/:slug"
,
wrap
(
GetDashboard
))
dashboardRoute
.
Delete
(
"/db/:slug"
,
wrap
(
DeleteDashboard
))
...
...
@@ -314,7 +314,7 @@ func (hs *HttpServer) registerRoutes() {
// metrics
apiRoute
.
Post
(
"/tsdb/query"
,
bind
(
dtos
.
MetricRequest
{}),
wrap
(
QueryMetrics
))
apiRoute
.
Get
(
"/tsdb/testdata/scenarios"
,
wrap
(
GetTestDataScenarios
))
apiRoute
.
Get
(
"/tsdb/testdata/gensql"
,
reqGrafanaAdmin
,
wrap
(
GenerateS
ql
TestData
))
apiRoute
.
Get
(
"/tsdb/testdata/gensql"
,
reqGrafanaAdmin
,
wrap
(
GenerateS
QL
TestData
))
apiRoute
.
Get
(
"/tsdb/testdata/random-walk"
,
wrap
(
GetTestDataRandomWalk
))
apiRoute
.
Group
(
"/alerts"
,
func
(
alertsRoute
RouteRegister
)
{
...
...
@@ -332,7 +332,7 @@ func (hs *HttpServer) registerRoutes() {
alertNotifications
.
Post
(
"/test"
,
bind
(
dtos
.
NotificationTestCommand
{}),
wrap
(
NotificationTest
))
alertNotifications
.
Post
(
"/"
,
bind
(
m
.
CreateAlertNotificationCommand
{}),
wrap
(
CreateAlertNotification
))
alertNotifications
.
Put
(
"/:notificationId"
,
bind
(
m
.
UpdateAlertNotificationCommand
{}),
wrap
(
UpdateAlertNotification
))
alertNotifications
.
Get
(
"/:notificationId"
,
wrap
(
GetAlertNotificationByI
d
))
alertNotifications
.
Get
(
"/:notificationId"
,
wrap
(
GetAlertNotificationByI
D
))
alertNotifications
.
Delete
(
"/:notificationId"
,
wrap
(
DeleteAlertNotification
))
},
reqEditorRole
)
...
...
pkg/api/apikey.go
View file @
7aab6a88
...
...
@@ -7,7 +7,7 @@ import (
m
"github.com/grafana/grafana/pkg/models"
)
func
GetA
pi
Keys
(
c
*
m
.
ReqContext
)
Response
{
func
GetA
PI
Keys
(
c
*
m
.
ReqContext
)
Response
{
query
:=
m
.
GetApiKeysQuery
{
OrgId
:
c
.
OrgId
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
...
...
@@ -26,7 +26,7 @@ func GetApiKeys(c *m.ReqContext) Response {
return
Json
(
200
,
result
)
}
func
DeleteA
pi
Key
(
c
*
m
.
ReqContext
)
Response
{
func
DeleteA
PI
Key
(
c
*
m
.
ReqContext
)
Response
{
id
:=
c
.
ParamsInt64
(
":id"
)
cmd
:=
&
m
.
DeleteApiKeyCommand
{
Id
:
id
,
OrgId
:
c
.
OrgId
}
...
...
@@ -39,7 +39,7 @@ func DeleteApiKey(c *m.ReqContext) Response {
return
ApiSuccess
(
"API key deleted"
)
}
func
AddA
pi
Key
(
c
*
m
.
ReqContext
,
cmd
m
.
AddApiKeyCommand
)
Response
{
func
AddA
PI
Key
(
c
*
m
.
ReqContext
,
cmd
m
.
AddApiKeyCommand
)
Response
{
if
!
cmd
.
Role
.
IsValid
()
{
return
ApiError
(
400
,
"Invalid role specified"
,
nil
)
}
...
...
pkg/api/app_routes.go
View file @
7aab6a88
...
...
@@ -55,11 +55,11 @@ func InitAppPluginRoutes(r *macaron.Macaron) {
}
}
func
AppPluginRoute
(
route
*
plugins
.
AppPluginRoute
,
appI
d
string
)
macaron
.
Handler
{
func
AppPluginRoute
(
route
*
plugins
.
AppPluginRoute
,
appI
D
string
)
macaron
.
Handler
{
return
func
(
c
*
m
.
ReqContext
)
{
path
:=
c
.
Params
(
"*"
)
proxy
:=
pluginproxy
.
NewApiPluginProxy
(
c
,
path
,
route
,
appI
d
)
proxy
:=
pluginproxy
.
NewApiPluginProxy
(
c
,
path
,
route
,
appI
D
)
proxy
.
Transport
=
pluginProxyTransport
proxy
.
ServeHTTP
(
c
.
Resp
,
c
.
Req
.
Request
)
}
...
...
pkg/api/dashboard.go
View file @
7aab6a88
...
...
@@ -22,12 +22,12 @@ import (
"github.com/grafana/grafana/pkg/util"
)
func
isDashboardStarredByUser
(
c
*
m
.
ReqContext
,
dashI
d
int64
)
(
bool
,
error
)
{
func
isDashboardStarredByUser
(
c
*
m
.
ReqContext
,
dashI
D
int64
)
(
bool
,
error
)
{
if
!
c
.
IsSignedIn
{
return
false
,
nil
}
query
:=
m
.
IsStarredByUserQuery
{
UserId
:
c
.
UserId
,
DashboardId
:
dashI
d
}
query
:=
m
.
IsStarredByUserQuery
{
UserId
:
c
.
UserId
,
DashboardId
:
dashI
D
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
false
,
err
}
...
...
@@ -114,24 +114,22 @@ func GetDashboard(c *m.ReqContext) Response {
return
Json
(
200
,
dto
)
}
func
getUserLogin
(
userI
d
int64
)
string
{
query
:=
m
.
GetUserByIdQuery
{
Id
:
userI
d
}
func
getUserLogin
(
userI
D
int64
)
string
{
query
:=
m
.
GetUserByIdQuery
{
Id
:
userI
D
}
err
:=
bus
.
Dispatch
(
&
query
)
if
err
!=
nil
{
return
"Anonymous"
}
else
{
user
:=
query
.
Result
return
user
.
Login
}
return
query
.
Result
.
Login
}
func
getDashboardHelper
(
orgI
d
int64
,
slug
string
,
id
int64
,
uid
string
)
(
*
m
.
Dashboard
,
Response
)
{
func
getDashboardHelper
(
orgI
D
int64
,
slug
string
,
id
int64
,
uid
string
)
(
*
m
.
Dashboard
,
Response
)
{
var
query
m
.
GetDashboardQuery
if
len
(
uid
)
>
0
{
query
=
m
.
GetDashboardQuery
{
Uid
:
uid
,
Id
:
id
,
OrgId
:
orgI
d
}
query
=
m
.
GetDashboardQuery
{
Uid
:
uid
,
Id
:
id
,
OrgId
:
orgI
D
}
}
else
{
query
=
m
.
GetDashboardQuery
{
Slug
:
slug
,
Id
:
id
,
OrgId
:
orgI
d
}
query
=
m
.
GetDashboardQuery
{
Slug
:
slug
,
Id
:
id
,
OrgId
:
orgI
D
}
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
...
...
@@ -173,7 +171,7 @@ func DeleteDashboard(c *m.ReqContext) Response {
})
}
func
DeleteDashboardByU
id
(
c
*
m
.
ReqContext
)
Response
{
func
DeleteDashboardByU
ID
(
c
*
m
.
ReqContext
)
Response
{
dash
,
rsp
:=
getDashboardHelper
(
c
.
OrgId
,
""
,
0
,
c
.
Params
(
":uid"
))
if
rsp
!=
nil
{
return
rsp
...
...
@@ -291,9 +289,8 @@ func GetHomeDashboard(c *m.ReqContext) Response {
url
:=
m
.
GetDashboardUrl
(
slugQuery
.
Result
.
Uid
,
slugQuery
.
Result
.
Slug
)
dashRedirect
:=
dtos
.
DashboardRedirect
{
RedirectUri
:
url
}
return
Json
(
200
,
&
dashRedirect
)
}
else
{
log
.
Warn
(
"Failed to get slug from database, %s"
,
err
.
Error
())
}
log
.
Warn
(
"Failed to get slug from database, %s"
,
err
.
Error
())
}
filePath
:=
path
.
Join
(
setting
.
StaticRootPath
,
"dashboards/home.json"
)
...
...
@@ -339,22 +336,22 @@ func addGettingStartedPanelToHomeDashboard(dash *simplejson.Json) {
// GetDashboardVersions returns all dashboard versions as JSON
func
GetDashboardVersions
(
c
*
m
.
ReqContext
)
Response
{
dashI
d
:=
c
.
ParamsInt64
(
":dashboardId"
)
dashI
D
:=
c
.
ParamsInt64
(
":dashboardId"
)
guardian
:=
guardian
.
New
(
dashI
d
,
c
.
OrgId
,
c
.
SignedInUser
)
guardian
:=
guardian
.
New
(
dashI
D
,
c
.
OrgId
,
c
.
SignedInUser
)
if
canSave
,
err
:=
guardian
.
CanSave
();
err
!=
nil
||
!
canSave
{
return
dashboardGuardianResponse
(
err
)
}
query
:=
m
.
GetDashboardVersionsQuery
{
OrgId
:
c
.
OrgId
,
DashboardId
:
dashI
d
,
DashboardId
:
dashI
D
,
Limit
:
c
.
QueryInt
(
"limit"
),
Start
:
c
.
QueryInt
(
"start"
),
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
ApiError
(
404
,
fmt
.
Sprintf
(
"No versions found for dashboardId %d"
,
dashI
d
),
err
)
return
ApiError
(
404
,
fmt
.
Sprintf
(
"No versions found for dashboardId %d"
,
dashI
D
),
err
)
}
for
_
,
version
:=
range
query
.
Result
{
...
...
@@ -378,21 +375,21 @@ func GetDashboardVersions(c *m.ReqContext) Response {
// GetDashboardVersion returns the dashboard version with the given ID.
func
GetDashboardVersion
(
c
*
m
.
ReqContext
)
Response
{
dashI
d
:=
c
.
ParamsInt64
(
":dashboardId"
)
dashI
D
:=
c
.
ParamsInt64
(
":dashboardId"
)
guardian
:=
guardian
.
New
(
dashI
d
,
c
.
OrgId
,
c
.
SignedInUser
)
guardian
:=
guardian
.
New
(
dashI
D
,
c
.
OrgId
,
c
.
SignedInUser
)
if
canSave
,
err
:=
guardian
.
CanSave
();
err
!=
nil
||
!
canSave
{
return
dashboardGuardianResponse
(
err
)
}
query
:=
m
.
GetDashboardVersionQuery
{
OrgId
:
c
.
OrgId
,
DashboardId
:
dashI
d
,
DashboardId
:
dashI
D
,
Version
:
c
.
ParamsInt
(
":id"
),
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
ApiError
(
500
,
fmt
.
Sprintf
(
"Dashboard version %d not found for dashboardId %d"
,
query
.
Version
,
dashI
d
),
err
)
return
ApiError
(
500
,
fmt
.
Sprintf
(
"Dashboard version %d not found for dashboardId %d"
,
query
.
Version
,
dashI
D
),
err
)
}
creator
:=
"Anonymous"
...
...
pkg/api/dashboard_permission.go
View file @
7aab6a88
...
...
@@ -10,14 +10,14 @@ import (
)
func
GetDashboardPermissionList
(
c
*
m
.
ReqContext
)
Response
{
dashI
d
:=
c
.
ParamsInt64
(
":dashboardId"
)
dashI
D
:=
c
.
ParamsInt64
(
":dashboardId"
)
_
,
rsp
:=
getDashboardHelper
(
c
.
OrgId
,
""
,
dashI
d
,
""
)
_
,
rsp
:=
getDashboardHelper
(
c
.
OrgId
,
""
,
dashI
D
,
""
)
if
rsp
!=
nil
{
return
rsp
}
g
:=
guardian
.
New
(
dashI
d
,
c
.
OrgId
,
c
.
SignedInUser
)
g
:=
guardian
.
New
(
dashI
D
,
c
.
OrgId
,
c
.
SignedInUser
)
if
canAdmin
,
err
:=
g
.
CanAdmin
();
err
!=
nil
||
!
canAdmin
{
return
dashboardGuardianResponse
(
err
)
...
...
@@ -38,25 +38,25 @@ func GetDashboardPermissionList(c *m.ReqContext) Response {
}
func
UpdateDashboardPermissions
(
c
*
m
.
ReqContext
,
apiCmd
dtos
.
UpdateDashboardAclCommand
)
Response
{
dashI
d
:=
c
.
ParamsInt64
(
":dashboardId"
)
dashI
D
:=
c
.
ParamsInt64
(
":dashboardId"
)
_
,
rsp
:=
getDashboardHelper
(
c
.
OrgId
,
""
,
dashI
d
,
""
)
_
,
rsp
:=
getDashboardHelper
(
c
.
OrgId
,
""
,
dashI
D
,
""
)
if
rsp
!=
nil
{
return
rsp
}
g
:=
guardian
.
New
(
dashI
d
,
c
.
OrgId
,
c
.
SignedInUser
)
g
:=
guardian
.
New
(
dashI
D
,
c
.
OrgId
,
c
.
SignedInUser
)
if
canAdmin
,
err
:=
g
.
CanAdmin
();
err
!=
nil
||
!
canAdmin
{
return
dashboardGuardianResponse
(
err
)
}
cmd
:=
m
.
UpdateDashboardAclCommand
{}
cmd
.
DashboardId
=
dashI
d
cmd
.
DashboardId
=
dashI
D
for
_
,
item
:=
range
apiCmd
.
Items
{
cmd
.
Items
=
append
(
cmd
.
Items
,
&
m
.
DashboardAcl
{
OrgId
:
c
.
OrgId
,
DashboardId
:
dashI
d
,
DashboardId
:
dashI
D
,
UserId
:
item
.
UserId
,
TeamId
:
item
.
TeamId
,
Role
:
item
.
Role
,
...
...
pkg/api/dashboard_snapshot.go
View file @
7aab6a88
...
...
@@ -106,9 +106,9 @@ func DeleteDashboardSnapshot(c *m.ReqContext) Response {
return
ApiError
(
404
,
"Failed to get dashboard snapshot"
,
nil
)
}
dashboard
:=
query
.
Result
.
Dashboard
dashboardI
d
:=
dashboard
.
Get
(
"id"
)
.
MustInt64
()
dashboardI
D
:=
dashboard
.
Get
(
"id"
)
.
MustInt64
()
guardian
:=
guardian
.
New
(
dashboardI
d
,
c
.
OrgId
,
c
.
SignedInUser
)
guardian
:=
guardian
.
New
(
dashboardI
D
,
c
.
OrgId
,
c
.
SignedInUser
)
canEdit
,
err
:=
guardian
.
CanEdit
()
if
err
!=
nil
{
return
ApiError
(
500
,
"Error while checking permissions for snapshot"
,
err
)
...
...
pkg/api/dashboard_test.go
View file @
7aab6a88
...
...
@@ -105,7 +105,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
403
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -165,7 +165,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
200
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -271,7 +271,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
403
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -329,7 +329,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
403
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -398,7 +398,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
200
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -468,7 +468,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
403
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -527,7 +527,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
200
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -594,7 +594,7 @@ func TestDashboardApiEndpoint(t *testing.T) {
})
loggedInUserScenarioWithRole
(
"When calling DELETE on"
,
"DELETE"
,
"/api/dashboards/uid/abcdefghi"
,
"/api/dashboards/uid/:uid"
,
role
,
func
(
sc
*
scenarioContext
)
{
CallDeleteDashboardByU
id
(
sc
)
CallDeleteDashboardByU
ID
(
sc
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
403
)
Convey
(
"Should lookup dashboard by uid"
,
func
()
{
...
...
@@ -837,12 +837,12 @@ func CallDeleteDashboard(sc *scenarioContext) {
sc
.
fakeReqWithParams
(
"DELETE"
,
sc
.
url
,
map
[
string
]
string
{})
.
exec
()
}
func
CallDeleteDashboardByU
id
(
sc
*
scenarioContext
)
{
func
CallDeleteDashboardByU
ID
(
sc
*
scenarioContext
)
{
bus
.
AddHandler
(
"test"
,
func
(
cmd
*
m
.
DeleteDashboardCommand
)
error
{
return
nil
})
sc
.
handlerFunc
=
DeleteDashboardByU
id
sc
.
handlerFunc
=
DeleteDashboardByU
ID
sc
.
fakeReqWithParams
(
"DELETE"
,
sc
.
url
,
map
[
string
]
string
{})
.
exec
()
}
...
...
pkg/api/dataproxy.go
View file @
7aab6a88
...
...
@@ -13,19 +13,19 @@ import (
const
HeaderNameNoBackendCache
=
"X-Grafana-NoCache"
func
(
hs
*
HttpServer
)
getDatasourceByI
d
(
id
int64
,
orgId
int64
,
nocache
bool
)
(
*
m
.
DataSource
,
error
)
{
func
(
hs
*
HttpServer
)
getDatasourceByI
D
(
id
int64
,
orgID
int64
,
nocache
bool
)
(
*
m
.
DataSource
,
error
)
{
cacheKey
:=
fmt
.
Sprintf
(
"ds-%d"
,
id
)
if
!
nocache
{
if
cached
,
found
:=
hs
.
cache
.
Get
(
cacheKey
);
found
{
ds
:=
cached
.
(
*
m
.
DataSource
)
if
ds
.
OrgId
==
orgI
d
{
if
ds
.
OrgId
==
orgI
D
{
return
ds
,
nil
}
}
}
query
:=
m
.
GetDataSourceByIdQuery
{
Id
:
id
,
OrgId
:
orgI
d
}
query
:=
m
.
GetDataSourceByIdQuery
{
Id
:
id
,
OrgId
:
orgI
D
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -39,7 +39,7 @@ func (hs *HttpServer) ProxyDataSourceRequest(c *m.ReqContext) {
nocache
:=
c
.
Req
.
Header
.
Get
(
HeaderNameNoBackendCache
)
==
"true"
ds
,
err
:=
hs
.
getDatasourceByI
d
(
c
.
ParamsInt64
(
":id"
),
c
.
OrgId
,
nocache
)
ds
,
err
:=
hs
.
getDatasourceByI
D
(
c
.
ParamsInt64
(
":id"
),
c
.
OrgId
,
nocache
)
if
err
!=
nil
{
c
.
JsonApiErr
(
500
,
"Unable to load datasource meta data"
,
err
)
...
...
pkg/api/datasources.go
View file @
7aab6a88
...
...
@@ -49,7 +49,7 @@ func GetDataSources(c *m.ReqContext) Response {
return
Json
(
200
,
&
result
)
}
func
GetDataSourceByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
GetDataSourceByI
D
(
c
*
m
.
ReqContext
)
Response
{
query
:=
m
.
GetDataSourceByIdQuery
{
Id
:
c
.
ParamsInt64
(
":id"
),
OrgId
:
c
.
OrgId
,
...
...
@@ -68,14 +68,14 @@ func GetDataSourceById(c *m.ReqContext) Response {
return
Json
(
200
,
&
dtos
)
}
func
DeleteDataSourceByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
DeleteDataSourceByI
D
(
c
*
m
.
ReqContext
)
Response
{
id
:=
c
.
ParamsInt64
(
":id"
)
if
id
<=
0
{
return
ApiError
(
400
,
"Missing valid datasource id"
,
nil
)
}
ds
,
err
:=
getRawDataSourceByI
d
(
id
,
c
.
OrgId
)
ds
,
err
:=
getRawDataSourceByI
D
(
id
,
c
.
OrgId
)
if
err
!=
nil
{
return
ApiError
(
400
,
"Failed to delete datasource"
,
nil
)
}
...
...
@@ -143,7 +143,7 @@ func UpdateDataSource(c *m.ReqContext, cmd m.UpdateDataSourceCommand) Response {
cmd
.
OrgId
=
c
.
OrgId
cmd
.
Id
=
c
.
ParamsInt64
(
":id"
)
err
:=
fillWithSecureJ
son
Data
(
&
cmd
)
err
:=
fillWithSecureJ
SON
Data
(
&
cmd
)
if
err
!=
nil
{
return
ApiError
(
500
,
"Failed to update datasource"
,
err
)
}
...
...
@@ -152,9 +152,8 @@ func UpdateDataSource(c *m.ReqContext, cmd m.UpdateDataSourceCommand) Response {
if
err
!=
nil
{
if
err
==
m
.
ErrDataSourceUpdatingOldVersion
{
return
ApiError
(
500
,
"Failed to update datasource. Reload new version and try again"
,
err
)
}
else
{
return
ApiError
(
500
,
"Failed to update datasource"
,
err
)
}
return
ApiError
(
500
,
"Failed to update datasource"
,
err
)
}
ds
:=
convertModelToDtos
(
cmd
.
Result
)
return
Json
(
200
,
util
.
DynMap
{
...
...
@@ -165,12 +164,12 @@ func UpdateDataSource(c *m.ReqContext, cmd m.UpdateDataSourceCommand) Response {
})
}
func
fillWithSecureJ
son
Data
(
cmd
*
m
.
UpdateDataSourceCommand
)
error
{
func
fillWithSecureJ
SON
Data
(
cmd
*
m
.
UpdateDataSourceCommand
)
error
{
if
len
(
cmd
.
SecureJsonData
)
==
0
{
return
nil
}
ds
,
err
:=
getRawDataSourceByI
d
(
cmd
.
Id
,
cmd
.
OrgId
)
ds
,
err
:=
getRawDataSourceByI
D
(
cmd
.
Id
,
cmd
.
OrgId
)
if
err
!=
nil
{
return
err
}
...
...
@@ -179,8 +178,8 @@ func fillWithSecureJsonData(cmd *m.UpdateDataSourceCommand) error {
return
m
.
ErrDatasourceIsReadOnly
}
secureJ
son
Data
:=
ds
.
SecureJsonData
.
Decrypt
()
for
k
,
v
:=
range
secureJ
son
Data
{
secureJ
SON
Data
:=
ds
.
SecureJsonData
.
Decrypt
()
for
k
,
v
:=
range
secureJ
SON
Data
{
if
_
,
ok
:=
cmd
.
SecureJsonData
[
k
];
!
ok
{
cmd
.
SecureJsonData
[
k
]
=
v
...
...
@@ -190,10 +189,10 @@ func fillWithSecureJsonData(cmd *m.UpdateDataSourceCommand) error {
return
nil
}
func
getRawDataSourceByI
d
(
id
int64
,
orgId
int64
)
(
*
m
.
DataSource
,
error
)
{
func
getRawDataSourceByI
D
(
id
int64
,
orgID
int64
)
(
*
m
.
DataSource
,
error
)
{
query
:=
m
.
GetDataSourceByIdQuery
{
Id
:
id
,
OrgId
:
orgI
d
,
OrgId
:
orgI
D
,
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
...
...
@@ -220,7 +219,7 @@ func GetDataSourceByName(c *m.ReqContext) Response {
}
// Get /api/datasources/id/:name
func
GetDataSourceI
d
ByName
(
c
*
m
.
ReqContext
)
Response
{
func
GetDataSourceI
D
ByName
(
c
*
m
.
ReqContext
)
Response
{
query
:=
m
.
GetDataSourceByNameQuery
{
Name
:
c
.
Params
(
":name"
),
OrgId
:
c
.
OrgId
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
...
...
pkg/api/folder.go
View file @
7aab6a88
...
...
@@ -31,7 +31,7 @@ func GetFolders(c *m.ReqContext) Response {
return
Json
(
200
,
result
)
}
func
GetFolderByU
id
(
c
*
m
.
ReqContext
)
Response
{
func
GetFolderByU
ID
(
c
*
m
.
ReqContext
)
Response
{
s
:=
dashboards
.
NewFolderService
(
c
.
OrgId
,
c
.
SignedInUser
)
folder
,
err
:=
s
.
GetFolderByUid
(
c
.
Params
(
":uid"
))
...
...
@@ -43,7 +43,7 @@ func GetFolderByUid(c *m.ReqContext) Response {
return
Json
(
200
,
toFolderDto
(
g
,
folder
))
}
func
GetFolderByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
GetFolderByI
D
(
c
*
m
.
ReqContext
)
Response
{
s
:=
dashboards
.
NewFolderService
(
c
.
OrgId
,
c
.
SignedInUser
)
folder
,
err
:=
s
.
GetFolderById
(
c
.
ParamsInt64
(
":id"
))
if
err
!=
nil
{
...
...
pkg/api/folder_test.go
View file @
7aab6a88
...
...
@@ -133,8 +133,8 @@ func TestFoldersApiEndpoint(t *testing.T) {
})
}
func
callGetFolderByU
id
(
sc
*
scenarioContext
)
{
sc
.
handlerFunc
=
GetFolderByU
id
func
callGetFolderByU
ID
(
sc
*
scenarioContext
)
{
sc
.
handlerFunc
=
GetFolderByU
ID
sc
.
fakeReqWithParams
(
"GET"
,
sc
.
url
,
map
[
string
]
string
{})
.
exec
()
}
...
...
pkg/api/http_server.go
View file @
7aab6a88
...
...
@@ -39,7 +39,7 @@ type HttpServer struct {
httpSrv
*
http
.
Server
}
func
NewH
ttp
Server
()
*
HttpServer
{
func
NewH
TTP
Server
()
*
HttpServer
{
return
&
HttpServer
{
log
:
log
.
New
(
"http.server"
),
cache
:
gocache
.
New
(
5
*
time
.
Minute
,
10
*
time
.
Minute
),
...
...
pkg/api/index.go
View file @
7aab6a88
...
...
@@ -32,13 +32,13 @@ func setIndexViewData(c *m.ReqContext) (*dtos.IndexViewData, error) {
locale
=
parts
[
0
]
}
appU
rl
:=
setting
.
AppUrl
appSubU
rl
:=
setting
.
AppSubUrl
appU
RL
:=
setting
.
AppUrl
appSubU
RL
:=
setting
.
AppSubUrl
// special case when doing localhost call from phantomjs
if
c
.
IsRenderCall
{
appU
rl
=
fmt
.
Sprintf
(
"%s://localhost:%s"
,
setting
.
Protocol
,
setting
.
HttpPort
)
appSubU
rl
=
""
appU
RL
=
fmt
.
Sprintf
(
"%s://localhost:%s"
,
setting
.
Protocol
,
setting
.
HttpPort
)
appSubU
RL
=
""
settings
[
"appSubUrl"
]
=
""
}
...
...
@@ -62,8 +62,8 @@ func setIndexViewData(c *m.ReqContext) (*dtos.IndexViewData, error) {
},
Settings
:
settings
,
Theme
:
prefs
.
Theme
,
AppUrl
:
appU
rl
,
AppSubUrl
:
appSubU
rl
,
AppUrl
:
appU
RL
,
AppSubUrl
:
appSubU
RL
,
GoogleAnalyticsId
:
setting
.
GoogleAnalyticsId
,
GoogleTagManagerId
:
setting
.
GoogleTagManagerId
,
BuildVersion
:
setting
.
BuildVersion
,
...
...
@@ -80,8 +80,8 @@ func setIndexViewData(c *m.ReqContext) (*dtos.IndexViewData, error) {
data
.
User
.
Name
=
data
.
User
.
Login
}
themeU
rl
Param
:=
c
.
Query
(
"theme"
)
if
themeU
rl
Param
==
"light"
{
themeU
RL
Param
:=
c
.
Query
(
"theme"
)
if
themeU
RL
Param
==
"light"
{
data
.
User
.
LightTheme
=
true
data
.
Theme
=
"light"
}
...
...
@@ -299,12 +299,12 @@ func setIndexViewData(c *m.ReqContext) (*dtos.IndexViewData, error) {
}
func
Index
(
c
*
m
.
ReqContext
)
{
if
data
,
err
:=
setIndexViewData
(
c
);
err
!=
nil
{
data
,
err
:=
setIndexViewData
(
c
)
if
err
!=
nil
{
c
.
Handle
(
500
,
"Failed to get settings"
,
err
)
return
}
else
{
c
.
HTML
(
200
,
"index"
,
data
)
}
c
.
HTML
(
200
,
"index"
,
data
)
}
func
NotFoundHandler
(
c
*
m
.
ReqContext
)
{
...
...
@@ -313,10 +313,11 @@ func NotFoundHandler(c *m.ReqContext) {
return
}
if
data
,
err
:=
setIndexViewData
(
c
);
err
!=
nil
{
data
,
err
:=
setIndexViewData
(
c
)
if
err
!=
nil
{
c
.
Handle
(
500
,
"Failed to get settings"
,
err
)
return
}
else
{
c
.
HTML
(
404
,
"index"
,
data
)
}
c
.
HTML
(
404
,
"index"
,
data
)
}
pkg/api/login.go
View file @
7aab6a88
...
...
@@ -14,7 +14,7 @@ import (
)
const
(
V
IEW_INDEX
=
"index"
V
iewIndex
=
"index"
)
func
LoginView
(
c
*
m
.
ReqContext
)
{
...
...
@@ -40,7 +40,7 @@ func LoginView(c *m.ReqContext) {
}
if
!
tryLoginUsingRememberCookie
(
c
)
{
c
.
HTML
(
200
,
V
IEW_INDEX
,
viewData
)
c
.
HTML
(
200
,
V
iewIndex
,
viewData
)
return
}
...
...
@@ -87,7 +87,7 @@ func tryLoginUsingRememberCookie(c *m.ReqContext) bool {
return
true
}
func
LoginA
pi
Ping
(
c
*
m
.
ReqContext
)
{
func
LoginA
PI
Ping
(
c
*
m
.
ReqContext
)
{
if
!
tryLoginUsingRememberCookie
(
c
)
{
c
.
JsonApiErr
(
401
,
"Unauthorized"
,
nil
)
return
...
...
pkg/api/metrics.go
View file @
7aab6a88
...
...
@@ -20,12 +20,12 @@ func QueryMetrics(c *m.ReqContext, reqDto dtos.MetricRequest) Response {
return
ApiError
(
400
,
"No queries found in query"
,
nil
)
}
dsI
d
,
err
:=
reqDto
.
Queries
[
0
]
.
Get
(
"datasourceId"
)
.
Int64
()
dsI
D
,
err
:=
reqDto
.
Queries
[
0
]
.
Get
(
"datasourceId"
)
.
Int64
()
if
err
!=
nil
{
return
ApiError
(
400
,
"Query missing datasourceId"
,
nil
)
}
dsQuery
:=
m
.
GetDataSourceByIdQuery
{
Id
:
dsI
d
,
OrgId
:
c
.
OrgId
}
dsQuery
:=
m
.
GetDataSourceByIdQuery
{
Id
:
dsI
D
,
OrgId
:
c
.
OrgId
}
if
err
:=
bus
.
Dispatch
(
&
dsQuery
);
err
!=
nil
{
return
ApiError
(
500
,
"failed to fetch data source"
,
err
)
}
...
...
@@ -82,7 +82,7 @@ func GenerateError(c *m.ReqContext) Response {
}
// GET /api/tsdb/testdata/gensql
func
GenerateS
ql
TestData
(
c
*
m
.
ReqContext
)
Response
{
func
GenerateS
QL
TestData
(
c
*
m
.
ReqContext
)
Response
{
if
err
:=
bus
.
Dispatch
(
&
m
.
InsertSqlTestDataCommand
{});
err
!=
nil
{
return
ApiError
(
500
,
"Failed to insert test data"
,
err
)
}
...
...
pkg/api/org.go
View file @
7aab6a88
...
...
@@ -15,7 +15,7 @@ func GetOrgCurrent(c *m.ReqContext) Response {
}
// GET /api/orgs/:orgId
func
GetOrgByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
GetOrgByI
D
(
c
*
m
.
ReqContext
)
Response
{
return
getOrgHelper
(
c
.
ParamsInt64
(
":orgId"
))
}
...
...
@@ -106,8 +106,8 @@ func UpdateOrg(c *m.ReqContext, form dtos.UpdateOrgForm) Response {
return
updateOrgHelper
(
form
,
c
.
ParamsInt64
(
":orgId"
))
}
func
updateOrgHelper
(
form
dtos
.
UpdateOrgForm
,
orgI
d
int64
)
Response
{
cmd
:=
m
.
UpdateOrgCommand
{
Name
:
form
.
Name
,
OrgId
:
orgI
d
}
func
updateOrgHelper
(
form
dtos
.
UpdateOrgForm
,
orgI
D
int64
)
Response
{
cmd
:=
m
.
UpdateOrgCommand
{
Name
:
form
.
Name
,
OrgId
:
orgI
D
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
if
err
==
m
.
ErrOrgNameTaken
{
return
ApiError
(
400
,
"Organization name taken"
,
err
)
...
...
@@ -128,9 +128,9 @@ func UpdateOrgAddress(c *m.ReqContext, form dtos.UpdateOrgAddressForm) Response
return
updateOrgAddressHelper
(
form
,
c
.
ParamsInt64
(
":orgId"
))
}
func
updateOrgAddressHelper
(
form
dtos
.
UpdateOrgAddressForm
,
orgI
d
int64
)
Response
{
func
updateOrgAddressHelper
(
form
dtos
.
UpdateOrgAddressForm
,
orgI
D
int64
)
Response
{
cmd
:=
m
.
UpdateOrgAddressCommand
{
OrgId
:
orgI
d
,
OrgId
:
orgI
D
,
Address
:
m
.
Address
{
Address1
:
form
.
Address1
,
Address2
:
form
.
Address2
,
...
...
@@ -149,7 +149,7 @@ func updateOrgAddressHelper(form dtos.UpdateOrgAddressForm, orgId int64) Respons
}
// GET /api/orgs/:orgId
func
DeleteOrgByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
DeleteOrgByI
D
(
c
*
m
.
ReqContext
)
Response
{
if
err
:=
bus
.
Dispatch
(
&
m
.
DeleteOrgCommand
{
Id
:
c
.
ParamsInt64
(
":orgId"
)});
err
!=
nil
{
if
err
==
m
.
ErrOrgNotFound
{
return
ApiError
(
404
,
"Failed to delete organization. ID not found"
,
nil
)
...
...
pkg/api/org_invite.go
View file @
7aab6a88
...
...
@@ -96,26 +96,25 @@ func inviteExistingUserToOrg(c *m.ReqContext, user *m.User, inviteDto *dtos.AddI
return
ApiError
(
412
,
fmt
.
Sprintf
(
"User %s is already added to organization"
,
inviteDto
.
LoginOrEmail
),
err
)
}
return
ApiError
(
500
,
"Error while trying to create org user"
,
err
)
}
else
{
}
if
inviteDto
.
SendEmail
&&
util
.
IsEmail
(
user
.
Email
)
{
emailCmd
:=
m
.
SendEmailCommand
{
To
:
[]
string
{
user
.
Email
},
Template
:
"invited_to_org.html"
,
Data
:
map
[
string
]
interface
{}{
"Name"
:
user
.
NameOrFallback
(),
"OrgName"
:
c
.
OrgName
,
"InvitedBy"
:
util
.
StringsFallback3
(
c
.
Name
,
c
.
Email
,
c
.
Login
),
},
}
if
err
:=
bus
.
Dispatch
(
&
emailCmd
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to send email invited_to_org"
,
err
)
}
if
inviteDto
.
SendEmail
&&
util
.
IsEmail
(
user
.
Email
)
{
emailCmd
:=
m
.
SendEmailCommand
{
To
:
[]
string
{
user
.
Email
},
Template
:
"invited_to_org.html"
,
Data
:
map
[
string
]
interface
{}{
"Name"
:
user
.
NameOrFallback
(),
"OrgName"
:
c
.
OrgName
,
"InvitedBy"
:
util
.
StringsFallback3
(
c
.
Name
,
c
.
Email
,
c
.
Login
),
},
}
return
ApiSuccess
(
fmt
.
Sprintf
(
"Existing Grafana user %s added to org %s"
,
user
.
NameOrFallback
(),
c
.
OrgName
))
if
err
:=
bus
.
Dispatch
(
&
emailCmd
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to send email invited_to_org"
,
err
)
}
}
return
ApiSuccess
(
fmt
.
Sprintf
(
"Existing Grafana user %s added to org %s"
,
user
.
NameOrFallback
(),
c
.
OrgName
))
}
func
RevokeInvite
(
c
*
m
.
ReqContext
)
Response
{
...
...
pkg/api/org_users.go
View file @
7aab6a88
...
...
@@ -53,9 +53,9 @@ func GetOrgUsers(c *m.ReqContext) Response {
return
getOrgUsersHelper
(
c
.
ParamsInt64
(
":orgId"
),
""
,
0
)
}
func
getOrgUsersHelper
(
orgI
d
int64
,
query
string
,
limit
int
)
Response
{
func
getOrgUsersHelper
(
orgI
D
int64
,
query
string
,
limit
int
)
Response
{
q
:=
m
.
GetOrgUsersQuery
{
OrgId
:
orgI
d
,
OrgId
:
orgI
D
,
Query
:
query
,
Limit
:
limit
,
}
...
...
@@ -102,19 +102,19 @@ func updateOrgUserHelper(cmd m.UpdateOrgUserCommand) Response {
// DELETE /api/org/users/:userId
func
RemoveOrgUserForCurrentOrg
(
c
*
m
.
ReqContext
)
Response
{
userI
d
:=
c
.
ParamsInt64
(
":userId"
)
return
removeOrgUserHelper
(
c
.
OrgId
,
userI
d
)
userI
D
:=
c
.
ParamsInt64
(
":userId"
)
return
removeOrgUserHelper
(
c
.
OrgId
,
userI
D
)
}
// DELETE /api/orgs/:orgId/users/:userId
func
RemoveOrgUser
(
c
*
m
.
ReqContext
)
Response
{
userI
d
:=
c
.
ParamsInt64
(
":userId"
)
orgI
d
:=
c
.
ParamsInt64
(
":orgId"
)
return
removeOrgUserHelper
(
orgI
d
,
userId
)
userI
D
:=
c
.
ParamsInt64
(
":userId"
)
orgI
D
:=
c
.
ParamsInt64
(
":orgId"
)
return
removeOrgUserHelper
(
orgI
D
,
userID
)
}
func
removeOrgUserHelper
(
orgI
d
int64
,
userId
int64
)
Response
{
cmd
:=
m
.
RemoveOrgUserCommand
{
OrgId
:
orgI
d
,
UserId
:
userId
}
func
removeOrgUserHelper
(
orgI
D
int64
,
userID
int64
)
Response
{
cmd
:=
m
.
RemoveOrgUserCommand
{
OrgId
:
orgI
D
,
UserId
:
userID
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
if
err
==
m
.
ErrLastOrgAdmin
{
...
...
pkg/api/playlist.go
View file @
7aab6a88
...
...
@@ -127,9 +127,9 @@ func GetPlaylistItems(c *m.ReqContext) Response {
}
func
GetPlaylistDashboards
(
c
*
m
.
ReqContext
)
Response
{
playlistI
d
:=
c
.
ParamsInt64
(
":id"
)
playlistI
D
:=
c
.
ParamsInt64
(
":id"
)
playlists
,
err
:=
LoadPlaylistDashboards
(
c
.
OrgId
,
c
.
SignedInUser
,
playlistI
d
)
playlists
,
err
:=
LoadPlaylistDashboards
(
c
.
OrgId
,
c
.
SignedInUser
,
playlistI
D
)
if
err
!=
nil
{
return
ApiError
(
500
,
"Could not load dashboards"
,
err
)
}
...
...
pkg/api/playlist_play.go
View file @
7aab6a88
...
...
@@ -34,29 +34,27 @@ func populateDashboardsById(dashboardByIds []int64, dashboardIdOrder map[int64]i
return
result
,
nil
}
func
populateDashboardsByTag
(
orgI
d
int64
,
signedInUser
*
m
.
SignedInUser
,
dashboardByTag
[]
string
,
dashboardTagOrder
map
[
string
]
int
)
dtos
.
PlaylistDashboardsSlice
{
func
populateDashboardsByTag
(
orgI
D
int64
,
signedInUser
*
m
.
SignedInUser
,
dashboardByTag
[]
string
,
dashboardTagOrder
map
[
string
]
int
)
dtos
.
PlaylistDashboardsSlice
{
result
:=
make
(
dtos
.
PlaylistDashboardsSlice
,
0
)
if
len
(
dashboardByTag
)
>
0
{
for
_
,
tag
:=
range
dashboardByTag
{
searchQuery
:=
search
.
Query
{
Title
:
""
,
Tags
:
[]
string
{
tag
},
SignedInUser
:
signedInUser
,
Limit
:
100
,
IsStarred
:
false
,
OrgId
:
orgId
,
}
for
_
,
tag
:=
range
dashboardByTag
{
searchQuery
:=
search
.
Query
{
Title
:
""
,
Tags
:
[]
string
{
tag
},
SignedInUser
:
signedInUser
,
Limit
:
100
,
IsStarred
:
false
,
OrgId
:
orgID
,
}
if
err
:=
bus
.
Dispatch
(
&
searchQuery
);
err
==
nil
{
for
_
,
item
:=
range
searchQuery
.
Result
{
result
=
append
(
result
,
dtos
.
PlaylistDashboard
{
Id
:
item
.
Id
,
Title
:
item
.
Title
,
Uri
:
item
.
Uri
,
Order
:
dashboardTagOrder
[
tag
],
})
}
if
err
:=
bus
.
Dispatch
(
&
searchQuery
);
err
==
nil
{
for
_
,
item
:=
range
searchQuery
.
Result
{
result
=
append
(
result
,
dtos
.
PlaylistDashboard
{
Id
:
item
.
Id
,
Title
:
item
.
Title
,
Uri
:
item
.
Uri
,
Order
:
dashboardTagOrder
[
tag
],
})
}
}
}
...
...
@@ -64,19 +62,19 @@ func populateDashboardsByTag(orgId int64, signedInUser *m.SignedInUser, dashboar
return
result
}
func
LoadPlaylistDashboards
(
orgI
d
int64
,
signedInUser
*
m
.
SignedInUser
,
playlistId
int64
)
(
dtos
.
PlaylistDashboardsSlice
,
error
)
{
playlistItems
,
_
:=
LoadPlaylistItems
(
playlistI
d
)
func
LoadPlaylistDashboards
(
orgI
D
int64
,
signedInUser
*
m
.
SignedInUser
,
playlistID
int64
)
(
dtos
.
PlaylistDashboardsSlice
,
error
)
{
playlistItems
,
_
:=
LoadPlaylistItems
(
playlistI
D
)
dashboardByI
d
s
:=
make
([]
int64
,
0
)
dashboardByI
D
s
:=
make
([]
int64
,
0
)
dashboardByTag
:=
make
([]
string
,
0
)
dashboardI
d
Order
:=
make
(
map
[
int64
]
int
)
dashboardI
D
Order
:=
make
(
map
[
int64
]
int
)
dashboardTagOrder
:=
make
(
map
[
string
]
int
)
for
_
,
i
:=
range
playlistItems
{
if
i
.
Type
==
"dashboard_by_id"
{
dashboardI
d
,
_
:=
strconv
.
ParseInt
(
i
.
Value
,
10
,
64
)
dashboardByI
ds
=
append
(
dashboardByIds
,
dashboardId
)
dashboardI
dOrder
[
dashboardId
]
=
i
.
Order
dashboardI
D
,
_
:=
strconv
.
ParseInt
(
i
.
Value
,
10
,
64
)
dashboardByI
Ds
=
append
(
dashboardByIDs
,
dashboardID
)
dashboardI
DOrder
[
dashboardID
]
=
i
.
Order
}
if
i
.
Type
==
"dashboard_by_tag"
{
...
...
@@ -87,9 +85,9 @@ func LoadPlaylistDashboards(orgId int64, signedInUser *m.SignedInUser, playlistI
result
:=
make
(
dtos
.
PlaylistDashboardsSlice
,
0
)
var
k
,
_
=
populateDashboardsById
(
dashboardByI
ds
,
dashboardId
Order
)
var
k
,
_
=
populateDashboardsById
(
dashboardByI
Ds
,
dashboardID
Order
)
result
=
append
(
result
,
k
...
)
result
=
append
(
result
,
populateDashboardsByTag
(
orgI
d
,
signedInUser
,
dashboardByTag
,
dashboardTagOrder
)
...
)
result
=
append
(
result
,
populateDashboardsByTag
(
orgI
D
,
signedInUser
,
dashboardByTag
,
dashboardTagOrder
)
...
)
sort
.
Sort
(
result
)
return
result
,
nil
...
...
pkg/api/plugins.go
View file @
7aab6a88
...
...
@@ -78,48 +78,48 @@ func GetPluginList(c *m.ReqContext) Response {
return
Json
(
200
,
result
)
}
func
GetPluginSettingByI
d
(
c
*
m
.
ReqContext
)
Response
{
pluginI
d
:=
c
.
Params
(
":pluginId"
)
func
GetPluginSettingByI
D
(
c
*
m
.
ReqContext
)
Response
{
pluginI
D
:=
c
.
Params
(
":pluginId"
)
if
def
,
exists
:=
plugins
.
Plugins
[
pluginId
];
!
exists
{
def
,
exists
:=
plugins
.
Plugins
[
pluginID
]
if
!
exists
{
return
ApiError
(
404
,
"Plugin not found, no installed plugin with that id"
,
nil
)
}
else
{
}
dto
:=
&
dtos
.
PluginSetting
{
Type
:
def
.
Type
,
Id
:
def
.
Id
,
Name
:
def
.
Name
,
Info
:
&
def
.
Info
,
Dependencies
:
&
def
.
Dependencies
,
Includes
:
def
.
Includes
,
BaseUrl
:
def
.
BaseUrl
,
Module
:
def
.
Module
,
DefaultNavUrl
:
def
.
DefaultNavUrl
,
LatestVersion
:
def
.
GrafanaNetVersion
,
HasUpdate
:
def
.
GrafanaNetHasUpdate
,
State
:
def
.
State
,
}
dto
:=
&
dtos
.
PluginSetting
{
Type
:
def
.
Type
,
Id
:
def
.
Id
,
Name
:
def
.
Name
,
Info
:
&
def
.
Info
,
Dependencies
:
&
def
.
Dependencies
,
Includes
:
def
.
Includes
,
BaseUrl
:
def
.
BaseUrl
,
Module
:
def
.
Module
,
DefaultNavUrl
:
def
.
DefaultNavUrl
,
LatestVersion
:
def
.
GrafanaNetVersion
,
HasUpdate
:
def
.
GrafanaNetHasUpdate
,
State
:
def
.
State
,
}
query
:=
m
.
GetPluginSettingByIdQuery
{
PluginId
:
pluginId
,
OrgId
:
c
.
OrgId
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
if
err
!=
m
.
ErrPluginSettingNotFound
{
return
ApiError
(
500
,
"Failed to get login settings"
,
nil
)
}
}
else
{
dto
.
Enabled
=
query
.
Result
.
Enabled
dto
.
Pinned
=
query
.
Result
.
Pinned
dto
.
JsonData
=
query
.
Result
.
JsonData
query
:=
m
.
GetPluginSettingByIdQuery
{
PluginId
:
pluginID
,
OrgId
:
c
.
OrgId
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
if
err
!=
m
.
ErrPluginSettingNotFound
{
return
ApiError
(
500
,
"Failed to get login settings"
,
nil
)
}
return
Json
(
200
,
dto
)
}
else
{
dto
.
Enabled
=
query
.
Result
.
Enabled
dto
.
Pinned
=
query
.
Result
.
Pinned
dto
.
JsonData
=
query
.
Result
.
JsonData
}
return
Json
(
200
,
dto
)
}
func
UpdatePluginSetting
(
c
*
m
.
ReqContext
,
cmd
m
.
UpdatePluginSettingCmd
)
Response
{
pluginI
d
:=
c
.
Params
(
":pluginId"
)
pluginI
D
:=
c
.
Params
(
":pluginId"
)
cmd
.
OrgId
=
c
.
OrgId
cmd
.
PluginId
=
pluginI
d
cmd
.
PluginId
=
pluginI
D
if
_
,
ok
:=
plugins
.
Apps
[
cmd
.
PluginId
];
!
ok
{
return
ApiError
(
404
,
"Plugin not installed."
,
nil
)
...
...
@@ -133,34 +133,36 @@ func UpdatePluginSetting(c *m.ReqContext, cmd m.UpdatePluginSettingCmd) Response
}
func
GetPluginDashboards
(
c
*
m
.
ReqContext
)
Response
{
pluginI
d
:=
c
.
Params
(
":pluginId"
)
pluginI
D
:=
c
.
Params
(
":pluginId"
)
if
list
,
err
:=
plugins
.
GetPluginDashboards
(
c
.
OrgId
,
pluginId
);
err
!=
nil
{
list
,
err
:=
plugins
.
GetPluginDashboards
(
c
.
OrgId
,
pluginID
)
if
err
!=
nil
{
if
notfound
,
ok
:=
err
.
(
plugins
.
PluginNotFoundError
);
ok
{
return
ApiError
(
404
,
notfound
.
Error
(),
nil
)
}
return
ApiError
(
500
,
"Failed to get plugin dashboards"
,
err
)
}
else
{
return
Json
(
200
,
list
)
}
return
Json
(
200
,
list
)
}
func
GetPluginMarkdown
(
c
*
m
.
ReqContext
)
Response
{
pluginI
d
:=
c
.
Params
(
":pluginId"
)
pluginI
D
:=
c
.
Params
(
":pluginId"
)
name
:=
c
.
Params
(
":name"
)
if
content
,
err
:=
plugins
.
GetPluginMarkdown
(
pluginId
,
name
);
err
!=
nil
{
content
,
err
:=
plugins
.
GetPluginMarkdown
(
pluginID
,
name
)
if
err
!=
nil
{
if
notfound
,
ok
:=
err
.
(
plugins
.
PluginNotFoundError
);
ok
{
return
ApiError
(
404
,
notfound
.
Error
(),
nil
)
}
return
ApiError
(
500
,
"Could not get markdown file"
,
err
)
}
else
{
resp
:=
Respond
(
200
,
content
)
resp
.
Header
(
"Content-Type"
,
"text/plain; charset=utf-8"
)
return
resp
}
resp
:=
Respond
(
200
,
content
)
resp
.
Header
(
"Content-Type"
,
"text/plain; charset=utf-8"
)
return
resp
}
func
ImportDashboard
(
c
*
m
.
ReqContext
,
apiCmd
dtos
.
ImportDashboardCommand
)
Response
{
...
...
pkg/api/preferences.go
View file @
7aab6a88
...
...
@@ -24,8 +24,8 @@ func GetUserPreferences(c *m.ReqContext) Response {
return
getPreferencesFor
(
c
.
OrgId
,
c
.
UserId
)
}
func
getPreferencesFor
(
orgI
d
int64
,
userId
int64
)
Response
{
prefsQuery
:=
m
.
GetPreferencesQuery
{
UserId
:
userI
d
,
OrgId
:
orgId
}
func
getPreferencesFor
(
orgI
D
int64
,
userID
int64
)
Response
{
prefsQuery
:=
m
.
GetPreferencesQuery
{
UserId
:
userI
D
,
OrgId
:
orgID
}
if
err
:=
bus
.
Dispatch
(
&
prefsQuery
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to get preferences"
,
err
)
...
...
@@ -45,10 +45,10 @@ func UpdateUserPreferences(c *m.ReqContext, dtoCmd dtos.UpdatePrefsCmd) Response
return
updatePreferencesFor
(
c
.
OrgId
,
c
.
UserId
,
&
dtoCmd
)
}
func
updatePreferencesFor
(
orgI
d
int64
,
userId
int64
,
dtoCmd
*
dtos
.
UpdatePrefsCmd
)
Response
{
func
updatePreferencesFor
(
orgI
D
int64
,
userID
int64
,
dtoCmd
*
dtos
.
UpdatePrefsCmd
)
Response
{
saveCmd
:=
m
.
SavePreferencesCommand
{
UserId
:
userI
d
,
OrgId
:
orgI
d
,
UserId
:
userI
D
,
OrgId
:
orgI
D
,
Theme
:
dtoCmd
.
Theme
,
Timezone
:
dtoCmd
.
Timezone
,
HomeDashboardId
:
dtoCmd
.
HomeDashboardId
,
...
...
pkg/api/search.go
View file @
7aab6a88
...
...
@@ -25,19 +25,19 @@ func Search(c *m.ReqContext) {
permission
=
m
.
PERMISSION_EDIT
}
db
id
s
:=
make
([]
int64
,
0
)
db
ID
s
:=
make
([]
int64
,
0
)
for
_
,
id
:=
range
c
.
QueryStrings
(
"dashboardIds"
)
{
dashboardI
d
,
err
:=
strconv
.
ParseInt
(
id
,
10
,
64
)
dashboardI
D
,
err
:=
strconv
.
ParseInt
(
id
,
10
,
64
)
if
err
==
nil
{
db
ids
=
append
(
dbids
,
dashboardId
)
db
IDs
=
append
(
dbIDs
,
dashboardID
)
}
}
folderI
d
s
:=
make
([]
int64
,
0
)
folderI
D
s
:=
make
([]
int64
,
0
)
for
_
,
id
:=
range
c
.
QueryStrings
(
"folderIds"
)
{
folderI
d
,
err
:=
strconv
.
ParseInt
(
id
,
10
,
64
)
folderI
D
,
err
:=
strconv
.
ParseInt
(
id
,
10
,
64
)
if
err
==
nil
{
folderI
ds
=
append
(
folderIds
,
folderId
)
folderI
Ds
=
append
(
folderIDs
,
folderID
)
}
}
...
...
@@ -48,9 +48,9 @@ func Search(c *m.ReqContext) {
Limit
:
limit
,
IsStarred
:
starred
==
"true"
,
OrgId
:
c
.
OrgId
,
DashboardIds
:
db
id
s
,
DashboardIds
:
db
ID
s
,
Type
:
dashboardType
,
FolderIds
:
folderI
d
s
,
FolderIds
:
folderI
D
s
,
Permission
:
permission
,
}
...
...
pkg/api/team.go
View file @
7aab6a88
...
...
@@ -38,7 +38,7 @@ func UpdateTeam(c *m.ReqContext, cmd m.UpdateTeamCommand) Response {
}
// DELETE /api/teams/:teamId
func
DeleteTeamByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
DeleteTeamByI
D
(
c
*
m
.
ReqContext
)
Response
{
if
err
:=
bus
.
Dispatch
(
&
m
.
DeleteTeamCommand
{
OrgId
:
c
.
OrgId
,
Id
:
c
.
ParamsInt64
(
":teamId"
)});
err
!=
nil
{
if
err
==
m
.
ErrTeamNotFound
{
return
ApiError
(
404
,
"Failed to delete Team. ID not found"
,
nil
)
...
...
@@ -82,7 +82,7 @@ func SearchTeams(c *m.ReqContext) Response {
}
// GET /api/teams/:teamId
func
GetTeamByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
GetTeamByI
D
(
c
*
m
.
ReqContext
)
Response
{
query
:=
m
.
GetTeamByIdQuery
{
OrgId
:
c
.
OrgId
,
Id
:
c
.
ParamsInt64
(
":teamId"
)}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
...
...
pkg/api/user.go
View file @
7aab6a88
...
...
@@ -14,12 +14,12 @@ func GetSignedInUser(c *m.ReqContext) Response {
}
// GET /api/users/:id
func
GetUserByI
d
(
c
*
m
.
ReqContext
)
Response
{
func
GetUserByI
D
(
c
*
m
.
ReqContext
)
Response
{
return
getUserUserProfile
(
c
.
ParamsInt64
(
":id"
))
}
func
getUserUserProfile
(
userI
d
int64
)
Response
{
query
:=
m
.
GetUserProfileQuery
{
UserId
:
userI
d
}
func
getUserUserProfile
(
userI
D
int64
)
Response
{
query
:=
m
.
GetUserProfileQuery
{
UserId
:
userI
D
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
if
err
==
m
.
ErrUserNotFound
{
...
...
@@ -75,14 +75,14 @@ func UpdateUser(c *m.ReqContext, cmd m.UpdateUserCommand) Response {
//POST /api/users/:id/using/:orgId
func
UpdateUserActiveOrg
(
c
*
m
.
ReqContext
)
Response
{
userI
d
:=
c
.
ParamsInt64
(
":id"
)
orgI
d
:=
c
.
ParamsInt64
(
":orgId"
)
userI
D
:=
c
.
ParamsInt64
(
":id"
)
orgI
D
:=
c
.
ParamsInt64
(
":orgId"
)
if
!
validateUsingOrg
(
userI
d
,
orgId
)
{
if
!
validateUsingOrg
(
userI
D
,
orgID
)
{
return
ApiError
(
401
,
"Not a valid organization"
,
nil
)
}
cmd
:=
m
.
SetUsingOrgCommand
{
UserId
:
userI
d
,
OrgId
:
orgId
}
cmd
:=
m
.
SetUsingOrgCommand
{
UserId
:
userI
D
,
OrgId
:
orgID
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to change active organization"
,
err
)
...
...
@@ -116,8 +116,8 @@ func GetUserOrgList(c *m.ReqContext) Response {
return
getUserOrgList
(
c
.
ParamsInt64
(
":id"
))
}
func
getUserOrgList
(
userI
d
int64
)
Response
{
query
:=
m
.
GetUserOrgListQuery
{
UserId
:
userI
d
}
func
getUserOrgList
(
userI
D
int64
)
Response
{
query
:=
m
.
GetUserOrgListQuery
{
UserId
:
userI
D
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to get user organizations"
,
err
)
...
...
@@ -126,8 +126,8 @@ func getUserOrgList(userId int64) Response {
return
Json
(
200
,
query
.
Result
)
}
func
validateUsingOrg
(
userI
d
int64
,
orgId
int64
)
bool
{
query
:=
m
.
GetUserOrgListQuery
{
UserId
:
userI
d
}
func
validateUsingOrg
(
userI
D
int64
,
orgID
int64
)
bool
{
query
:=
m
.
GetUserOrgListQuery
{
UserId
:
userI
D
}
if
err
:=
bus
.
Dispatch
(
&
query
);
err
!=
nil
{
return
false
...
...
@@ -136,7 +136,7 @@ func validateUsingOrg(userId int64, orgId int64) bool {
// validate that the org id in the list
valid
:=
false
for
_
,
other
:=
range
query
.
Result
{
if
other
.
OrgId
==
orgI
d
{
if
other
.
OrgId
==
orgI
D
{
valid
=
true
}
}
...
...
@@ -146,13 +146,13 @@ func validateUsingOrg(userId int64, orgId int64) bool {
// POST /api/user/using/:id
func
UserSetUsingOrg
(
c
*
m
.
ReqContext
)
Response
{
orgI
d
:=
c
.
ParamsInt64
(
":id"
)
orgI
D
:=
c
.
ParamsInt64
(
":id"
)
if
!
validateUsingOrg
(
c
.
UserId
,
orgI
d
)
{
if
!
validateUsingOrg
(
c
.
UserId
,
orgI
D
)
{
return
ApiError
(
401
,
"Not a valid organization"
,
nil
)
}
cmd
:=
m
.
SetUsingOrgCommand
{
UserId
:
c
.
UserId
,
OrgId
:
orgI
d
}
cmd
:=
m
.
SetUsingOrgCommand
{
UserId
:
c
.
UserId
,
OrgId
:
orgI
D
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
return
ApiError
(
500
,
"Failed to change active organization"
,
err
)
...
...
@@ -163,13 +163,13 @@ func UserSetUsingOrg(c *m.ReqContext) Response {
// GET /profile/switch-org/:id
func
ChangeActiveOrgAndRedirectToHome
(
c
*
m
.
ReqContext
)
{
orgI
d
:=
c
.
ParamsInt64
(
":id"
)
orgI
D
:=
c
.
ParamsInt64
(
":id"
)
if
!
validateUsingOrg
(
c
.
UserId
,
orgI
d
)
{
if
!
validateUsingOrg
(
c
.
UserId
,
orgI
D
)
{
NotFoundHandler
(
c
)
}
cmd
:=
m
.
SetUsingOrgCommand
{
UserId
:
c
.
UserId
,
OrgId
:
orgI
d
}
cmd
:=
m
.
SetUsingOrgCommand
{
UserId
:
c
.
UserId
,
OrgId
:
orgI
D
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
NotFoundHandler
(
c
)
...
...
pkg/cmd/grafana-server/server.go
View file @
7aab6a88
...
...
@@ -120,7 +120,7 @@ func (g *GrafanaServerImpl) initLogging() {
}
func
(
g
*
GrafanaServerImpl
)
startHttpServer
()
error
{
g
.
httpServer
=
api
.
NewH
ttp
Server
()
g
.
httpServer
=
api
.
NewH
TTP
Server
()
err
:=
g
.
httpServer
.
Start
(
g
.
context
)
...
...
pkg/middleware/auth.go
View file @
7aab6a88
...
...
@@ -17,10 +17,10 @@ type AuthOptions struct {
}
func
getRequestUserId
(
c
*
m
.
ReqContext
)
int64
{
userI
d
:=
c
.
Session
.
Get
(
session
.
SESS_KEY_USERID
)
userI
D
:=
c
.
Session
.
Get
(
session
.
SESS_KEY_USERID
)
if
userI
d
!=
nil
{
return
userI
d
.
(
int64
)
if
userI
D
!=
nil
{
return
userI
D
.
(
int64
)
}
return
0
...
...
pkg/middleware/dashboard_redirect.go
View file @
7aab6a88
...
...
@@ -20,7 +20,7 @@ func getDashboardUrlBySlug(orgId int64, slug string) (string, error) {
return
m
.
GetDashboardUrl
(
query
.
Result
.
Uid
,
query
.
Result
.
Slug
),
nil
}
func
RedirectFromLegacyDashboardU
rl
()
macaron
.
Handler
{
func
RedirectFromLegacyDashboardU
RL
()
macaron
.
Handler
{
return
func
(
c
*
m
.
ReqContext
)
{
slug
:=
c
.
Params
(
"slug"
)
...
...
pkg/middleware/dashboard_redirect_test.go
View file @
7aab6a88
...
...
@@ -13,7 +13,7 @@ import (
func
TestMiddlewareDashboardRedirect
(
t
*
testing
.
T
)
{
Convey
(
"Given the dashboard redirect middleware"
,
t
,
func
()
{
bus
.
ClearBusHandlers
()
redirectFromLegacyDashboardUrl
:=
RedirectFromLegacyDashboardU
rl
()
redirectFromLegacyDashboardUrl
:=
RedirectFromLegacyDashboardU
RL
()
redirectFromLegacyDashboardSoloUrl
:=
RedirectFromLegacyDashboardSoloUrl
()
fakeDash
:=
m
.
NewDashboard
(
"Child dash"
)
...
...
@@ -34,9 +34,9 @@ func TestMiddlewareDashboardRedirect(t *testing.T) {
Convey
(
"Should redirect to new dashboard url with a 301 Moved Permanently"
,
func
()
{
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
301
)
redirectU
rl
,
_
:=
sc
.
resp
.
Result
()
.
Location
()
So
(
redirectU
rl
.
Path
,
ShouldEqual
,
m
.
GetDashboardUrl
(
fakeDash
.
Uid
,
fakeDash
.
Slug
))
So
(
len
(
redirectU
rl
.
Query
()),
ShouldEqual
,
2
)
redirectU
RL
,
_
:=
sc
.
resp
.
Result
()
.
Location
()
So
(
redirectU
RL
.
Path
,
ShouldEqual
,
m
.
GetDashboardUrl
(
fakeDash
.
Uid
,
fakeDash
.
Slug
))
So
(
len
(
redirectU
RL
.
Query
()),
ShouldEqual
,
2
)
})
})
...
...
@@ -47,11 +47,11 @@ func TestMiddlewareDashboardRedirect(t *testing.T) {
Convey
(
"Should redirect to new dashboard url with a 301 Moved Permanently"
,
func
()
{
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
301
)
redirectU
rl
,
_
:=
sc
.
resp
.
Result
()
.
Location
()
expectedU
rl
:=
m
.
GetDashboardUrl
(
fakeDash
.
Uid
,
fakeDash
.
Slug
)
expectedU
rl
=
strings
.
Replace
(
expectedUrl
,
"/d/"
,
"/d-solo/"
,
1
)
So
(
redirectU
rl
.
Path
,
ShouldEqual
,
expectedUrl
)
So
(
len
(
redirectU
rl
.
Query
()),
ShouldEqual
,
2
)
redirectU
RL
,
_
:=
sc
.
resp
.
Result
()
.
Location
()
expectedU
RL
:=
m
.
GetDashboardUrl
(
fakeDash
.
Uid
,
fakeDash
.
Slug
)
expectedU
RL
=
strings
.
Replace
(
expectedURL
,
"/d/"
,
"/d-solo/"
,
1
)
So
(
redirectU
RL
.
Path
,
ShouldEqual
,
expectedURL
)
So
(
len
(
redirectU
RL
.
Query
()),
ShouldEqual
,
2
)
})
})
})
...
...
pkg/middleware/recovery_test.go
View file @
7aab6a88
...
...
@@ -14,10 +14,10 @@ import (
func
TestRecoveryMiddleware
(
t
*
testing
.
T
)
{
Convey
(
"Given an api route that panics"
,
t
,
func
()
{
apiU
rl
:=
"/api/whatever"
recoveryScenario
(
"recovery middleware should return json"
,
apiU
rl
,
func
(
sc
*
scenarioContext
)
{
apiU
RL
:=
"/api/whatever"
recoveryScenario
(
"recovery middleware should return json"
,
apiU
RL
,
func
(
sc
*
scenarioContext
)
{
sc
.
handlerFunc
=
PanicHandler
sc
.
fakeReq
(
"GET"
,
apiU
rl
)
.
exec
()
sc
.
fakeReq
(
"GET"
,
apiU
RL
)
.
exec
()
sc
.
req
.
Header
.
Add
(
"content-type"
,
"application/json"
)
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
500
)
...
...
@@ -27,10 +27,10 @@ func TestRecoveryMiddleware(t *testing.T) {
})
Convey
(
"Given a non-api route that panics"
,
t
,
func
()
{
apiU
rl
:=
"/whatever"
recoveryScenario
(
"recovery middleware should return html"
,
apiU
rl
,
func
(
sc
*
scenarioContext
)
{
apiU
RL
:=
"/whatever"
recoveryScenario
(
"recovery middleware should return html"
,
apiU
RL
,
func
(
sc
*
scenarioContext
)
{
sc
.
handlerFunc
=
PanicHandler
sc
.
fakeReq
(
"GET"
,
apiU
rl
)
.
exec
()
sc
.
fakeReq
(
"GET"
,
apiU
RL
)
.
exec
()
So
(
sc
.
resp
.
Code
,
ShouldEqual
,
500
)
So
(
sc
.
resp
.
Header
()
.
Get
(
"content-type"
),
ShouldEqual
,
"text/html; charset=UTF-8"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment