actions.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package server
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/felamaslen/gmus-backend/pkg/logger"
  7. "github.com/go-playground/validator/v10"
  8. "github.com/go-redis/redis"
  9. )
  10. type ActionType string
  11. const (
  12. StateSet ActionType = "STATE_SET"
  13. ClientListUpdated ActionType = "CLIENT_LIST_UPDATED"
  14. )
  15. type Action struct {
  16. Type ActionType `json:"type"`
  17. FromClient *string `json:"fromClient"`
  18. Priority *int `json:"priority"`
  19. Payload interface{} `json:"payload"`
  20. }
  21. func BroadcastAction(l *logger.Logger, thisPodClients *map[string]*Client, action *Action) []error {
  22. var errors []error
  23. for _, client := range *thisPodClients {
  24. l.Debug("[->Client] %s (%s)\n", action.Type, client.name)
  25. if err := client.send(action); err != nil {
  26. errors = append(errors, err)
  27. }
  28. }
  29. return errors
  30. }
  31. func validateAction(action *Action) (validatedAction *Action, err error) {
  32. switch action.Type {
  33. case StateSet:
  34. var remarshaledPayload []byte
  35. remarshaledPayload, err = json.Marshal(action.Payload)
  36. if err != nil {
  37. return
  38. }
  39. var playerState MusicPlayer
  40. err = json.Unmarshal(remarshaledPayload, &playerState)
  41. if err != nil {
  42. return
  43. }
  44. v := validator.New()
  45. err = v.Struct(playerState)
  46. if err != nil {
  47. err = errors.New(err.Error())
  48. return
  49. }
  50. validatedAction = &Action{
  51. Type: StateSet,
  52. FromClient: action.FromClient,
  53. Payload: playerState,
  54. }
  55. return
  56. default:
  57. err = errors.New(fmt.Sprintf("Invalid client action type: %s", action.Type))
  58. return
  59. }
  60. }
  61. func PublishAction(rdb redis.Cmdable, action []byte) error {
  62. if _, err := rdb.Publish(TOPIC_BROADCAST, action).Result(); err != nil {
  63. return err
  64. }
  65. return nil
  66. }
  67. func PublishActionFromClient(rdb redis.Cmdable, action *Action) error {
  68. validatedAction, validationErr := validateAction(action)
  69. if validationErr != nil {
  70. return validationErr
  71. }
  72. pubsubPayload, err := json.Marshal(validatedAction)
  73. if err != nil {
  74. return err
  75. }
  76. return PublishAction(rdb, pubsubPayload)
  77. }