class WebhooksController < ApplicationController skip_forgery_protection before_action :authorize_request before_action :process_payload def lndhub @user = User.find_by!(ln_account: @payload[:user_login]) send_notifications head :ok end private def authorize_request if !ENV['WEBHOOKS_ALLOWED_IPS'].split(',').include?(request.remote_ip) head :forbidden and return end end def process_payload begin @payload = JSON.parse(request.body.read, symbolize_names: true) head :no_content and return unless @payload[:type] == "incoming" rescue head :unprocessable_entity and return end end def send_notifications notify = @user.preferences[:lightning_notify_sats_received] case notify when "xmpp" notify_xmpp when "email" notify_email end end # TODO refactor into mailer-like generic class/service def notify_xmpp XmppSendMessageJob.perform_later({ type: "normal", from: Setting.xmpp_notifications_from_address, to: @user.address, subject: "Sats received!", body: "#{helpers.number_with_delimiter @payload[:amount]} sats received in your Lightning wallet:\n> #{@payload[:memo]}" }) end def notify_email NotificationMailer.with(user: @user, amount_sats: @payload[:amount]) .lightning_sats_received.deliver_later end end