class WebhooksController < ApplicationController skip_forgery_protection before_action :authorize_request def lndhub 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 user = User.find_by!(ln_account: payload[:user_login]) notify = user.preferences[:lightning_notify_sats_received] case notify when "xmpp" notify_xmpp(user.address, payload[:amount], payload[:memo]) when "email" NotificationMailer.with(user: user, amount_sats: payload[:amount]) .lightning_sats_received.deliver_later end head :ok end private # TODO refactor into mailer-like generic class/service def notify_xmpp(address, amt_sats, memo) payload = { type: "normal", from: "kosmos.org", # TODO domain config to: address, subject: "Sats received!", body: "#{helpers.number_with_delimiter amt_sats} sats received in your Lightning wallet:\n> #{memo}" } XmppSendMessageJob.perform_later(payload) end def authorize_request if !ENV['WEBHOOKS_ALLOWED_IPS'].split(',').include?(request.remote_ip) head :forbidden and return end end end