apiActions.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. }
  15. func (rr *DashboardRenderRequest) findAction(title string) *apiv1.Action {
  16. rr.ex.MapActionIdToBindingLock.RLock()
  17. defer rr.ex.MapActionIdToBindingLock.RUnlock()
  18. for _, binding := range rr.ex.MapActionIdToBinding {
  19. if binding.Action.Title == title {
  20. return buildAction(binding, rr)
  21. }
  22. }
  23. return nil
  24. }
  25. func buildEffectivePolicy(policy *config.ConfigurationPolicy) *apiv1.EffectivePolicy {
  26. ret := &apiv1.EffectivePolicy{
  27. ShowDiagnostics: policy.ShowDiagnostics,
  28. ShowLogList: policy.ShowLogList,
  29. }
  30. return ret
  31. }
  32. func buildAction(actionBinding *executor.ActionBinding, rr *DashboardRenderRequest) *apiv1.Action {
  33. action := actionBinding.Action
  34. btn := apiv1.Action{
  35. BindingId: actionBinding.ID,
  36. Title: entities.ParseTemplateWith(action.Title, actionBinding.Entity),
  37. Icon: entities.ParseTemplateWith(action.Icon, actionBinding.Entity),
  38. CanExec: acl.IsAllowedExec(rr.cfg, rr.AuthenticatedUser, action),
  39. PopupOnStart: action.PopupOnStart,
  40. Order: int32(actionBinding.ConfigOrder),
  41. Timeout: int32(action.Timeout),
  42. }
  43. for _, cfgArg := range action.Arguments {
  44. pbArg := apiv1.ActionArgument{
  45. Name: cfgArg.Name,
  46. Title: cfgArg.Title,
  47. Type: cfgArg.Type,
  48. Description: cfgArg.Description,
  49. DefaultValue: cfgArg.Default,
  50. Choices: buildChoices(cfgArg),
  51. Suggestions: cfgArg.Suggestions,
  52. }
  53. btn.Arguments = append(btn.Arguments, &pbArg)
  54. }
  55. return &btn
  56. }
  57. func buildChoices(arg config.ActionArgument) []*apiv1.ActionArgumentChoice {
  58. if arg.Entity != "" && len(arg.Choices) == 1 {
  59. return buildChoicesEntity(arg.Choices[0], arg.Entity)
  60. } else {
  61. return buildChoicesSimple(arg.Choices)
  62. }
  63. }
  64. func buildChoicesEntity(firstChoice config.ActionArgumentChoice, entityTitle string) []*apiv1.ActionArgumentChoice {
  65. ret := []*apiv1.ActionArgumentChoice{}
  66. entList := entities.GetEntityInstances(entityTitle)
  67. for _, ent := range entList {
  68. ret = append(ret, &apiv1.ActionArgumentChoice{
  69. Value: entities.ParseTemplateWith(firstChoice.Value, ent),
  70. Title: entities.ParseTemplateWith(firstChoice.Title, ent),
  71. })
  72. }
  73. return ret
  74. }
  75. func buildChoicesSimple(choices []config.ActionArgumentChoice) []*apiv1.ActionArgumentChoice {
  76. ret := []*apiv1.ActionArgumentChoice{}
  77. for _, cfgChoice := range choices {
  78. pbChoice := apiv1.ActionArgumentChoice{
  79. Value: cfgChoice.Value,
  80. Title: cfgChoice.Title,
  81. }
  82. ret = append(ret, &pbChoice)
  83. }
  84. return ret
  85. }