datacite/schnauzer

View on GitHub
app/controllers/re3data_controller.rb

Summary

Maintainability
B
5 hrs
Test Coverage
B
85%
class Re3dataController < ApplicationController
  before_action :set_repository, only: [:show, :badge]

  def index
    sort = case params[:sort]
           when "relevance" then { _score: { order: 'desc' }}
           when "name" then { "repositoryName.sortable" => { order: 'asc' }}
           when "-name" then { "repositoryName.sortable" => { order: 'desc' }}
           when "created" then { created: { order: 'asc' }}
           when "-created" then { created: { order: 'desc' }}
           else { "repositoryName.sortable" => { order: 'asc' }}
           end

    page = params[:page] || {}
    if page[:size].present? 
      page[:size] = [page[:size].to_i, 1000].min
      max_number = page[:size] > 0 ? 10000/page[:size] : 1
    else
      page[:size] = 25
      max_number = 10000/page[:size]
    end
    page[:number] = page[:number].to_i > 0 ? [page[:number].to_i, max_number].min : 1

    if params[:id].present?
      response = Repository.find_by_id(params[:id])
    elsif params[:ids].present?
      response = Repository.find_by_id(params[:ids], page: page, sort: sort)
    else
      response = Repository.query(params[:query], 
        page: page, 
        sort: sort, 
        subject: params[:subject],
        open: params[:open], 
        certified: params[:certified],
        pid: params[:pid],
        software: params[:software],
        disciplinary: params[:disciplinary])
    end

    total = response.total
    total_pages = page[:size] > 0 ? (total.to_f / page[:size]).ceil : 0

    @repositories = response.results

    options = {}
    options[:meta] = {
      total: total,
      "totalPages" => total_pages,
      page: page[:number]
    }.compact

    options[:links] = {
      self: request.original_url,
      next: @repositories.blank? ? nil : request.base_url + "/repositories?" + {
        query: params[:query],
        "page[number]" => page[:number] + 1,
        "page[size]" => page[:size],
        sort: params[:sort] }.compact.to_query
      }.compact
    options[:is_collection] = true

    render json: Re3dataSerializer.new(@repositories, options).serialized_json, status: :ok
  rescue Elasticsearch::Transport::Transport::Errors::LengthRequired
    render json: []
  end

  def show
    options = {}
    options[:is_collection] = false

    render json: Re3dataSerializer.new(@repository, options).serialized_json, status: :ok
  end

  def suggest
    response = Repository.suggest(params[:query])

    render json: response.dig("suggest", "phrase_prefix", 0, "options").map { |s| s["text"] }.to_json
  end

  def badge
    url= "http://www.re3data.org/public/badges/s/light/#{@repository.identifier["re3data"]}"
    result = Maremma.get(url, accept: "image/svg+xml", raw: true)

    render body: result.body.fetch("data", nil), content_type: "image/svg+xml"
  end

  protected

  def set_repository
    @repository = Repository.find_by_id(params[:id]).first
    fail Elasticsearch::Transport::Transport::Errors::NotFound unless @repository.present?
  end
end