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"

        message = params["Message"] || {}
        message = JSON.parse(message) if message.is_a?(String)

        payload = message["payload"] || {}
        payload = JSON.parse(payload) if payload.is_a?(String)

        payload
      end

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

      def get_event_name(params:)
        message = params["Message"] || {}
        message = JSON.parse(message) if message.is_a?(String)
        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:)
        message = params["Message"] || {}
        message = JSON.parse(message) if message.is_a?(String)
        message["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")
        custom_values = [payload["attributes"]] if custom_values.blank?

        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