mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
REFACTOR: Move option to return emails into the serializer
This makes more sense than having the guardian take an accessor. The logic belongs in the Serializer, where the JSON is calculated. Also removed some of the DRYness in the spec. It's fewer lines and made it easier to test the option on the serializer.
This commit is contained in:
parent
f94c0283b2
commit
dbe42068a2
@ -32,12 +32,13 @@ class Admin::UsersController < Admin::AdminController
|
|||||||
def index
|
def index
|
||||||
users = ::AdminUserIndexQuery.new(params).find_users
|
users = ::AdminUserIndexQuery.new(params).find_users
|
||||||
|
|
||||||
|
opts = {}
|
||||||
if params[:show_emails] == "true"
|
if params[:show_emails] == "true"
|
||||||
guardian.can_see_emails = true
|
|
||||||
StaffActionLogger.new(current_user).log_show_emails(users)
|
StaffActionLogger.new(current_user).log_show_emails(users)
|
||||||
|
opts[:emails_desired] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
render_serialized(users, AdminUserListSerializer)
|
render_serialized(users, AdminUserListSerializer, opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@ -39,7 +39,7 @@ class AdminUserListSerializer < BasicUserSerializer
|
|||||||
def include_email?
|
def include_email?
|
||||||
# staff members can always see their email
|
# staff members can always see their email
|
||||||
(scope.is_staff? && (object.id == scope.user.id || object.staged?)) ||
|
(scope.is_staff? && (object.id == scope.user.id || object.staged?)) ||
|
||||||
(scope.is_admin? && scope.can_see_emails?)
|
(scope.is_admin? && @options[:emails_desired])
|
||||||
end
|
end
|
||||||
|
|
||||||
alias_method :include_secondary_emails?, :include_email?
|
alias_method :include_secondary_emails?, :include_email?
|
||||||
|
@ -54,7 +54,6 @@ class Guardian
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
attr_accessor :can_see_emails
|
|
||||||
attr_reader :request
|
attr_reader :request
|
||||||
|
|
||||||
def initialize(user = nil, request = nil)
|
def initialize(user = nil, request = nil)
|
||||||
@ -381,10 +380,6 @@ class Guardian
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_see_emails?
|
|
||||||
@can_see_emails
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_export_entity?(entity)
|
def can_export_entity?(entity)
|
||||||
return false unless @user
|
return false unless @user
|
||||||
return true if is_admin?
|
return true if is_admin?
|
||||||
|
@ -8,92 +8,59 @@ describe AdminUserListSerializer do
|
|||||||
let(:moderator) { Fabricate(:user_single_email, moderator: true, email: "moderator@email.com") }
|
let(:moderator) { Fabricate(:user_single_email, moderator: true, email: "moderator@email.com") }
|
||||||
let(:user) { Fabricate(:user_single_email, email: "user@email.com") }
|
let(:user) { Fabricate(:user_single_email, email: "user@email.com") }
|
||||||
let(:guardian) { Guardian.new(admin) }
|
let(:guardian) { Guardian.new(admin) }
|
||||||
let(:mod_guardian) { Guardian.new(moderator) }
|
|
||||||
|
|
||||||
let(:json) do
|
let(:serializer) do
|
||||||
AdminUserListSerializer.new(user,
|
AdminUserListSerializer.new(user, scope: guardian, root: false)
|
||||||
scope: guardian,
|
|
||||||
root: false
|
|
||||||
).as_json
|
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:mod_json) do
|
def serialize(user, viewed_by, opts = nil)
|
||||||
AdminUserListSerializer.new(user,
|
AdminUserListSerializer.new(
|
||||||
scope: mod_guardian,
|
user,
|
||||||
root: false
|
scope: Guardian.new(viewed_by),
|
||||||
|
root: false,
|
||||||
|
emails_desired: opts && opts[:emails_desired]
|
||||||
).as_json
|
).as_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def fabricate_secondary_emails_for(u)
|
def fabricate_secondary_emails_for(u)
|
||||||
["first", "second"].each do |name|
|
Fabricate(:secondary_email, user: u, email: "first@email.com")
|
||||||
Fabricate(:secondary_email, user: u, email: "#{name}@email.com")
|
Fabricate(:secondary_email, user: u, email: "second@email.com")
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples "shown" do |email|
|
it "contains an admin's own emails" do
|
||||||
it "contains emails" do
|
fabricate_secondary_emails_for(admin)
|
||||||
expect(json[:email]).to eq(email)
|
json = serialize(admin, admin)
|
||||||
|
expect(json[:email]).to eq("admin@email.com")
|
||||||
expect(json[:secondary_emails]).to contain_exactly(
|
expect(json[:secondary_emails]).to contain_exactly("first@email.com", "second@email.com")
|
||||||
"first@email.com",
|
|
||||||
"second@email.com"
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples "not shown" do
|
it "doesn't include a regular user's emails" do
|
||||||
it "doesn't contain emails" do
|
fabricate_secondary_emails_for(user)
|
||||||
expect(json[:email]).to eq(nil)
|
json = serialize(user, user)
|
||||||
expect(json[:secondary_emails]).to eq(nil)
|
expect(json[:email]).to eq(nil)
|
||||||
end
|
expect(json[:secondary_emails]).to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with myself" do
|
it "doesn't return emails for a moderator request" do
|
||||||
let(:user) { admin }
|
fabricate_secondary_emails_for(user)
|
||||||
|
json = serialize(user, moderator, emails_desired: true)
|
||||||
before do
|
expect(json[:email]).to eq(nil)
|
||||||
fabricate_secondary_emails_for(admin)
|
expect(json[:secondary_emails]).to eq(nil)
|
||||||
end
|
|
||||||
|
|
||||||
include_examples "shown", "admin@email.com"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with a normal user" do
|
it "returns emails for admins when emails_desired is true" do
|
||||||
before do
|
fabricate_secondary_emails_for(user)
|
||||||
fabricate_secondary_emails_for(user)
|
json = serialize(user, admin, emails_desired: true)
|
||||||
end
|
expect(json[:email]).to eq("user@email.com")
|
||||||
|
expect(json[:secondary_emails]).to contain_exactly("first@email.com", "second@email.com")
|
||||||
include_examples "not shown"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when moderator makes a request with show_emails param set to true" do
|
it "returns a staged user's emails" do
|
||||||
before do
|
user.staged = true
|
||||||
mod_guardian.can_see_emails = true
|
fabricate_secondary_emails_for(user)
|
||||||
fabricate_secondary_emails_for(user)
|
json = serialize(user, admin)
|
||||||
end
|
expect(json[:email]).to eq("user@email.com")
|
||||||
|
expect(json[:secondary_emails]).to contain_exactly("first@email.com", "second@email.com")
|
||||||
it "doesn't contain emails" do
|
|
||||||
expect(mod_json[:email]).to eq(nil)
|
|
||||||
expect(mod_json[:secondary_emails]).to eq(nil)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "with a normal user after clicking 'show emails'" do
|
|
||||||
before do
|
|
||||||
guardian.can_see_emails = true
|
|
||||||
fabricate_secondary_emails_for(user)
|
|
||||||
end
|
|
||||||
|
|
||||||
include_examples "shown", "user@email.com"
|
|
||||||
end
|
|
||||||
|
|
||||||
context "with a staged user" do
|
|
||||||
before do
|
|
||||||
user.staged = true
|
|
||||||
fabricate_secondary_emails_for(user)
|
|
||||||
end
|
|
||||||
|
|
||||||
include_examples "shown", "user@email.com"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user