lib/wolf_core/application/integrations/webhooks_operations.rb



module WolfCore
  module Integrations
    module WebhooksOperations
      def get_payload(params:, event_type: nil)
        event_type ||= get_event_type(params: params)
        return if event_type == 'SubscriptionConfirmation'
        params = JSON.parse(params['Message'] || '{}')
        JSON.parse(params['payload'] || '{}')
      end

      def get_event_type(params:)
        params['Type']
      end

      def get_event_name(params:)
        message = JSON.parse(params['Message'] || {})
        message['event_name']
      end

      def validate_user_is_not_admin(params:)
        event_type = get_event_type(params: params)
        return if event_type == 'SubscriptionConfirmation'

        user_id = params.dig('invoker', 'user_id').to_s
        return unless user_id == ENV['WOLF_ADMIN_ID'].to_s

        raise_service_error("Ignoring event from user id #{user_id}")
      end

      def subscription_confirmation_request(url:)
        safe_http_get(
          url: url,
          error_message: "Can not confirm subscription",
        )
      end

      def process_webhook(params:)
        event_type = get_event_type(params: params)
        if event_type == 'SubscriptionConfirmation'
          url = params['SubscribeURL']
          subscription_confirmation_request(url: url)
        elsif event_type == 'Notification'
          event_name = get_event_name(params: params)
          yield(event_name)
        end
      end

      def build_body_from_params(params:, id_key:, include_changes: false)
        body = {
          event_name: get_event_name(params: params),
          id_key => get_object_id(params: params)
        }
        if include_changes
          payload = get_payload(params: params)
          body[:changes] = payload&.dig('changes')
        end
        body
      end

      def get_object_id(params:)
        params = JSON.parse(params['Message'] || '{}')
        params['object_id']
      end

      def group_custom_values_by_custom_requirement_group(
        payload:,
        jobseeker_file_custom_requirement_ids:,
        reference_form_custom_requirement_ids:,
        disclosure_form_custom_requirement_ids:
      )
        custom_values = payload.dig('changes', 'custom_values')
        if custom_values.blank?
          custom_values = [ payload['attributes'] ]
        end

        custom_values.group_by do |custom_value|
          custom_requirement_group = if jobseeker_file_custom_requirement_ids.include?(custom_value['custom_requirement_id'].to_s)
            'jobseeker_file'
          elsif reference_form_custom_requirement_ids.include?(custom_value['custom_requirement_id'].to_s)
            'reference_form'
          elsif disclosure_form_custom_requirement_ids.include?(custom_value['custom_requirement_id'].to_s)
            'disclosure_form'
          elsif custom_value['user_category'] == 'Freelancer'
            'jobseeker'
          elsif custom_value['user_category'] == 'Campaign'
            'order'
          else
            'unknown_group'
          end

          custom_requirement_group
        end
      end
    end
  end
end