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]) if @zap_request = fetch_nostr_event_from_description NostrManager::PublishZapReceipt.call( user: @user, zap_request: @zap_request ) end 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 @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 def fetch_nostr_event_from_description memo_json = JSON.parse(@payload[:memo]) Nostr::Event.new(**memo_json.to_h.symbolize_keys) rescue nil 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