From 23821f9e65bb256422a8017a02931411936f2ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Tue, 4 Apr 2023 12:27:49 +0200 Subject: [PATCH] Add preferences to user model --- app/models/user.rb | 7 +++ ...20230403135149_add_preferences_to_users.rb | 5 ++ db/schema.rb | 4 +- spec/models/user_spec.rb | 46 +++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20230403135149_add_preferences_to_users.rb diff --git a/app/models/user.rb b/app/models/user.rb index 5b40929..c1851a4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,8 @@ class User < ApplicationRecord include EmailValidatable + serialize :preferences, Hash, default: {} + # Relations has_many :invitations, dependent: :destroy has_one :invitation, inverse_of: :invitee, foreign_key: 'invited_user_id' @@ -133,6 +135,11 @@ class User < ApplicationRecord ldap.delete_attribute(dn,:service) end + def pref_enabled?(key) + value = preferences.dig(*key.split(":")) + [true, "true", 1, "enabled"].include?(value) + end + def exchange_xmpp_contact_with_inviter return unless inviter.services_enabled.include?("ejabberd") && services_enabled.include?("ejabberd") diff --git a/db/migrate/20230403135149_add_preferences_to_users.rb b/db/migrate/20230403135149_add_preferences_to_users.rb new file mode 100644 index 0000000..2defcb3 --- /dev/null +++ b/db/migrate/20230403135149_add_preferences_to_users.rb @@ -0,0 +1,5 @@ +class AddPreferencesToUsers < ActiveRecord::Migration[7.0] + def change + add_column :users, :preferences, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index a292eed..1a85f04 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_03_19_101128) do +ActiveRecord::Schema[7.0].define(version: 2023_04_03_135149) do create_table "donations", force: :cascade do |t| t.integer "user_id" t.integer "amount_sats" @@ -57,8 +57,10 @@ ActiveRecord::Schema[7.0].define(version: 2023_03_19_101128) do t.text "ln_login_ciphertext" t.text "ln_password_ciphertext" t.string "ln_account" + t.string "nostr_pubkey" t.datetime "remember_created_at" t.string "remember_token" + t.text "preferences" t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 1dfc1ac..37db8ae 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -149,4 +149,50 @@ RSpec.describe User, type: :model do 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