account_grok_media_eligibility.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package service
  2. import infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors"
  3. // ValidateGrokMediaEligibilityExtra validates the optional per-account media
  4. // routing override. A nil value removes the override and restores automatic
  5. // provider-observation routing.
  6. func ValidateGrokMediaEligibilityExtra(platform string, extra map[string]any) error {
  7. if platform != PlatformGrok || extra == nil {
  8. return nil
  9. }
  10. raw, exists := extra[GrokMediaEligibleExtraKey]
  11. if !exists || raw == nil {
  12. return nil
  13. }
  14. if _, ok := raw.(bool); !ok {
  15. return infraerrors.BadRequest("GROK_MEDIA_ELIGIBILITY_INVALID", "grok_media_eligible must be a boolean or null")
  16. }
  17. return nil
  18. }
  19. func normalizeGrokMediaEligibilityExtra(platform string, extra map[string]any) (map[string]any, error) {
  20. if platform != PlatformGrok {
  21. return extra, nil
  22. }
  23. if err := ValidateGrokMediaEligibilityExtra(platform, extra); err != nil {
  24. return nil, err
  25. }
  26. if extra == nil {
  27. return nil, nil
  28. }
  29. normalized := shallowCopyMap(extra)
  30. if normalized[GrokMediaEligibleExtraKey] == nil {
  31. delete(normalized, GrokMediaEligibleExtraKey)
  32. }
  33. return normalized, nil
  34. }
  35. func normalizeGrokMediaEligibilityUpdateExtra(account *Account, input *UpdateAccountInput, normalized map[string]any) (map[string]any, error) {
  36. if account == nil || account.Platform != PlatformGrok {
  37. return normalized, nil
  38. }
  39. if input == nil {
  40. return nil, infraerrors.BadRequest("INVALID_ACCOUNT_INPUT", "account update input is required")
  41. }
  42. if err := ValidateGrokMediaEligibilityExtra(account.Platform, input.Extra); err != nil {
  43. return nil, err
  44. }
  45. if normalized == nil {
  46. normalized = make(map[string]any)
  47. } else {
  48. normalized = shallowCopyMap(normalized)
  49. }
  50. raw, provided := input.Extra[GrokMediaEligibleExtraKey]
  51. if provided {
  52. if raw == nil {
  53. delete(normalized, GrokMediaEligibleExtraKey)
  54. }
  55. return normalized, nil
  56. }
  57. if current, ok := account.Extra[GrokMediaEligibleExtraKey].(bool); ok {
  58. normalized[GrokMediaEligibleExtraKey] = current
  59. }
  60. return normalized, nil
  61. }