apiActions.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package api
  2. import (
  3. apiv1 "github.com/OliveTin/OliveTin/gen/olivetin/api/v1"
  4. acl "github.com/OliveTin/OliveTin/internal/acl"
  5. authpublic "github.com/OliveTin/OliveTin/internal/auth/authpublic"
  6. config "github.com/OliveTin/OliveTin/internal/config"
  7. entities "github.com/OliveTin/OliveTin/internal/entities"
  8. executor "github.com/OliveTin/OliveTin/internal/executor"
  9. )
  10. type DashboardRenderRequest struct {
  11. AuthenticatedUser *authpublic.AuthenticatedUser
  12. cfg *config.Config
  13. ex *executor.Executor
  14. EntityType string
  15. EntityKey string
  16. }
  17. func (rr *DashboardRenderRequest) findAction(title string) *apiv1.Action {
  18. return rr.findActionForEntity(title, nil)
  19. }
  20. func (rr *DashboardRenderRequest) findActionForEntity(title string, entity *entities.Entity) *apiv1.Action {
  21. rr.ex.MapActionIdToBindingLock.RLock()
  22. defer rr.ex.MapActionIdToBindingLock.RUnlock()
  23. for _, binding := range rr.ex.MapActionIdToBinding {
  24. if binding.Action.Title != title {
  25. continue
  26. }
  27. if matchesEntity(binding, entity) {
  28. return buildAction(binding, rr)
  29. }
  30. }
  31. return nil
  32. }
  33. func matchesEntity(binding *executor.ActionBinding, entity *entities.Entity) bool {
  34. if entity == nil {
  35. return binding.Entity == nil
  36. }
  37. return binding.Entity != nil && binding.Entity.UniqueKey == entity.UniqueKey
  38. }
  39. func buildEffectivePolicy(policy *config.ConfigurationPolicy) *apiv1.EffectivePolicy {
  40. ret := &apiv1.EffectivePolicy{
  41. ShowDiagnostics: policy.ShowDiagnostics,
  42. ShowLogList: policy.ShowLogList,
  43. }
  44. return ret
  45. }
  46. func buildAction(actionBinding *executor.ActionBinding, rr *DashboardRenderRequest) *apiv1.Action {
  47. action := actionBinding.Action
  48. btn := apiv1.Action{
  49. BindingId: actionBinding.ID,
  50. Title: entities.ParseTemplateWith(action.Title, actionBinding.Entity),
  51. Icon: entities.ParseTemplateWith(action.Icon, actionBinding.Entity),
  52. CanExec: acl.IsAllowedExec(rr.cfg, rr.AuthenticatedUser, action),
  53. PopupOnStart: action.PopupOnStart,
  54. Order: int32(actionBinding.ConfigOrder),
  55. Timeout: int32(action.Timeout),
  56. }
  57. for _, cfgArg := range action.Arguments {
  58. pbArg := apiv1.ActionArgument{
  59. Name: cfgArg.Name,
  60. Title: cfgArg.Title,
  61. Type: cfgArg.Type,
  62. Description: cfgArg.Description,
  63. DefaultValue: cfgArg.Default,
  64. Choices: buildChoices(cfgArg),
  65. Suggestions: cfgArg.Suggestions,
  66. }
  67. btn.Arguments = append(btn.Arguments, &pbArg)
  68. }
  69. return &btn
  70. }
  71. func buildChoices(arg config.ActionArgument) []*apiv1.ActionArgumentChoice {
  72. if arg.Entity != "" && len(arg.Choices) == 1 {
  73. return buildChoicesEntity(arg.Choices[0], arg.Entity)
  74. } else {
  75. return buildChoicesSimple(arg.Choices)
  76. }
  77. }
  78. func buildChoicesEntity(firstChoice config.ActionArgumentChoice, entityTitle string) []*apiv1.ActionArgumentChoice {
  79. ret := []*apiv1.ActionArgumentChoice{}
  80. entList := entities.GetEntityInstances(entityTitle)
  81. for _, ent := range entList {
  82. ret = append(ret, &apiv1.ActionArgumentChoice{
  83. Value: entities.ParseTemplateWith(firstChoice.Value, ent),
  84. Title: entities.ParseTemplateWith(firstChoice.Title, ent),
  85. })
  86. }
  87. return ret
  88. }
  89. func buildChoicesSimple(choices []config.ActionArgumentChoice) []*apiv1.ActionArgumentChoice {
  90. ret := []*apiv1.ActionArgumentChoice{}
  91. for _, cfgChoice := range choices {
  92. pbChoice := apiv1.ActionArgumentChoice{
  93. Value: cfgChoice.Value,
  94. Title: cfgChoice.Title,
  95. }
  96. ret = append(ret, &pbChoice)
  97. }
  98. return ret
  99. }