Class: IronAdmin::Adapters::Http

Inherits:
Base
  • Object
show all
Defined in:
lib/iron_admin/adapters/http.rb,
lib/iron_admin/adapters/http/query.rb,
lib/iron_admin/adapters/http/record.rb,
lib/iron_admin/adapters/http/connection.rb,
lib/iron_admin/adapters/http/model_proxy.rb,
lib/iron_admin/adapters/http/configuration.rb,
lib/iron_admin/adapters/http/type_inferrer.rb,
lib/iron_admin/adapters/http/column_descriptor.rb

Overview

HTTP REST API adapter — enables IronAdmin to manage resources from external REST APIs with convention-over-configuration.

Fields are auto-discovered from the first API response. Faraday is used as the HTTP transport (lazy loaded).

Examples:

Minimal resource configuration

class ProductResource < IronAdmin::Resource
  self.adapter_class = :http
  http_config do |c|
    c.base_url = "https://api.example.com/v1"
  end
end

Defined Under Namespace

Modules: TypeInferrer Classes: Configuration, Connection, ModelProxy, Query, Record

Constant Summary collapse

ColumnDescriptor =

Uses the shared ColumnDescriptor from Adapters::Base.

IronAdmin::Adapters::Base::ColumnDescriptor

Constants inherited from Base

Base::TRUTHY_VALUES

Instance Attribute Summary collapse

Attributes inherited from Base

#model_class

Instance Method Summary collapse

Methods inherited from Base

#cast_boolean, #create_record, #find_by_keys, #human_name, #initialize, #polymorphic_inverse_classes, #primary_key, #resource_name, #update_record

Constructor Details

This class inherits a constructor from IronAdmin::Adapters::Base

Instance Attribute Details

#http_config=(value) ⇒ Object

Allows injecting a pre-built configuration (for testing or per-resource override).



190
191
192
# File 'lib/iron_admin/adapters/http.rb', line 190

def http_config=(value)
  @http_config = value
end

Instance Method Details

#allObject

--- Query Building ---



61
62
63
# File 'lib/iron_admin/adapters/http.rb', line 61

def all
  Query.new(connection)
end

#association(_name) ⇒ Object



41
42
43
# File 'lib/iron_admin/adapters/http.rb', line 41

def association(_name)
  nil
end

#associations(_kind = nil) ⇒ Object



37
38
39
# File 'lib/iron_admin/adapters/http.rb', line 37

def associations(_kind = nil)
  []
end

#attachmentsObject



45
46
47
# File 'lib/iron_admin/adapters/http.rb', line 45

def attachments
  {}
end

#build(attrs = {}) ⇒ Object

--- CRUD ---



114
115
116
# File 'lib/iron_admin/adapters/http.rb', line 114

def build(attrs = {})
  Record.new(attrs.merge(_persisted: false))
end

#column_namesObject



25
26
27
# File 'lib/iron_admin/adapters/http.rb', line 25

def column_names
  discovered_columns.map(&:name)
end

#columnsObject

--- Schema Introspection ---



21
22
23
# File 'lib/iron_admin/adapters/http.rb', line 21

def columns
  discovered_columns
end

#count(scope = nil) ⇒ Object



98
99
100
# File 'lib/iron_admin/adapters/http.rb', line 98

def count(scope = nil)
  (scope || all).count
end

#destroy!(record) ⇒ Object



147
148
149
# File 'lib/iron_admin/adapters/http.rb', line 147

def destroy!(record)
  connection.delete(record.id.to_s)
end

#distinct_values(column) ⇒ Object



90
91
92
# File 'lib/iron_admin/adapters/http.rb', line 90

def distinct_values(column)
  all.pluck(column).compact.uniq.sort_by(&:to_s)
end

#enumsObject



33
34
35
# File 'lib/iron_admin/adapters/http.rb', line 33

def enums
  {}
end

#filter(scope, column, value) ⇒ Object



74
75
76
# File 'lib/iron_admin/adapters/http.rb', line 74

def filter(scope, column, value)
  scope.where(column => value)
end

#find(id) ⇒ Object



65
66
67
68
# File 'lib/iron_admin/adapters/http.rb', line 65

def find(id)
  data = connection.get_one(id.to_s)
  Record.new(data)
end

#find_by(attrs) ⇒ Object



