Refactor user preferences, add defaults from file
* Turn prefs into a flat hash structure, since nesting is not worth the trouble * Add a custom serializer class for prefs * Add a config file for defaults and merge set prefs with unset ones * Use booleans for "true" and "false", and integers where appropriate
This commit is contained in:
parent
ca7475dca2
commit
4e2e13108c
@ -45,8 +45,8 @@ class SettingsController < ApplicationController
|
|||||||
|
|
||||||
def user_params
|
def user_params
|
||||||
params.require(:user).permit(preferences: [
|
params.require(:user).permit(preferences: [
|
||||||
lightning: [:notify_sats_received],
|
:lightning_notify_sats_received,
|
||||||
xmpp: [:exchange_contacts_with_invitees]
|
:xmpp_exchange_contacts_with_invitees
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -12,7 +12,7 @@ class WebhooksController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
user = User.find_by!(ln_account: payload[:user_login])
|
user = User.find_by!(ln_account: payload[:user_login])
|
||||||
notify = user.preferences.dig("lightning", "notify_sats_received")
|
notify = user.preferences[:lightning_notify_sats_received]
|
||||||
case notify
|
case notify
|
||||||
when "xmpp"
|
when "xmpp"
|
||||||
notify_xmpp(user.address, payload[:amount], payload[:memo])
|
notify_xmpp(user.address, payload[:amount], payload[:memo])
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
class User < ApplicationRecord
|
class User < ApplicationRecord
|
||||||
include EmailValidatable
|
include EmailValidatable
|
||||||
|
|
||||||
serialize :preferences, Hash, default: {}
|
serialize :preferences, UserPreferences
|
||||||
|
|
||||||
# Relations
|
# Relations
|
||||||
has_many :invitations, dependent: :destroy
|
has_many :invitations, dependent: :destroy
|
||||||
@ -64,7 +64,7 @@ class User < ApplicationRecord
|
|||||||
|
|
||||||
if inviter.present?
|
if inviter.present?
|
||||||
if Setting.ejabberd_enabled? &&
|
if Setting.ejabberd_enabled? &&
|
||||||
inviter.pref_enabled?("xmpp:exchange_contacts_with_invitees")
|
inviter.preferences[:xmpp_exchange_contacts_with_invitees]
|
||||||
exchange_xmpp_contact_with_inviter
|
exchange_xmpp_contact_with_inviter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -138,11 +138,6 @@ class User < ApplicationRecord
|
|||||||
ldap.delete_attribute(dn,:service)
|
ldap.delete_attribute(dn,:service)
|
||||||
end
|
end
|
||||||
|
|
||||||
def pref_enabled?(key)
|
|
||||||
value = preferences.dig(*key.split(":"))
|
|
||||||
[true, "true", "enabled", 1].include?(value)
|
|
||||||
end
|
|
||||||
|
|
||||||
def exchange_xmpp_contact_with_inviter
|
def exchange_xmpp_contact_with_inviter
|
||||||
return unless inviter.services_enabled.include?("xmpp") &&
|
return unless inviter.services_enabled.include?("xmpp") &&
|
||||||
services_enabled.include?("xmpp")
|
services_enabled.include?("xmpp")
|
||||||
|
29
app/models/user_preferences.rb
Normal file
29
app/models/user_preferences.rb
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
DEFAULT_PREFS = YAML.load_file("#{Rails.root}/config/default_preferences.yml")
|
||||||
|
|
||||||
|
class UserPreferences
|
||||||
|
def self.dump(value)
|
||||||
|
process(value).to_yaml
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.load(string)
|
||||||
|
stored_prefs = YAML.load(string || "{}")
|
||||||
|
DEFAULT_PREFS.merge(stored_prefs).with_indifferent_access
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.is_integer?(value)
|
||||||
|
value.to_i.to_s == value
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.process(hash)
|
||||||
|
hash.each do |key, value|
|
||||||
|
if value == "true"
|
||||||
|
hash[key] = true
|
||||||
|
elsif value == "false"
|
||||||
|
hash[key] = false
|
||||||
|
elsif value.is_a?(String) && is_integer?(value)
|
||||||
|
hash[key] = value.to_i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hash.stringify_keys!.to_h
|
||||||
|
end
|
||||||
|
end
|
@ -8,13 +8,11 @@
|
|||||||
description: "Notify me when sats are sent to my Lightning Address"
|
description: "Notify me when sats are sent to my Lightning Address"
|
||||||
) do %>
|
) do %>
|
||||||
<% f.fields_for :preferences do |p| %>
|
<% f.fields_for :preferences do |p| %>
|
||||||
<% p.fields_for :lightning do |l| %>
|
<%= p.select :lightning_notify_sats_received, options_for_select([
|
||||||
<%= l.select :notify_sats_received, options_for_select([
|
["off", "disabled"],
|
||||||
["off", "off"],
|
["Chat (Jabber)", "xmpp"],
|
||||||
["Chat (Jabber)", "xmpp"],
|
["E-Mail", "email"]
|
||||||
["E-Mail", "email"]
|
], selected: @user.preferences[:lightning_notify_sats_received]) %>
|
||||||
], selected: @user.preferences.dig('lightning', 'notify_sats_received')) %>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
<h3>Contacts</h3>
|
<h3>Contacts</h3>
|
||||||
<ul role="list">
|
<ul role="list">
|
||||||
<%= render FormElements::FieldsetToggleComponent.new(
|
<%= render FormElements::FieldsetToggleComponent.new(
|
||||||
field_name: "user[preferences][xmpp][exchange_contacts_with_invitees]",
|
field_name: "user[preferences][xmpp_exchange_contacts_with_invitees]",
|
||||||
enabled: @user.pref_enabled?("xmpp:exchange_contacts_with_invitees"),
|
enabled: @user.preferences[:xmpp_exchange_contacts_with_invitees],
|
||||||
title: "Exchange contacts when invited user signs up",
|
title: "Exchange contacts when invited user signs up",
|
||||||
description: "Add each others contacts, so you can chat with them immediately"
|
description: "Add each others contacts, so you can chat with them immediately"
|
||||||
) %>
|
) %>
|
||||||
|
2
config/default_preferences.yml
Normal file
2
config/default_preferences.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
lightning_notify_sats_received: disabled # or xmpp, email
|
||||||
|
xmpp_exchange_contacts_with_invitees: true
|
41
spec/models/user_preferences_spec.rb
Normal file
41
spec/models/user_preferences_spec.rb
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe UserPreferences, type: :model do
|
||||||
|
let(:default_prefs) { YAML.load_file("#{Rails.root}/config/default_preferences.yml") }
|
||||||
|
|
||||||
|
describe ".load" do
|
||||||
|
it "provides default values when no preferences are stored yet" do
|
||||||
|
expect(UserPreferences.load(nil)).to eq(default_prefs)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "provides default values for unset preferences" do
|
||||||
|
prefs = UserPreferences.load("lightning_notify_sats_received: xmpp")
|
||||||
|
expect(prefs[:lightning_notify_sats_received]).to eq("xmpp")
|
||||||
|
expect(prefs[:xmpp_exchange_contacts_with_invitees]).to eq(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe ".process" do
|
||||||
|
it "turns all keys into strings" do
|
||||||
|
res = UserPreferences.process({ foo: "bar" })
|
||||||
|
expect(res[:foo]).to be(nil)
|
||||||
|
expect(res['foo']).to eq("bar")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "converts value 'true' to boolean" do
|
||||||
|
res = UserPreferences.process({ lightning_notify_sats_received: "true" })
|
||||||
|
expect(res['lightning_notify_sats_received']).to be(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "converts value 'false' to boolean" do
|
||||||
|
res = UserPreferences.process({ lightning_notify_sats_received: "false" })
|
||||||
|
expect(res['lightning_notify_sats_received']).to be(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "converts value string with integer into integer" do
|
||||||
|
res = UserPreferences.process({ lightning_notify_sats_received_threshold: 1000 })
|
||||||
|
expect(res['lightning_notify_sats_received_threshold']).to be_a(Integer)
|
||||||
|
expect(res['lightning_notify_sats_received_threshold']).to eq(1000)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -140,7 +140,7 @@ RSpec.describe User, type: :model do
|
|||||||
|
|
||||||
before do
|
before do
|
||||||
# TODO remove when defaults are implemented
|
# TODO remove when defaults are implemented
|
||||||
user.update! preferences: {"xmpp" => { "exchange_contacts_with_invitees" => true }}
|
user.update! preferences: { xmpp_exchange_contacts_with_invitees: true }
|
||||||
Invitation.create! user: user, invited_user_id: guest.id, used_at: DateTime.now
|
Invitation.create! user: user, invited_user_id: guest.id, used_at: DateTime.now
|
||||||
allow_any_instance_of(User).to receive(:enable_service).and_return(true)
|
allow_any_instance_of(User).to receive(:enable_service).and_return(true)
|
||||||
end
|
end
|
||||||
@ -152,7 +152,7 @@ RSpec.describe User, type: :model do
|
|||||||
|
|
||||||
context "automatic contact exchange disabled" do
|
context "automatic contact exchange disabled" do
|
||||||
before do
|
before do
|
||||||
user.update! preferences: {"xmpp" => { "exchange_contacts_with_invitees" => false }}
|
user.update! preferences: { xmpp_exchange_contacts_with_invitees: false }
|
||||||
end
|
end
|
||||||
|
|
||||||
it "does not exchange XMPP contacts with the inviter" do
|
it "does not exchange XMPP contacts with the inviter" do
|
||||||
@ -162,50 +162,4 @@ RSpec.describe User, type: :model do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#pref_enabled?" do
|
|
||||||
describe "preference not set" do
|
|
||||||
# TODO return default value
|
|
||||||
it "returns false" do
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "preference is set" do
|
|
||||||
it "returns true for boolean true" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => true}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns true for string 'true'" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => "true"}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns true for string 'enabled'" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => "enabled"}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns true for integer 1" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => 1}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns false for boolean false" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => false}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns false for string 'false'" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => "false"}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "returns false for integer 0" do
|
|
||||||
user.preferences.merge!({"lightning" => {"notify_sats_received" => 0}})
|
|
||||||
expect(user.pref_enabled?("lightning:notify_sats_received")).to be(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
@ -68,7 +68,7 @@ RSpec.describe "Webhooks", type: :request do
|
|||||||
|
|
||||||
context "notification preference set to 'xmpp'" do
|
context "notification preference set to 'xmpp'" do
|
||||||
before do
|
before do
|
||||||
user.update! preferences: { "lightning" => { "notify_sats_received" => "xmpp" }}
|
user.update! preferences: { lightning_notify_sats_received: "xmpp" }
|
||||||
post "/webhooks/lndhub", params: payload.to_json
|
post "/webhooks/lndhub", params: payload.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ RSpec.describe "Webhooks", type: :request do
|
|||||||
|
|
||||||
context "notification preference set to 'email'" do
|
context "notification preference set to 'email'" do
|
||||||
before do
|
before do
|
||||||
user.update! preferences: { "lightning" => { "notify_sats_received" => "email" }}
|
user.update! preferences: { lightning_notify_sats_received: "email" }
|
||||||
post "/webhooks/lndhub", params: payload.to_json
|
post "/webhooks/lndhub", params: payload.to_json
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user