2017-04-29 03:22:53 +08:00
package sqlstore
import (
"time"
"github.com/grafana/grafana/pkg/bus"
m "github.com/grafana/grafana/pkg/models"
)
func init ( ) {
bus . AddHandler ( "sql" , AddOrUpdateDashboardPermission )
2017-05-03 17:32:21 +08:00
bus . AddHandler ( "sql" , RemoveDashboardPermission )
2017-04-29 03:22:53 +08:00
bus . AddHandler ( "sql" , GetDashboardPermissions )
2017-06-19 23:03:54 +08:00
bus . AddHandler ( "sql" , GetDashboardAcl )
2017-04-29 03:22:53 +08:00
}
func AddOrUpdateDashboardPermission ( cmd * m . AddOrUpdateDashboardPermissionCommand ) error {
2017-05-24 22:19:21 +08:00
return inTransaction ( func ( sess * DBSession ) error {
2017-06-15 05:45:30 +08:00
if cmd . UserId == 0 && cmd . UserGroupId == 0 {
return m . ErrDashboardPermissionUserOrUserGroupEmpty
}
2017-05-08 21:35:34 +08:00
if res , err := sess . Query ( "SELECT 1 from " + dialect . Quote ( "dashboard_acl" ) + " WHERE dashboard_id =? and (user_group_id=? or user_id=?)" , cmd . DashboardId , cmd . UserGroupId , cmd . UserId ) ; err != nil {
2017-04-29 03:22:53 +08:00
return err
} else if len ( res ) == 1 {
entity := m . DashboardAcl {
2017-06-18 06:24:38 +08:00
Permissions : cmd . Permissions ,
2017-05-08 21:35:34 +08:00
Updated : time . Now ( ) ,
2017-04-29 03:22:53 +08:00
}
2017-05-08 21:35:34 +08:00
if _ , err := sess . Cols ( "updated" , "permissions" ) . Where ( "dashboard_id =? and (user_group_id=? or user_id=?)" , cmd . DashboardId , cmd . UserGroupId , cmd . UserId ) . Update ( & entity ) ; err != nil {
2017-04-29 03:22:53 +08:00
return err
}
return nil
}
entity := m . DashboardAcl {
OrgId : cmd . OrgId ,
UserGroupId : cmd . UserGroupId ,
UserId : cmd . UserId ,
Created : time . Now ( ) ,
Updated : time . Now ( ) ,
DashboardId : cmd . DashboardId ,
2017-06-18 06:24:38 +08:00
Permissions : cmd . Permissions ,
2017-04-29 03:22:53 +08:00
}
cols := [ ] string { "org_id" , "created" , "updated" , "dashboard_id" , "permissions" }
if cmd . UserId != 0 {
cols = append ( cols , "user_id" )
}
if cmd . UserGroupId != 0 {
cols = append ( cols , "user_group_id" )
}
2017-06-10 03:56:13 +08:00
entityId , err := sess . Cols ( cols ... ) . Insert ( & entity )
2017-04-29 03:22:53 +08:00
if err != nil {
return err
}
2017-06-10 03:56:13 +08:00
cmd . Result = entity
cmd . Result . Id = entityId
2017-04-29 03:22:53 +08:00
2017-06-10 03:56:13 +08:00
// Update dashboard HasAcl flag
2017-04-29 03:22:53 +08:00
dashboard := m . Dashboard {
HasAcl : true ,
}
2017-06-18 06:24:38 +08:00
2017-04-29 03:22:53 +08:00
if _ , err := sess . Cols ( "has_acl" ) . Where ( "id=? OR parent_id=?" , cmd . DashboardId , cmd . DashboardId ) . Update ( & dashboard ) ; err != nil {
return err
}
return nil
} )
}
2017-05-03 17:32:21 +08:00
func RemoveDashboardPermission ( cmd * m . RemoveDashboardPermissionCommand ) error {
2017-05-24 22:19:21 +08:00
return inTransaction ( func ( sess * DBSession ) error {
2017-05-08 21:35:34 +08:00
var rawSQL = "DELETE FROM " + dialect . Quote ( "dashboard_acl" ) + " WHERE dashboard_id =? and (user_group_id=? or user_id=?)"
_ , err := sess . Exec ( rawSQL , cmd . DashboardId , cmd . UserGroupId , cmd . UserId )
2017-05-03 17:32:21 +08:00
if err != nil {
return err
}
return err
} )
}
2017-06-19 23:03:54 +08:00
func GetDashboardAcl ( query * m . GetDashboardAclQuery ) error {
rawSQL := ` SELECT
da . id ,
da . org_id ,
da . id ,
da . dashboard_id ,
da . user_id ,
da . user_group_id ,
da . permissions ,
da . created ,
da . updated ,
FROM ` + dialect.Quote("dashboard_acl") + ` as da
WHERE dashboard_id IN (
SELECT id FROM dashboard where id = ?
UNION
SELECT parent_id from dashboard where id = ?
) `
query . Result = make ( [ ] * m . DashboardAcl , 0 )
return x . SQL ( rawSQL , query . DashboardId ) . Find ( & query . Result )
}
2017-04-29 03:22:53 +08:00
func GetDashboardPermissions ( query * m . GetDashboardPermissionsQuery ) error {
2017-05-08 21:35:34 +08:00
rawSQL := ` SELECT
2017-06-08 16:39:17 +08:00
da . id ,
da . org_id ,
da . id ,
da . dashboard_id ,
da . user_id ,
da . user_group_id ,
2017-06-17 09:25:24 +08:00
da . permissions ,
2017-06-08 16:39:17 +08:00
da . created ,
da . updated ,
2017-05-08 21:35:34 +08:00
u . login AS user_login ,
u . email AS user_email ,
ug . name AS user_group
FROM ` + dialect.Quote("dashboard_acl") + ` as da
LEFT OUTER JOIN ` + dialect.Quote("user") + ` AS u ON u . id = da . user_id
LEFT OUTER JOIN user_group ug on ug . id = da . user_group_id
WHERE dashboard_id = ? `
query . Result = make ( [ ] * m . DashboardAclInfoDTO , 0 )
err := x . SQL ( rawSQL , query . DashboardId ) . Find ( & query . Result )
2017-06-08 16:39:17 +08:00
for _ , p := range query . Result {
2017-06-17 09:25:24 +08:00
p . PermissionName = p . Permissions . String ( )
2017-06-08 16:39:17 +08:00
}
2017-05-08 21:35:34 +08:00
return err
2017-04-29 03:22:53 +08:00
}