graphql_channel.rb 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. class GraphqlChannel < ApplicationCable::Channel
  3. def subscribed
  4. @subscription_ids = []
  5. end
  6. def execute(data)
  7. query = data['query']
  8. variables = ensure_hash(data['variables'])
  9. operation_name = data['operationName']
  10. # context must be kept in sync with GraphqlController!
  11. context = {
  12. sid: sid,
  13. current_user: current_user,
  14. # :channel is required for ActionCableSubscriptions and MUST NOT be used otherwise.
  15. channel: self,
  16. }
  17. result = Gql::ZammadSchema.execute(
  18. query: query,
  19. context: context,
  20. variables: variables,
  21. operation_name: operation_name
  22. )
  23. payload = {
  24. result: result.to_h,
  25. more: result.subscription?,
  26. }
  27. # Track the subscription here so we can remove it
  28. # on unsubscribe.
  29. if result.context[:subscription_id]
  30. @subscription_ids << result.context[:subscription_id]
  31. end
  32. transmit(payload)
  33. end
  34. def unsubscribed
  35. @subscription_ids.each do |sid|
  36. Gql::ZammadSchema.subscriptions.delete_subscription(sid)
  37. end
  38. end
  39. private
  40. def ensure_hash(ambiguous_param)
  41. case ambiguous_param
  42. when String
  43. if ambiguous_param.present?
  44. ensure_hash(JSON.parse(ambiguous_param))
  45. else
  46. {}
  47. end
  48. when Hash, ActionController::Parameters
  49. ambiguous_param
  50. when nil
  51. {}
  52. else
  53. raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
  54. end
  55. end
  56. end