folder.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package api
  2. import (
  3. "fmt"
  4. "github.com/grafana/grafana/pkg/api/dtos"
  5. m "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/dashboards"
  7. "github.com/grafana/grafana/pkg/services/guardian"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. func GetFolders(c *m.ReqContext) Response {
  11. s := dashboards.NewFolderService(c.OrgId, c.SignedInUser)
  12. folders, err := s.GetFolders(c.QueryInt("limit"))
  13. if err != nil {
  14. return toFolderError(err)
  15. }
  16. result := make([]dtos.FolderSearchHit, 0)
  17. for _, f := range folders {
  18. result = append(result, dtos.FolderSearchHit{
  19. Id: f.Id,
  20. Uid: f.Uid,
  21. Title: f.Title,
  22. })
  23. }
  24. return JSON(200, result)
  25. }
  26. func GetFolderByUID(c *m.ReqContext) Response {
  27. s := dashboards.NewFolderService(c.OrgId, c.SignedInUser)
  28. folder, err := s.GetFolderByUID(c.Params(":uid"))
  29. if err != nil {
  30. return toFolderError(err)
  31. }
  32. g := guardian.New(folder.Id, c.OrgId, c.SignedInUser)
  33. return JSON(200, toFolderDto(g, folder))
  34. }
  35. func GetFolderByID(c *m.ReqContext) Response {
  36. s := dashboards.NewFolderService(c.OrgId, c.SignedInUser)
  37. folder, err := s.GetFolderByID(c.ParamsInt64(":id"))
  38. if err != nil {
  39. return toFolderError(err)
  40. }
  41. g := guardian.New(folder.Id, c.OrgId, c.SignedInUser)
  42. return JSON(200, toFolderDto(g, folder))
  43. }
  44. func (hs *HTTPServer) CreateFolder(c *m.ReqContext, cmd m.CreateFolderCommand) Response {
  45. s := dashboards.NewFolderService(c.OrgId, c.SignedInUser)
  46. err := s.CreateFolder(&cmd)
  47. if err != nil {
  48. return toFolderError(err)
  49. }
  50. if hs.Cfg.EditorsCanAdmin {
  51. aclService := dashboards.NewAclService()
  52. if err := aclService.MakeUserAdmin(c.OrgId, c.SignedInUser.UserId, cmd.Result.Id, true); err != nil {
  53. hs.log.Error("Could not make user admin", "folder", cmd.Result.Title, "user", c.SignedInUser.UserId, "error", err)
  54. return Error(500, "Failed to make user admin of folder", err)
  55. }
  56. }
  57. g := guardian.New(cmd.Result.Id, c.OrgId, c.SignedInUser)
  58. return JSON(200, toFolderDto(g, cmd.Result))
  59. }
  60. func UpdateFolder(c *m.ReqContext, cmd m.UpdateFolderCommand) Response {
  61. s := dashboards.NewFolderService(c.OrgId, c.SignedInUser)
  62. err := s.UpdateFolder(c.Params(":uid"), &cmd)
  63. if err != nil {
  64. return toFolderError(err)
  65. }
  66. g := guardian.New(cmd.Result.Id, c.OrgId, c.SignedInUser)
  67. return JSON(200, toFolderDto(g, cmd.Result))
  68. }
  69. func DeleteFolder(c *m.ReqContext) Response {
  70. s := dashboards.NewFolderService(c.OrgId, c.SignedInUser)
  71. f, err := s.DeleteFolder(c.Params(":uid"))
  72. if err != nil {
  73. return toFolderError(err)
  74. }
  75. return JSON(200, util.DynMap{
  76. "title": f.Title,
  77. "message": fmt.Sprintf("Folder %s deleted", f.Title),
  78. })
  79. }
  80. func toFolderDto(g guardian.DashboardGuardian, folder *m.Folder) dtos.Folder {
  81. canEdit, _ := g.CanEdit()
  82. canSave, _ := g.CanSave()
  83. canAdmin, _ := g.CanAdmin()
  84. // Finding creator and last updater of the folder
  85. updater, creator := anonString, anonString
  86. if folder.CreatedBy > 0 {
  87. creator = getUserLogin(folder.CreatedBy)
  88. }
  89. if folder.UpdatedBy > 0 {
  90. updater = getUserLogin(folder.UpdatedBy)
  91. }
  92. return dtos.Folder{
  93. Id: folder.Id,
  94. Uid: folder.Uid,
  95. Title: folder.Title,
  96. Url: folder.Url,
  97. HasAcl: folder.HasAcl,
  98. CanSave: canSave,
  99. CanEdit: canEdit,
  100. CanAdmin: canAdmin,
  101. CreatedBy: creator,
  102. Created: folder.Created,
  103. UpdatedBy: updater,
  104. Updated: folder.Updated,
  105. Version: folder.Version,
  106. }
  107. }
  108. func toFolderError(err error) Response {
  109. if err == m.ErrFolderTitleEmpty ||
  110. err == m.ErrFolderSameNameExists ||
  111. err == m.ErrFolderWithSameUIDExists ||
  112. err == m.ErrDashboardTypeMismatch ||
  113. err == m.ErrDashboardInvalidUid ||
  114. err == m.ErrDashboardUidToLong {
  115. return Error(400, err.Error(), nil)
  116. }
  117. if err == m.ErrFolderAccessDenied {
  118. return Error(403, "Access denied", err)
  119. }
  120. if err == m.ErrFolderNotFound {
  121. return JSON(404, util.DynMap{"status": "not-found", "message": m.ErrFolderNotFound.Error()})
  122. }
  123. if err == m.ErrFolderVersionMismatch {
  124. return JSON(412, util.DynMap{"status": "version-mismatch", "message": m.ErrFolderVersionMismatch.Error()})
  125. }
  126. return Error(500, "Folder API error", err)
  127. }