varvet/godmin

View on GitHub
lib/godmin/resources/resource_service.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "godmin/resources/resource_service/associations"
require "godmin/resources/resource_service/batch_actions"
require "godmin/resources/resource_service/filters"
require "godmin/resources/resource_service/ordering"
require "godmin/resources/resource_service/pagination"
require "godmin/resources/resource_service/scopes"

module Godmin
  module Resources
    module ResourceService
      extend ActiveSupport::Concern

      include Associations
      include BatchActions
      include Filters
      include Ordering
      include Pagination
      include Scopes

      attr_reader :options

      def initialize(options = {})
        @options = options
      end

      def resource_class
        self.class.name.chomp("Service").constantize
      end

      def resources_relation
        if options[:resource_parent].present?
          resource_class.where(options[:resource_parent].class.name.underscore => options[:resource_parent])
        else
          resource_class.all
        end
      end

      def resources(params)
        apply_pagination(
          params[:page], apply_order(
            params[:order], apply_filters(
              params[:filter], apply_scope(
                params[:scope], resources_relation
              )
            )
          )
        )
      end

      def find_resource(id)
        resources_relation.find(id)
      end

      def build_resource(params)
        resources_relation.new(params)
      end

      def create_resource(resource)
        resource.save
      end

      def update_resource(resource, params)
        resource.update(params)
      end

      def destroy_resource(resource)
        resource.destroy
      end

      def attrs_for_index
        self.class.attrs_for_index
      end

      def attrs_for_show
        self.class.attrs_for_show
      end

      def attrs_for_form
        self.class.attrs_for_form
      end

      def attrs_for_export
        self.class.attrs_for_export
      end

      module ClassMethods
        def attrs_for_index(*attrs)
          @attrs_for_index = attrs if attrs.present?
          @attrs_for_index || []
        end

        def attrs_for_show(*attrs)
          @attrs_for_show = attrs if attrs.present?
          @attrs_for_show || []
        end

        def attrs_for_form(*attrs)
          @attrs_for_form = attrs if attrs.present?
          @attrs_for_form || []
        end

        def attrs_for_export(*attrs)
          @attrs_for_export = attrs if attrs.present?
          @attrs_for_export || []
        end
      end
    end
  end
end