Class: Activity::ResourceList::ResourceRetriever

Inherits:
Object
  • Object
show all
Defined in:
app/services/activity/resource_list.rb

Overview

Service object: resource retriever.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(party:, query: nil, page: nil, per_page: nil) ⇒ void

Parameters:

  • party (Party)

    party whose resources are retrieved

  • query (String, nil) (defaults to: nil)

    search query matched against reference numbers

  • page (Integer, nil) (defaults to: nil)

    page number (1-based, defaults to 1)

  • per_page (Integer, nil) (defaults to: nil)

    resources per page (defaults to 20)



79
80
81
82
83
84
85
86
87
# File 'app/services/activity/resource_list.rb', line 79

def initialize(party:, query: nil, page: nil, per_page: nil)
  @party = party
  @query = query
  @page = page.to_i
  @page = 1 if @page < 1
  @per_page = (per_page || 20).to_i
  @per_page = 20 if @per_page < 1
  @total_count = nil
end

Instance Attribute Details

#pageObject (readonly)

Returns the value of attribute page.



72
73
74
# File 'app/services/activity/resource_list.rb', line 72

def page
  @page
end

#partyObject (readonly)

Returns the value of attribute party.



72
73
74
# File 'app/services/activity/resource_list.rb', line 72

def party
  @party
end

#per_pageObject (readonly)

Returns the value of attribute per_page.



72
73
74
# File 'app/services/activity/resource_list.rb', line 72

def per_page
  @per_page
end

#queryObject (readonly)

Returns the value of attribute query.



72
73
74
# File 'app/services/activity/resource_list.rb', line 72

def query
  @query
end

Class Method Details

.build(resource_type, party:, query: nil, page: nil, per_page: nil) ⇒ ResourceRetriever

Instantiates the retriever subclass matching a resource type.

Parameters:

  • resource_type (Symbol)

    resource type key (e.g. :orders)

  • party (Party)

    party whose resources are retrieved

  • query (String, nil) (defaults to: nil)

    search query matched against reference numbers

  • page (Integer, nil) (defaults to: nil)

    page number (1-based, defaults to 1)

  • per_page (Integer, nil) (defaults to: nil)

    resources per page (defaults to 20)

Returns:



96
97
98
99
# File 'app/services/activity/resource_list.rb', line 96

def self.build(resource_type, party:, query: nil, page: nil, per_page: nil)
  retriever_class = "Activity::ResourceList::#{resource_type.to_s.classify}Retriever".constantize
  retriever_class.new(party: party, query: query, page: page, per_page: per_page)
end

Instance Method Details

#filter_results(_record_class, records) ⇒ ActiveRecord::Relation

Applies total-count capture, newest-first ordering, and pagination.

Parameters:

  • _record_class (Class)

    the resource's model class (unused)

  • records (ActiveRecord::Relation)

    matching records

Returns:

  • (ActiveRecord::Relation)

    paginated records



118
119
120
121
122
123
124
# File 'app/services/activity/resource_list.rb', line 118

def filter_results(_record_class, records)
  # Store the total count before applying pagination
  @total_count = records.count
  records.order(created_at: :desc)
         .limit(per_page)
         .offset((page - 1) * per_page)
end

#resourcesActiveRecord::Relation

Paginated resources for the party. Subclasses implement this.

Returns:

  • (ActiveRecord::Relation)

Raises:

  • (RuntimeError)

    always, in the base class



104
105
106
# File 'app/services/activity/resource_list.rb', line 104

def resources
  raise 'Not Implemented'
end

#total_countInteger

Total matching resources before pagination was applied.

Returns:

  • (Integer)


110
111
112
# File 'app/services/activity/resource_list.rb', line 110

def total_count
  @total_count || 0
end