FIX: Always serialize the correct attributes for DirectoryItems (#13510)

This commit is contained in:
Mark VanLandingham 2021-06-23 14:55:17 -05:00 committed by GitHub
parent 1702922a7c
commit 60a76737dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 27 deletions

View File

@ -28,7 +28,8 @@ class DirectoryItemsController < ApplicationController
order = params[:order] || DirectoryColumn.automatic_column_names.first
dir = params[:asc] ? 'ASC' : 'DESC'
if DirectoryColumn.active_column_names.include?(order.to_sym)
active_directory_column_names = DirectoryColumn.active_column_names
if active_directory_column_names.include?(order.to_sym)
result = result.order("directory_items.#{order} #{dir}, directory_items.id")
elsif params[:order] === 'username'
result = result.order("users.#{order} #{dir}, directory_items.id")
@ -108,6 +109,8 @@ class DirectoryItemsController < ApplicationController
serializer_opts[:plugin_column_ids] = params[:plugin_column_ids]&.split("|")&.map(&:to_i)
end
serializer_opts[:attributes] = active_directory_column_names
serialized = serialize_data(result, DirectoryItemSerializer, serializer_opts)
render_json_dump(directory_items: serialized,
meta: {

View File

@ -30,17 +30,11 @@ class EditDirectoryColumnsController < ApplicationController
end
end
update_directory_item_serializer_attributes
render json: success_json
end
private
def update_directory_item_serializer_attributes
::DirectoryItemSerializer.attributes(*DirectoryColumn.active_column_names)
end
def ensure_user_fields_have_columns
user_fields_without_column =
UserField.left_outer_joins(:directory_column)

View File

@ -25,21 +25,27 @@ class DirectoryItemSerializer < ApplicationSerializer
end
end
attributes :id,
:time_read
has_one :user, embed: :objects, serializer: UserSerializer
attributes *DirectoryColumn.active_column_names
attributes :id
def id
object.user_id
end
def time_read
object.user_stat.time_read
end
private
def include_time_read?
object.period_type == DirectoryItem.period_types[:all]
def attributes
hash = super
@options[:attributes].each do |attr|
hash.merge!("#{attr}": object[attr])
end
if object.period_type == DirectoryItem.period_types[:all]
hash.merge!(time_read: object.user_stat.time_read)
end
hash
end
end

View File

@ -1,11 +0,0 @@
# frozen_string_literal: true
class DirectorySerializer < ApplicationSerializer
attributes :id
has_many :directory_items, serializer: DirectoryItemSerializer, embed: :objects
def id
object.filter
end
end

View File

@ -0,0 +1,36 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe DirectoryItemSerializer do
fab!(:user) { Fabricate(:user) }
before do
DirectoryItem.refresh!
end
let :serializer do
directory_item = DirectoryItem.find_by(user: user, period_type: DirectoryItem.period_types[:all])
DirectoryItemSerializer.new(directory_item, { attributes: DirectoryColumn.active_column_names })
end
it "Serializes attributes for enabled directory_columns" do
DirectoryColumn.update_all(enabled: true)
payload = serializer.as_json
expect(payload[:directory_item].keys).to include(*DirectoryColumn.pluck(:name).map(&:to_sym))
end
it "Doesn't serialize attributes for disabled directory columns" do
DirectoryColumn.update_all(enabled: false)
directory_column = DirectoryColumn.first
directory_column.update(enabled: true)
payload = serializer.as_json
expect(payload[:directory_item].keys.count).to eq(4)
expect(payload[:directory_item]).to have_key(directory_column.name.to_sym)
expect(payload[:directory_item]).to have_key(:id)
expect(payload[:directory_item]).to have_key(:user)
expect(payload[:directory_item]).to have_key(:time_read)
end
end