class WebhooksController < ApplicationController skip_forgery_protection before_action :authorize_request before_action :process_payload def lndhub @user = User.find_by!(lndhub_username: @payload[:user_login]) if @zap = @user.zaps.find_by(payment_request: @payload[:payment_request]) settled_at = Time.parse(@payload[:settled_at]) zap_receipt = NostrManager::CreateZapReceipt.call( zap: @zap, paid_at: settled_at.to_i, preimage: @payload[:preimage] ) @zap.update! settled_at: settled_at, receipt: zap_receipt.to_h NostrManager::PublishZapReceipt.call(zap: @zap) 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) unless @payload[:type] == "incoming" && @payload[:state] == "settled" head :no_content and return end rescue head :unprocessable_entity and return end def send_notifications return if @payload[:amount] < @user.preferences[:lightning_notify_min_sats] if @user.preferences[:lightning_notify_only_with_message] return if @payload[:memo].blank? end target = @zap.present? ? @user.preferences[:lightning_notify_zap_received] : @user.preferences[:lightning_notify_sats_received] case target 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