apiActions.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package api
  2. import (
  3. apiv1 "github.com/OliveTin/OliveTin/gen/olivetin/api/v1"
  4. acl "github.com/OliveTin/OliveTin/internal/acl"
  5. config "github.com/OliveTin/OliveTin/internal/config"
  6. executor "github.com/OliveTin/OliveTin/internal/executor"
  7. sv "github.com/OliveTin/OliveTin/internal/stringvariables"
  8. log "github.com/sirupsen/logrus"
  9. )
  10. type DashboardRenderRequest struct {
  11. AuthenticatedUser *acl.AuthenticatedUser
  12. AllowedActionTitles []string `json:"allows_action_titles"`
  13. cfg *config.Config
  14. ex *executor.Executor
  15. usedActions map[string]bool
  16. }
  17. func (rr *DashboardRenderRequest) findAction(title string) *apiv1.Action {
  18. for _, action := range rr.cfg.Actions {
  19. log.Infof("Checking action %s against %s", title, action.Title)
  20. if action.Title == title {
  21. return buildAction(action.ID, nil, rr)
  22. }
  23. }
  24. return nil
  25. }
  26. func buildDashboardResponse(ex *executor.Executor, cfg *config.Config, user *acl.AuthenticatedUser) *apiv1.GetDashboardComponentsResponse {
  27. res := &apiv1.GetDashboardComponentsResponse{
  28. AuthenticatedUser: user.Username,
  29. AuthenticatedUserProvider: user.Provider,
  30. }
  31. /*
  32. sort.Slice(res.Actions, func(i, j int) bool {
  33. if res.Actions[i].Order == res.Actions[j].Order {
  34. return res.Actions[i].Title < res.Actions[j].Title
  35. } else {
  36. return res.Actions[i].Order < res.Actions[j].Order
  37. }
  38. })
  39. */
  40. rr := &DashboardRenderRequest{
  41. AuthenticatedUser: user,
  42. // AllowedActionTitles: getActionTitles(res.Actions),
  43. cfg: cfg,
  44. ex: ex,
  45. usedActions: make(map[string]bool),
  46. }
  47. res.EffectivePolicy = buildEffectivePolicy(user.EffectivePolicy)
  48. res.Dashboards = dashboardCfgToPb(rr)
  49. return res
  50. }
  51. func getActionTitles(actions []*apiv1.Action) []string {
  52. titles := make([]string, 0, len(actions))
  53. for _, action := range actions {
  54. titles = append(titles, action.Title)
  55. }
  56. return titles
  57. }
  58. func buildEffectivePolicy(policy *config.ConfigurationPolicy) *apiv1.EffectivePolicy {
  59. ret := &apiv1.EffectivePolicy{
  60. ShowDiagnostics: policy.ShowDiagnostics,
  61. ShowLogList: policy.ShowLogList,
  62. }
  63. return ret
  64. }
  65. func buildAction(actionId string, actionBinding *executor.ActionBinding, rr *DashboardRenderRequest) *apiv1.Action {
  66. action := actionBinding.Action
  67. btn := apiv1.Action{
  68. Id: actionId,
  69. Title: sv.ReplaceEntityVars(actionBinding.EntityPrefix, action.Title),
  70. Icon: sv.ReplaceEntityVars(actionBinding.EntityPrefix, action.Icon),
  71. CanExec: acl.IsAllowedExec(rr.cfg, rr.AuthenticatedUser, action),
  72. PopupOnStart: action.PopupOnStart,
  73. Order: int32(actionBinding.ConfigOrder),
  74. }
  75. for _, cfgArg := range action.Arguments {
  76. pbArg := apiv1.ActionArgument{
  77. Name: cfgArg.Name,
  78. Title: cfgArg.Title,
  79. Type: cfgArg.Type,
  80. Description: cfgArg.Description,
  81. DefaultValue: cfgArg.Default,
  82. Choices: buildChoices(cfgArg),
  83. Suggestions: cfgArg.Suggestions,
  84. }
  85. btn.Arguments = append(btn.Arguments, &pbArg)
  86. }
  87. return &btn
  88. }
  89. func buildChoices(arg config.ActionArgument) []*apiv1.ActionArgumentChoice {
  90. if arg.Entity != "" && len(arg.Choices) == 1 {
  91. return buildChoicesEntity(arg.Choices[0], arg.Entity)
  92. } else {
  93. return buildChoicesSimple(arg.Choices)
  94. }
  95. }
  96. func buildChoicesEntity(firstChoice config.ActionArgumentChoice, entityTitle string) []*apiv1.ActionArgumentChoice {
  97. ret := []*apiv1.ActionArgumentChoice{}
  98. entityCount := sv.GetEntityCount(entityTitle)
  99. for i := 0; i < entityCount; i++ {
  100. prefix := sv.GetEntityPrefix(entityTitle, i)
  101. ret = append(ret, &apiv1.ActionArgumentChoice{
  102. Value: sv.ReplaceEntityVars(prefix, firstChoice.Value),
  103. Title: sv.ReplaceEntityVars(prefix, firstChoice.Title),
  104. })
  105. }
  106. return ret
  107. }
  108. func buildChoicesSimple(choices []config.ActionArgumentChoice) []*apiv1.ActionArgumentChoice {
  109. ret := []*apiv1.ActionArgumentChoice{}
  110. for _, cfgChoice := range choices {
  111. pbChoice := apiv1.ActionArgumentChoice{
  112. Value: cfgChoice.Value,
  113. Title: cfgChoice.Title,
  114. }
  115. ret = append(ret, &pbChoice)
  116. }
  117. return ret
  118. }