68 lines
1.7 KiB
Ruby
68 lines
1.7 KiB
Ruby
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 = @user.zaps.find_by(payment_request: @payload[:payment_request])
|
|
zap_receipt = NostrManager::CreateZapReceipt.call(
|
|
zap: zap,
|
|
paid_at: Time.parse(@payload[:settled_at]).to_i,
|
|
preimage: @payload[:preimage]
|
|
)
|
|
zap.update! 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
|
|
case @user.preferences[:lightning_notify_sats_received]
|
|
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
|