Class: ApiPresenter::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/api_presenter.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(current_user: nil, relation:, params: {}) ⇒ Base

Returns a new instance of Base.

Parameters:

  • current_user (User) (defaults to: nil)

    Optional. current_user context.

  • relation (ActiveRecord::Relation, Array)

    Relation or array-wrapped record(s) to present

  • params (Hash) (defaults to: {})

    Controller params

Options Hash (params:):

  • :count (Boolean)

    Optional. If true, return count only.

  • :include (String, Array)

    Optional. Associated resources to include.

  • :policies (Boolean)

    Optional. If true, resolve polciies for relation.



36
37
38
39
40
# File 'lib/api_presenter.rb', line 36

def initialize(current_user: nil, relation:, params: {})
  @current_user = current_user
  @relation     = relation
  @params       = params
end

Instance Attribute Details

#current_userObject (readonly)

Returns the value of attribute current_user.



12
13
14
# File 'lib/api_presenter.rb', line 12

def current_user
  @current_user
end

#paramsObject (readonly)

Returns the value of attribute params.



12
13
14
# File 'lib/api_presenter.rb', line 12

def params
  @params
end

#relationObject (readonly)

Returns the value of attribute relation.



12
13
14
# File 'lib/api_presenter.rb', line 12

def relation
  @relation
end

Class Method Details

.call(**kwargs) ⇒ ApiPresenter::Base

Examples:

@presenter = PostPresenter.call(
  current_user: current_user,
  relation:     relation,
  params:       params
)

Parameters:

  • current_user (User)

    Optional. current_user context.

  • relation (ActiveRecord::Relation, Array)

    Relation or array-wrapped record(s) to present

  • params (Hash)

    Controller params

Returns:



25
26
27
# File 'lib/api_presenter.rb', line 25

def self.call(**kwargs)
  new(kwargs).call
end

Instance Method Details

#associations_mapHash

This method is abstract.

Hash map that defines the sources for included collection names

Examples:

def associations_map
  {
    categories:     { associations: { sub_category: :category } },
    sub_categories: { associations: :sub_category },
    users:          { associations: [:creator, :publisher] }
  }
end

Returns:

  • (Hash)


136
137
138
# File 'lib/api_presenter.rb', line 136

def associations_map
  {}
end

#callApiPresenter::Base

Returns:



44
45
46
47
48
49
# File 'lib/api_presenter.rb', line 44

def call
  return self if count_only?
  initialize_resolvers
  call_resolvers
  self
end

#collectionActiveRecord::Relation, Array<ActiveRecord::Base>

Primary collection, empty if count requested

Returns:

  • (ActiveRecord::Relation, Array<ActiveRecord::Base>)


55
56
57
# File 'lib/api_presenter.rb', line 55

def collection
  count_only? ? [] : relation
end

#included_collection_namesArray<Symbol>

Class names of included collections

Examples:

[:categories, :sub_categories, :users]

Returns:

  • (Array<Symbol>)


90
91
92
# File 'lib/api_presenter.rb', line 90

def included_collection_names
  @included_collection_names ||= ParseIncludeParams.call(params[:include])
end

#included_collectionsHash

Map of included collection names and loaded record

Examples:

{
  categories:     [#<Category id:1>],
  sub_categories: [#<SubCategory id:1>],
  users:          [#<User id:1>, #<User id:2]
}

Returns:

  • (Hash)


105
106
107
# File 'lib/api_presenter.rb', line 105

def included_collections
  @included_collections_resolver ? @included_collections_resolver.resolved_collections : {}
end

#policies<Array<Hash>]

Policies for the primary collection

Examples:

[
  { post_id: 1, update: true, destroy: true },
  { post_id: 2, update: false, destroy: false }
]

Returns:

  • (<Array<Hash>])

    <Array<Hash>]



79
80
81
# File 'lib/api_presenter.rb', line 79

def policies
  @policies_resolver ? @policies_resolver.resolved_policies : {}
end

#policy_associationsSymbol+

This method is abstract.

Policy associations to preload to optimize policy resolution

Examples:

Single

def policy_associations
  :user_profile
end

Multiple

def policy_associations
  [:user_profile, :company]
end

Returns:

  • (Symbol, Array<Symbol>)


176
177
178
# File 'lib/api_presenter.rb', line 176

def policy_associations
  []
end

#policy_methodsSymbol+

This method is abstract.

Policy methods to resolve for the primary relation

Examples:

Single

def policy_methods
  :update
end

Multiple

def policy_methods
  [:update, :destroy]
end

Returns:

  • (Symbol, Array<Symbol>)


156
157
158
# File 'lib/api_presenter.rb', line 156

def policy_methods
  []
end

#preload(associations) ⇒ Object

Note:

Called by resolvers, but can also be called if additional data is required that does not need to be loaded as an included collection, and for some reason cannot be chained onto the original relation.

Preload additional records with the relation

Parameters:

  • associations (Symbol, Array<Symbol>)


117
118
119
# File 'lib/api_presenter.rb', line 117

def preload(associations)
  @relation = @relation.preload(associations)
end

#total_countInteger

Note:

Delegate to Kaminari’s ‘total_count` property, or regular count if not a paginated relation

Count of primary collection

Returns:

  • (Integer)


65
66
67
# File 'lib/api_presenter.rb', line 65

def total_count
  relation.respond_to?(:total_count) ? relation.total_count : relation.count
end