scinote-web/app/services/repository_snapshot_datatable_service.rb
2020-05-25 11:19:43 +02:00

66 lines
2.1 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 = build_conditions(@params)[:search_value]
order_obj = build_conditions(@params)[:order_by_column]
repository_rows = fetch_rows(search_value)
repository_rows = repository_rows.preload(Extends::REPOSITORY_ROWS_PRELOAD_RELATIONS)
@repository_rows = sort_rows(order_obj, repository_rows)
end
def fetch_rows(search_value)
repository_rows = @repository.repository_rows
@all_count = repository_rows.count
if search_value.present?
matched_by_user = repository_rows.joins(:created_by).where_attributes_like('users.full_name', search_value)
repository_row_matches = repository_rows
.where_attributes_like(['repository_rows.name', 'repository_rows.id'], search_value)
results = repository_rows.where(id: repository_row_matches)
results = results.or(repository_rows.where(id: matched_by_user))
Extends::REPOSITORY_EXTRA_SEARCH_ATTR.each do |field, include_hash|
custom_cell_matches = repository_rows.joins(repository_cells: include_hash)
.where_attributes_like(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