diff --git a/app/models/developer.rb b/app/models/developer.rb new file mode 100644 index 000000000..296808c3d --- /dev/null +++ b/app/models/developer.rb @@ -0,0 +1,22 @@ +require_dependency 'distributed_cache' + +class Developer < ActiveRecord::Base + belongs_to :user + + after_save :rebuild_cache + after_destroy :rebuild_cache + + @id_cache = DistributedCache.new('developer_ids') + + def self.user_ids + @id_cache["ids"] ||= rebuild_cache + end + + def self.rebuild_cache + @id_cache["ids"] = Set.new(Developer.pluck(:user_id)) + end + + def rebuild_cache + Developer.rebuild_cache + end +end diff --git a/db/migrate/20160727233044_create_developers_table.rb b/db/migrate/20160727233044_create_developers_table.rb new file mode 100644 index 000000000..3a87ee59e --- /dev/null +++ b/db/migrate/20160727233044_create_developers_table.rb @@ -0,0 +1,7 @@ +class CreateDevelopersTable < ActiveRecord::Migration + def change + create_table :developers do |t| + t.integer :user_id, null: false + end + end +end diff --git a/lib/guardian.rb b/lib/guardian.rb index c09e11ba9..ecfedc92e 100644 --- a/lib/guardian.rb +++ b/lib/guardian.rb @@ -74,7 +74,8 @@ class Guardian ( Rails.configuration.respond_to?(:developer_emails) && Rails.configuration.developer_emails.include?(@user.email) - ) + ) || + Developer.user_ids.include?(@user.id) ) end diff --git a/spec/models/developer_spec.rb b/spec/models/developer_spec.rb new file mode 100644 index 000000000..f980ef693 --- /dev/null +++ b/spec/models/developer_spec.rb @@ -0,0 +1,20 @@ +require 'rails_helper' + +describe Developer do + it "can correctly flag developer accounts" do + user = Fabricate(:user) + guardian = Guardian.new(user) + + expect(guardian.is_developer?).to eq(false) + + Developer.create!(user_id: user.id) + + # not an admin so not a developer yet + expect(guardian.is_developer?).to eq(false) + + user.update_columns(admin: true) + + expect(guardian.is_developer?).to eq(true) + end +end +