| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- package dashboards
- import (
- "github.com/grafana/grafana/pkg/bus"
- "github.com/grafana/grafana/pkg/models"
- "github.com/grafana/grafana/pkg/services/guardian"
- "github.com/grafana/grafana/pkg/services/search"
- )
- // FolderService service for operating on folders
- type FolderService interface {
- GetFolders(limit int) ([]*models.Folder, error)
- GetFolderById(id int64) (*models.Folder, error)
- GetFolderByUid(uid string) (*models.Folder, error)
- CreateFolder(cmd *models.CreateFolderCommand) error
- UpdateFolder(uid string, cmd *models.UpdateFolderCommand) error
- DeleteFolder(uid string) (*models.Folder, error)
- }
- // NewFolderService factory for creating a new folder service
- var NewFolderService = func(orgId int64, user *models.SignedInUser) FolderService {
- return &dashboardServiceImpl{
- orgId: orgId,
- user: user,
- }
- }
- func (dr *dashboardServiceImpl) GetFolders(limit int) ([]*models.Folder, error) {
- if limit == 0 {
- limit = 1000
- }
- searchQuery := search.Query{
- SignedInUser: dr.user,
- DashboardIds: make([]int64, 0),
- FolderIds: make([]int64, 0),
- Limit: limit,
- OrgId: dr.orgId,
- Type: "dash-folder",
- Permission: models.PERMISSION_VIEW,
- }
- if err := bus.Dispatch(&searchQuery); err != nil {
- return nil, err
- }
- folders := make([]*models.Folder, 0)
- for _, hit := range searchQuery.Result {
- folders = append(folders, &models.Folder{
- Id: hit.Id,
- Uid: hit.Uid,
- Title: hit.Title,
- })
- }
- return folders, nil
- }
- func (dr *dashboardServiceImpl) GetFolderById(id int64) (*models.Folder, error) {
- query := models.GetDashboardQuery{OrgId: dr.orgId, Id: id}
- dashFolder, err := getFolder(query)
- if err != nil {
- return nil, toFolderError(err)
- }
- g := guardian.New(dashFolder.Id, dr.orgId, dr.user)
- if canView, err := g.CanView(); err != nil || !canView {
- if err != nil {
- return nil, toFolderError(err)
- }
- return nil, models.ErrFolderAccessDenied
- }
- return dashToFolder(dashFolder), nil
- }
- func (dr *dashboardServiceImpl) GetFolderByUid(uid string) (*models.Folder, error) {
- query := models.GetDashboardQuery{OrgId: dr.orgId, Uid: uid}
- dashFolder, err := getFolder(query)
- if err != nil {
- return nil, toFolderError(err)
- }
- g := guardian.New(dashFolder.Id, dr.orgId, dr.user)
- if canView, err := g.CanView(); err != nil || !canView {
- if err != nil {
- return nil, toFolderError(err)
- }
- return nil, models.ErrFolderAccessDenied
- }
- return dashToFolder(dashFolder), nil
- }
- func (dr *dashboardServiceImpl) CreateFolder(cmd *models.CreateFolderCommand) error {
- dashFolder := cmd.GetDashboardModel(dr.orgId, dr.user.UserId)
- dto := &SaveDashboardDTO{
- Dashboard: dashFolder,
- OrgId: dr.orgId,
- User: dr.user,
- }
- saveDashboardCmd, err := dr.buildSaveDashboardCommand(dto, false)
- if err != nil {
- return toFolderError(err)
- }
- err = bus.Dispatch(saveDashboardCmd)
- if err != nil {
- return toFolderError(err)
- }
- query := models.GetDashboardQuery{OrgId: dr.orgId, Id: saveDashboardCmd.Result.Id}
- dashFolder, err = getFolder(query)
- if err != nil {
- return toFolderError(err)
- }
- cmd.Result = dashToFolder(dashFolder)
- return nil
- }
- func (dr *dashboardServiceImpl) UpdateFolder(existingUid string, cmd *models.UpdateFolderCommand) error {
- query := models.GetDashboardQuery{OrgId: dr.orgId, Uid: existingUid}
- dashFolder, err := getFolder(query)
- if err != nil {
- return toFolderError(err)
- }
- cmd.UpdateDashboardModel(dashFolder, dr.orgId, dr.user.UserId)
- dto := &SaveDashboardDTO{
- Dashboard: dashFolder,
- OrgId: dr.orgId,
- User: dr.user,
- Overwrite: cmd.Overwrite,
- }
- saveDashboardCmd, err := dr.buildSaveDashboardCommand(dto, false)
- if err != nil {
- return toFolderError(err)
- }
- err = bus.Dispatch(saveDashboardCmd)
- if err != nil {
- return toFolderError(err)
- }
- query = models.GetDashboardQuery{OrgId: dr.orgId, Id: saveDashboardCmd.Result.Id}
- dashFolder, err = getFolder(query)
- if err != nil {
- return toFolderError(err)
- }
- cmd.Result = dashToFolder(dashFolder)
- return nil
- }
- func (dr *dashboardServiceImpl) DeleteFolder(uid string) (*models.Folder, error) {
- query := models.GetDashboardQuery{OrgId: dr.orgId, Uid: uid}
- dashFolder, err := getFolder(query)
- if err != nil {
- return nil, toFolderError(err)
- }
- guardian := guardian.New(dashFolder.Id, dr.orgId, dr.user)
- if canSave, err := guardian.CanSave(); err != nil || !canSave {
- if err != nil {
- return nil, toFolderError(err)
- }
- return nil, models.ErrFolderAccessDenied
- }
- deleteCmd := models.DeleteDashboardCommand{OrgId: dr.orgId, Id: dashFolder.Id}
- if err := bus.Dispatch(&deleteCmd); err != nil {
- return nil, toFolderError(err)
- }
- return dashToFolder(dashFolder), nil
- }
- func getFolder(query models.GetDashboardQuery) (*models.Dashboard, error) {
- if err := bus.Dispatch(&query); err != nil {
- return nil, toFolderError(err)
- }
- if !query.Result.IsFolder {
- return nil, models.ErrFolderNotFound
- }
- return query.Result, nil
- }
- func dashToFolder(dash *models.Dashboard) *models.Folder {
- return &models.Folder{
- Id: dash.Id,
- Uid: dash.Uid,
- Title: dash.Title,
- HasAcl: dash.HasAcl,
- Url: dash.GetUrl(),
- Version: dash.Version,
- Created: dash.Created,
- CreatedBy: dash.CreatedBy,
- Updated: dash.Updated,
- UpdatedBy: dash.UpdatedBy,
- }
- }
- func toFolderError(err error) error {
- if err == models.ErrDashboardTitleEmpty {
- return models.ErrFolderTitleEmpty
- }
- if err == models.ErrDashboardUpdateAccessDenied {
- return models.ErrFolderAccessDenied
- }
- if err == models.ErrDashboardWithSameNameInFolderExists {
- return models.ErrFolderSameNameExists
- }
- if err == models.ErrDashboardWithSameUIDExists {
- return models.ErrFolderWithSameUIDExists
- }
- if err == models.ErrDashboardVersionMismatch {
- return models.ErrFolderVersionMismatch
- }
- if err == models.ErrDashboardNotFound {
- return models.ErrFolderNotFound
- }
- if err == models.ErrDashboardFailedGenerateUniqueUid {
- err = models.ErrFolderFailedGenerateUniqueUid
- }
- return err
- }
|