app/controllers/api/v1/job.rb

Summary

Maintainability
B
5 hrs
Test Coverage
module API
  module V1
    class Job < Grape::API
      version 'v1'
      format :json

      resource :jobs do
        desc 'List my jobs'
        get '/' do
          ::Job.where(user: current_user)
        end

        desc 'Get job with ID'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.format_for_api
          end
        end

        desc 'Get job parameters'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get '/parameters' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            ps = ParametersService.new(job)
            ps.validate_params
          end
        end

        desc 'Get progress steps job'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get '/progress' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.progress_steps
          end
        end

        desc 'Get status job'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get '/status' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            ::Job.statuses[job.status]
          end
        end

        desc 'Get result action report job'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get '/result_report' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.result_action_report
          end
        end

        desc 'Get action report job'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get '/action_report' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.action_report
          end
        end

        desc 'Get validation report job'
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          get '/validation_report' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.validation_report
          end
        end

        desc 'Download result (CSV or Converted file)'
        params do
          requires :id, type: Integer, desc: 'Job id.'
          optional :default_view, type: String, desc: 'files or lines'
        end
        route_param :id do
          get '/download' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            datas, args = job.download_result(params[:default_view])
            content_type args[:type]
            env['api.format'] = :binary
            header 'Content-Disposition', "attachment; filename*=UTF-8''#{args[:filename]}"
            body datas
          end
        end

        desc 'Cancel job '
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          delete '/cancel' do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.ievkit_cancel_or_delete(:cancel)
            job.destroy
            body false
          end
        end

        desc 'Delete job '
        params do
          requires :id, type: Integer, desc: 'Job id.'
        end
        route_param :id do
          delete do
            job = ::Job.find_by(id: params[:id], user: current_user)
            error! :not_found, 404 unless job
            job.ievkit_cancel_or_delete(:delete)
            job.destroy
            body false
          end
        end

        desc 'Post new url job'
        params do
          requires :format, type: String, desc: 'Format', values: %w(gtfs neptune)
          requires :url, type: String, desc: 'URL'
          requires :iev_action, type: String, desc: 'Action', values: %w(validate_job convert_job)
          optional :format_convert, type: String, desc: 'Format to convert', values: %w(convert_gtfs convert_neptune)
          optional :object_id_prefix, type: String, desc: 'IDs prefix'
          optional :time_zone, type: String, desc: 'Time zone'
          optional :ignore_last_word, type: Boolean, desc: 'Ignore the last word'
          optional :ignore_end_chars, type: Integer, desc: 'Ignore the last n characters'
          optional :max_distance_for_commercial, type: Integer, desc: 'Max distance to produce zones ( in meters )'
          optional :max_distance_for_connection_link, type: Integer, desc: 'Max distance to create connections'
          optional :parameters, type: String, desc: 'JSON for parameters'
        end
        post '/url' do
          job = ::Job.new
          job.user = current_user
          job.format = params[:format]
          job.iev_action = params[:iev_action]
          job.format_convert = params[:format_convert] if params[:format_convert].present?
          job.object_id_prefix = params[:object_id_prefix ]
          job.time_zone = params[:time_zone ]
          job.ignore_last_word = params[:ignore_last_word] if params[:ignore_last_word].present?
          job.ignore_end_chars = params[:ignore_end_chars].to_i
          job.max_distance_for_commercial = params[:max_distance_for_commercial].to_i
          job.max_distance_for_connection_link = params[:max_distance_for_connection_link].to_i
          job.url = params[:url]
          job.parameters = JSON.parse(params[:parameters]) if params[:parameters].present?
          if job.save
            url = Rails.application.routes.url_helpers.job_url(job.id)
            job.launch_jobs(url)
            job
          else
            job.errors.messages
          end
        end

        desc 'Post new file job'
        params do
          requires :format, type: String, desc: 'Format', values: %w(gtfs neptune)
          requires :file, type: File, desc: 'File'
          requires :iev_action, type: String, desc: 'Action', values: %w(validate_job convert_job)
          optional :format_convert, type: String, desc: 'Format to convert', values: %w(convert_gtfs convert_neptune)
          optional :object_id_prefix, type: String, desc: 'IDs prefix'
          optional :time_zone, type: String, desc: 'Time zone'
          optional :ignore_last_word, type: Boolean, desc: 'Ignore the last word'
          optional :ignore_end_chars, type: Integer, desc: 'Ignore the last n characters'
          optional :max_distance_for_commercial, type: Integer, desc: 'Max distance to produce zones ( in meters )'
          optional :max_distance_for_connection_link, type: Integer, desc: 'Max distance to create connections'
          optional :parameters, type: String, desc: 'JSON for parameters'
        end
        post '/file' do
          job = ::Job.new
          job.user = current_user
          job.format = params[:format]
          job.iev_action = params[:iev_action]
          job.format_convert = params[:format_convert] if params[:format_convert].present?
          job.object_id_prefix = params[:object_id_prefix ]
          job.time_zone = params[:time_zone ]
          job.ignore_last_word = params[:ignore_last_word] if params[:ignore_last_word].present?
          job.ignore_end_chars = params[:ignore_end_chars].to_i
          job.max_distance_for_commercial = params[:max_distance_for_commercial].to_i
          job.max_distance_for_connection_link = params[:max_distance_for_connection_link].to_i
          job.parameters = JSON.parse(params[:parameters]) if params[:parameters].present?
          job.file = params[:file]
          if job.save
            url = Rails.application.routes.url_helpers.job_url(job.id)
            job.launch_jobs(url)
            job
          else
            job.errors.messages
          end
        end
      end
    end
  end
end