70
71
72
# File 'lib/iron_admin/adapters/http.rb', line 70

def find_by(attrs)
  all.where(attrs).first
end

#find_each(scope) ⇒ Object

--- Batch ---



165
166
167
# File 'lib/iron_admin/adapters/http.rb', line 165

def find_each(scope, &)
  scope.each(&)
end

#has_column?(name) ⇒ Boolean

rubocop:disable Naming/PredicatePrefix

Returns:

  • (Boolean)


29
30
31
# File 'lib/iron_admin/adapters/http.rb', line 29

def has_column?(name) # rubocop:disable Naming/PredicatePrefix
  column_names.include?(name.to_s)
end

#limit(scope, max) ⇒ Object



82
83
84
# File 'lib/iron_admin/adapters/http.rb', line 82

def limit(scope, max)
  scope.limit(max)
end

#order_by(scope, column, direction) ⇒ Object



78
79
80
# File 'lib/iron_admin/adapters/http.rb', line 78

def order_by(scope, column, direction)
  scope.order(column => direction)
end

#pagy_methodObject



185
186
187
# File 'lib/iron_admin/adapters/http.rb', line 185

def pagy_method
  :pagy
end

#pluck(scope, column) ⇒ Object



94
95
96
# File 'lib/iron_admin/adapters/http.rb', line 94

def pluck(scope, column)
  scope.pluck(column)
end

#preload(scope, _association_names) ⇒ Object



86
87
88
# File 'lib/iron_admin/adapters/http.rb', line 86

def preload(scope, _association_names)
  scope
end

#query_builder_classObject



181
182
183
# File 'lib/iron_admin/adapters/http.rb', line 181

def query_builder_class
  IronAdmin::Filters::HttpQueryBuilder
end

#record_changes(record) ⇒ Object

--- Adapter-Agnostic Interface ---



171
172
173
# File 'lib/iron_admin/adapters/http.rb', line 171

def record_changes(record)
  record.previous_changes
end

#rich_text_attributesObject



49
50
51
# File 'lib/iron_admin/adapters/http.rb', line 49

def rich_text_attributes
  []
end

#save(record) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/iron_admin/adapters/http.rb', line 118

def save(record)
  if record.persisted?
    data = connection.patch(record.id.to_s, record.attributes.except("id"))
  else
    data = connection.post(record.attributes.except("id"))
    return add_api_errors(record, data) unless data.is_a?(Hash) && data["id"]
  end

  return add_api_errors(record, data) if data.is_a?(Hash) && data.key?("errors")

  record.assign_attributes(data) if data.is_a?(Hash)
  record.mark_as_persisted
  true
rescue IronAdmin::AdapterError
  false
end

#search_column(scope, column, query) ⇒ Object

--- Search ---



104
105
106
# File 'lib/iron_admin/adapters/http.rb', line 104

def search_column(scope, column, query)
  scope.where("search[#{column}]" => query)
end

#search_columns(scope, columns, query) ⇒ Object



108
109
110
# File 'lib/iron_admin/adapters/http.rb', line 108

def search_columns(scope, columns, query)
  scope.where(q: query, search_fields: columns.join(","))
end

#table_nameObject

--- Naming ---



55
56
57
# File 'lib/iron_admin/adapters/http.rb', line 55

def table_name
  nil
end

#transactionObject

--- Transactions ---



153
154
155
# File 'lib/iron_admin/adapters/http.rb', line 153

def transaction
  yield
end

#unscope_column(scope, _column) ⇒ Object

--- Scope Manipulation ---



159
160
161
# File 'lib/iron_admin/adapters/http.rb', line 159

def unscope_column(scope, _column)
  scope
end

#update(record, attrs) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
# File 'lib/iron_admin/adapters/http.rb', line 135

def update(record, attrs)
  data = connection.patch(record.id.to_s, attrs)
  return add_api_errors(record, data) if data.is_a?(Hash) && data.key?("errors")

  record.assign_attributes(attrs)
  record.assign_attributes(data) if data.is_a?(Hash)
  record.mark_as_persisted
  true
rescue IronAdmin::AdapterError
  false
end

#wrap_rollbackObject



175
176
177
178
179
# File 'lib/iron_admin/adapters/http.rb', line 175

def wrap_rollback
  yield
rescue IronAdmin::Rollback
  nil
end