scinote-web/app/services/repository_snapshot_datatable_service.rb
2022-01-17 21:53:13 +01:00

66 lines
2 KiB
Ruby

# frozen_string_literal: true
class RepositorySnapshotDatatableService < RepositoryDatatableService
private
def create_columns_mappings
index = @repository.default_columns_count
@mappings = {}
@repository.repository_columns.order(:parent_id).each do |column|
@mappings[column.id] = index.to_s
index += 1
end
end
def process_query
search_value = @params[:search][:value]
order_params = @params[:order].first
order_by_column = { column: order_params[:column].to_i, dir: order_params[:dir] }
repository_rows = fetch_rows(search_value).preload(Extends::REPOSITORY_ROWS_PRELOAD_RELATIONS)
sort_rows(order_by_column, repository_rows)
end
def fetch_rows(search_value)
repository_rows = @repository.repository_rows
@all_count = repository_rows.count
if search_value.present?
repository_row_matches = repository_rows.where_attributes_like(@repository.default_search_fileds, search_value)
results = repository_rows.where(id: repository_row_matches)
data_types = @repository.repository_columns.pluck(:data_type).uniq
Extends::REPOSITORY_EXTRA_SEARCH_ATTR.each do |data_type, config|
next unless data_types.include?(data_type.to_s)
custom_cell_matches = repository_rows.joins(config[:includes])
.where_attributes_like(config[:field], search_value)
results = results.or(repository_rows.where(id: custom_cell_matches))
end
repository_rows = results
end
repository_rows.left_outer_joins(:created_by)
.select('repository_rows.*')
.select('COUNT("repository_rows"."id") OVER() AS filtered_count')
.group('repository_rows.id')
end
def build_sortable_columns
array = [
'repository_rows.parent_id',
'repository_rows.name',
'repository_rows.created_at',
'users.full_name'
]
@repository.repository_columns.count.times do
array << 'repository_cell.value'
end
array
end
end