folder.go 3.7 KB

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