OpenSCAP/foreman_openscap

View on GitHub
app/controllers/api/v2/compliance/scap_contents_controller.rb

Summary

Maintainability
A
50 mins
Test Coverage
require 'foreman_openscap/bulk_upload'

module Api::V2
  module Compliance
    class ScapContentsController < ::Api::V2::BaseController
      include Foreman::Controller::Parameters::ScapContent
      include ForemanOpenscap::BodyLogExtensions
      include ForemanOpenscap::Api::V2::ScapApiControllerExtensions

      def self.bulk_upload_types
        ['files', 'directory', 'default']
      end

      before_action :find_resource, :except => %w[index create bulk_upload]

      api :GET, '/compliance/scap_contents', N_('List SCAP contents')
      param_group :search_and_pagination, ::Api::V2::BaseController
      add_scoped_search_description_for(::ForemanOpenscap::ScapContent)

      def index
        @scap_contents = resource_scope_for_index(:permission => :view_scap_contents)
      end

      api :GET, '/compliance/scap_contents/:id/xml', N_('Download an SCAP content as XML')
      param :id, :identifier, :required => true

      def xml
        send_data @scap_content.scap_file,
                  :type     => 'application/xml',
                  :filename => @scap_content.original_filename || "#{@scap_content.title}.xml"
      end

      api :GET, '/compliance/scap_contents/:id', N_('Show an SCAP content')
      param :id, :identifier, :required => true
      def show
      end

      def_param_group :scap_content do
        param :scap_content, Hash, :required => true, :action_aware => true do
          param :title, String, :required => true, :desc => N_('SCAP content name')
          param :scap_file, String, :required => true, :desc => N_('XML containing SCAP content')
          param :original_filename, String, :desc => N_('Original file name of the XML file')
          param_group :taxonomies, ::Api::V2::BaseController
        end
      end

      api :POST, '/compliance/scap_contents', N_('Create SCAP content')
      param_group :scap_content, :as => :create

      def create
        @scap_content = ForemanOpenscap::ScapContent.new(scap_content_params)
        process_response @scap_content.save
      end

      api :PUT, '/compliance/scap_contents/:id', N_('Update an SCAP content')
      param :id, :identifier, :required => true
      param_group :scap_content

      def update
        process_response @scap_content.update(scap_content_params)
      end

      api :DELETE, '/compliance/scap_contents/:id', N_('Deletes an SCAP content')
      param :id, :identifier, :required => true

      def destroy
        process_response @scap_content.destroy
      end

      api :POST, '/compliance/scap_contents/bulk_upload', N_('Upload scap contents in bulk')
      param :type, bulk_upload_types, :required => true, :desc => N_('Type of the upload')
      param :files, Array, :desc => N_('File paths to upload when using "files" upload type')
      param :directory, String, :desc => N_('Directory to upload when using "directory" upload type')

      def bulk_upload
        case params[:type]
        when 'files'
          @result = ForemanOpenscap::BulkUpload.new.upload_from_files(params[:files])
        when 'directory'
          @result = ForemanOpenscap::BulkUpload.new.upload_from_directory(params[:directory])
        when 'default'
          @result = ForemanOpenscap::BulkUpload.new.upload_from_scap_guide
        else
          return render :json => {
            :errors => [
              _("Please specify import type, received: %{received}, expected one of: %{expected}") %
                { :expected => self.class.bulk_upload_types.join(', '), :received => params[:type] }
            ]
          }, :status => :unprocessable_entity
        end
      end

      private

      def find_resource
        not_found && return if params[:id].blank?
        instance_variable_set("@scap_content", resource_scope.find(params[:id]))
      end

      def action_permission
        case params[:action]
        when 'bulk_upload'
          :create
        when 'xml'
          :view
        else
          super
        end
      end
    end
  end
end