50 行
1.5 KiB
Ruby
50 行
1.5 KiB
Ruby
class MaterialVersionsController < ApplicationController
|
|
def index
|
|
page = (params[:page].presence || 1).to_i
|
|
limit = (params[:limit].presence || 20).to_i
|
|
|
|
page = 1 if page < 1
|
|
limit = 1 if limit < 1
|
|
|
|
offset = (page - 1) * limit
|
|
|
|
q = MaterialVersion.includes(:created_by_user)
|
|
q = q.where(material_id: params[:material_id]) if params[:material_id].present?
|
|
q = q.where(tag_name: params[:tag].to_s.strip) if params[:tag].present?
|
|
q = q.where(event_type: params[:event_type]) if params[:event_type].present?
|
|
|
|
count = q.except(:order, :limit, :offset).count
|
|
versions =
|
|
q
|
|
.order(Arel.sql('material_versions.created_at DESC, material_versions.id DESC'))
|
|
.limit(limit)
|
|
.offset(offset)
|
|
|
|
render json: { versions: serialise_versions(versions), count: }
|
|
end
|
|
|
|
private
|
|
|
|
def serialise_versions rows
|
|
rows.map do |row|
|
|
{ id: row.id,
|
|
material_id: row.material_id,
|
|
version_no: row.version_no,
|
|
event_type: row.event_type,
|
|
tag_id: row.tag_id,
|
|
tag_name: row.tag_name,
|
|
tag_category: row.tag_category,
|
|
url: row.url,
|
|
file_blob_id: row.file_blob_id,
|
|
file_filename: row.file_filename,
|
|
file_content_type: row.file_content_type,
|
|
file_byte_size: row.file_byte_size,
|
|
file_sha256: row.file_sha256,
|
|
export_paths_json: row.export_paths_hash,
|
|
discarded_at: row.discarded_at,
|
|
created_by_user: row.created_by_user&.as_json(UserRepr::BASE),
|
|
created_at: row.created_at }
|
|
end
|
|
end
|
|
end
|